对@Primary理解
起因是使用JPA时配置了多个数据源,有此不理解的地方,如下
猜测,系统在配置中用到了entityManagerFactoryBeanOne,需要注入一个,但在系统完全启动后,根据entityManagerFactoryBeanOne entityManagerFactoryBeanTwo上的注解,可以正确匹配数据源,所以@Primary只是让系统知道如果存在多个相同类型的bean时,自动选择哪一个。系统启动完毕后,根据各自的注解知道在使用哪个bean。
以下是别人的文章。
在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。下面是个简单的使用例子。有如下一个接口:
@Component // 加注解,让spring识别
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}
@Component
public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
注入
@Component
public class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;public String sing(){return singer.sing("song lyrics");}
}
一个错误的结果或异常:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [main.service.Singer] is defined: expected single matching bean but found 2: metalSinger,operaSinger,提示很明确了,spring 根据类型无法选择到底注入哪一个。这个时候@Primay 可以登场了。
一、用@Primary注解来解决问题
将其中一个实现类添加注解@Primary
@Primary
@Component
public class OperaSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
再次运行,结果如下:
“I am singing in Bocelli voice: song lyrics”, 用@Primary 告诉spring 在犹豫的时候优先选择哪一个具体的实现。
二、用@Qualifier注解来解决问题
将上面的两个类改为如下:
@Component // 加注解,让spring识别
@Qualifier("metalSinger")
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}@Component
@Qualifier("opreaSinger")
public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
@Component
public class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;@Qualifier("opreaSinger")public String sing(){return singer.sing("song lyrics");}
}
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用
@Entity(name="xxx") name属性指定数据库中的表名,如没有name则默认表名与实体类同名,默认为 SnakeCaseStrategy(命名策略 )为表名
Spring中常用的注解(@Entity,@Table,@Column,@Repository,@Service)
这里简单介绍Hibernate的Annotation注解
一、声明实体
@Entity
对实体注释。任何Hibernate映射对象都要有这个注释
@Table
声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),目录(Catalog)和schema的名字。该注释不是必须的,如果没有则系统使用默认值(实体的短类名)。
@Version
该注释可用于在实体Bean中添加乐观锁支持。
二、声明主键
@Id
声明此属性为主键。该属性值可以通过应该自身创建,但是Hibernate推荐通过Hibernate生成
@GeneratedValue
指定主键的生成策略。有如下四个值
TABLE:使用表保存id值
IDENTITY:identitycolumn
SEQUENCR :sequence
AUTO:根据数据库的不同使用上面三个
三、声明普通属性
@Column
声明该属性与数据库字段的映射关系。
1 @Column(nam=”category_name” length=20)
2 Public void getCategoryName(){
3 Return this.categoryName;
4 }
注意:
1、 当POJO有属性不需要映射的时候一定要用@Transitent修饰,该注释表示此属性与表没有映射关系,只是一个暂时的属性。
2、 @Lob注释表示该属性持久化为Blob或者Clob类型,具体取决于属性的类型。
四、声明关联关系
一对多关联关系
@OneToMany(mappedBy=” person”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
一对多声明
@ManyToOne(cascade=CascadeType.REFRESH,)
@JoinColumn
多对一声明 ,声明为双向关联
一对一关联关系
@OneToOne(optional= true,cascade =CascadeType.ALL, mappedBy = “person”)
一对一关联声明
@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true)
声明为双向关联
多对多关联关系
@ManyToMany(mappedBy= “students”)
多对多关联声明。
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = “Teacher_Student”,
joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName =“teacherid”)},
inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName =“studentid”)})
对@Primary理解相关推荐
- 主外键constraint、primary key、foreign key、check、default的用法和理解
alter table table_6 --向已存在的table_6这个表中再添加字段jj\oo\kk这3个字段 add jj varchar(50),oo int,kk int select *fr ...
- 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第六章 深入理解wi-Fi Simple Configuration...
为什么80%的码农都做不了架构师?>>> 首先感谢各位兄弟姐妹们的耐心等待.本书预计在4月上市发售.从今天开始,我将在博客中连载此书的一些内容.注意,此处连载的是未经出版社编辑 ...
- 理解透彻--802.1d,802.1w,802.1s与802.1q
原文链接:http://blog.sina.com.cn/s/blog_9950926401018bj6.html 照片之类的就在原文链接里面看吧.这里就不复制啦. 算啦,我先简要总结一下: STP( ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因...
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- 万字长文,理解Elasticsearch和面试总结
作者:dunwu 来源:dunwu.github.io/db-tutorial/nosql/elasticsearch/elasticsearch-interview.html 集群部署 ES 部署情 ...
- SQL Server执行计划的理解
要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. ...
- 谈谈对分布式事务的一点理解和解决方案
点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 前提 最近,工作中要为现在的老系统做拆分和升级,刚好遇到了分布式事务.幂等控制.异步消息乱序和补偿方案等问题,刚好基于实践结合个人的看法记 ...
- memcached全面剖析–2.理解memcached的内存存储
版权声明:可以任意转载,但转载时必须标明原作者charlee.原始链接http://tech.idv2.com/2008/07/11/memcached-002/以及本声明 下面是<memcac ...
- (DML触发器)如何正确理解触发器的deleted表和inserted表(转)
在触发器的设计当中,有很多的同学总是不了解怎样善用触发器来解决问题,其实问题在于他们不理解触发器最重要的两个表:inserted表和deleted表,假如你理解这两表的话,许多关于的触发器的问题就迎刃 ...
最新文章
- 049_Image图片
- 抢滩“体验经济”,“真快乐”布局娱乐化零售的野心
- 基础功能-tensorflow使用gpu
- 如何用Pygame写游戏(二十一)
- mysql mysql中的索引
- linux初次入门学习小结
- Linux的压缩相关命令(转载)
- 测者的测试技术手册:AI的自动化单元测试
- C语言自学笔记(16)
- 8个免费和最佳开源视频流服务器软件
- 《圈子圈套3》读后感
- Android 仿微信/支付宝 字体大小 调整控件
- 处理打开网站出现网站的安全证书有问题的方法
- 第三方推广——《互联网运营的知识体系与整体逻辑》笔记(十二)
- hdu5879 Cure( 1/(n^2)的快速收敛性质)
- 8.23 正点原子领航者V1开发板学习之EEPROM
- 【Eclipse使用技巧】格式化代码的方法 + 解决注释是繁体字的方法
- 市场模式缭乱,合适的模式脱颖而出?众筹卖货模式在线分享分析
- linux socket 编程
- 用textpad使abaqus(inp).fortran,python 代码语法加量
热门文章
- AppleXml.Framework(02)-通过框架搭建Demo环境
- Windows AD域下批量分发安装软件
- 微信人工客服转服务电话号码呢?
- 第1章 Java程序设计概述
- 计算机中的光学知识,科学网—光学基础知识大讲堂 ——第3期:详解电磁辐射 - 何卓铭的博文...
- React Native关于使用CameraRoll出现的问题@react-native-camera-roll/camera-roll@react-native-community/cameraro
- 技术科普丨4Cell1感光芯片的应用
- 麦麦题全网独家最全题库每日更新数据
- 长春理工计算机学院保研外校,长春理工大学174被保研:近7成保研985高校,还有清华、北大……...
- time gmtime localtime strftime 时间函数