起因是使用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理解相关推荐

  1. 主外键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 ...

  2. 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第六章 深入理解wi-Fi Simple Configuration...

    为什么80%的码农都做不了架构师?>>>    首先感谢各位兄弟姐妹们的耐心等待.本书预计在4月上市发售.从今天开始,我将在博客中连载此书的一些内容.注意,此处连载的是未经出版社编辑 ...

  3. 理解透彻--802.1d,802.1w,802.1s与802.1q

    原文链接:http://blog.sina.com.cn/s/blog_9950926401018bj6.html 照片之类的就在原文链接里面看吧.这里就不复制啦. 算啦,我先简要总结一下: STP( ...

  4. SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因...

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  5. 万字长文,理解Elasticsearch和面试总结

    作者:dunwu 来源:dunwu.github.io/db-tutorial/nosql/elasticsearch/elasticsearch-interview.html 集群部署 ES 部署情 ...

  6. SQL Server执行计划的理解

    要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. ...

  7. 谈谈对分布式事务的一点理解和解决方案

    点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 前提 最近,工作中要为现在的老系统做拆分和升级,刚好遇到了分布式事务.幂等控制.异步消息乱序和补偿方案等问题,刚好基于实践结合个人的看法记 ...

  8. memcached全面剖析–2.理解memcached的内存存储

    版权声明:可以任意转载,但转载时必须标明原作者charlee.原始链接http://tech.idv2.com/2008/07/11/memcached-002/以及本声明 下面是<memcac ...

  9. (DML触发器)如何正确理解触发器的deleted表和inserted表(转)

    在触发器的设计当中,有很多的同学总是不了解怎样善用触发器来解决问题,其实问题在于他们不理解触发器最重要的两个表:inserted表和deleted表,假如你理解这两表的话,许多关于的触发器的问题就迎刃 ...

最新文章

  1. 049_Image图片
  2. 抢滩“体验经济”,“真快乐”布局娱乐化零售的野心
  3. 基础功能-tensorflow使用gpu
  4. 如何用Pygame写游戏(二十一)
  5. mysql mysql中的索引
  6. linux初次入门学习小结
  7. Linux的压缩相关命令(转载)
  8. 测者的测试技术手册:AI的自动化单元测试
  9. C语言自学笔记(16)
  10. 8个免费和最佳开源视频流服务器软件
  11. 《圈子圈套3》读后感
  12. Android 仿微信/支付宝 字体大小 调整控件
  13. 处理打开网站出现网站的安全证书有问题的方法
  14. 第三方推广——《互联网运营的知识体系与整体逻辑》笔记(十二)
  15. hdu5879 Cure( 1/(n^2)的快速收敛性质)
  16. 8.23 正点原子领航者V1开发板学习之EEPROM
  17. 【Eclipse使用技巧】格式化代码的方法 + 解决注释是繁体字的方法
  18. 市场模式缭乱,合适的模式脱颖而出?众筹卖货模式在线分享分析
  19. linux socket 编程
  20. 用textpad使abaqus(inp).fortran,python 代码语法加量

热门文章

  1. AppleXml.Framework(02)-通过框架搭建Demo环境
  2. Windows AD域下批量分发安装软件
  3. 微信人工客服转服务电话号码呢?
  4. 第1章 Java程序设计概述
  5. 计算机中的光学知识,科学网—光学基础知识大讲堂 ——第3期:详解电磁辐射 - 何卓铭的博文...
  6. React Native关于使用CameraRoll出现的问题@react-native-camera-roll/camera-roll@react-native-community/cameraro
  7. 技术科普丨4Cell1感光芯片的应用
  8. 麦麦题全网独家最全题库每日更新数据
  9. 长春理工计算机学院保研外校,长春理工大学174被保研:近7成保研985高校,还有清华、北大……...
  10. time gmtime localtime strftime 时间函数