精华内容
下载资源
问答
  • spring @Primary-在spring中的使用

    万次阅读 多人点赞 2017-12-18 15:08:05
    但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。下面是个简单的使用例子。有如下一个接口public interface Singer { String sing(String ...

    在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。下面是个简单的使用例子。

    有如下一个接口

    public interface Singer {
        String sing(String lyrics);
    }
    

    有下面的两个实现类:

    @Component // 加注解,让spring识别
    public class MetalSinger implements Singer{
    
        @Override
        public String sing(String lyrics) {
            return "I am singing with DIO voice: "+lyrics;
        }
    }
    

    //注意,这里没有注解

    public class OperaSinger implements Singer {
        @Override
        public 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);
        @Autowired
        private Singer singer;
        public String sing(){
            return singer.sing("song lyrics");
        }
       }
    

    I am singing with DIO voice: song lyrics. 原因很简单,就是 OperaSinger 这个类上面根本没有加上注解@Copmonent 或者 @Service, 所以spring 注入的时候,只能找到 MetalSinger 这个实现类. 所以才有这个结果。

    但是如果一旦 OperaSinger 这个类加上了@Copmonent 或者 @Service 注解,有趣的事情就会发生,你会发现一个错误的结果或异常:
    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
    @Component
    public class OperaSinger implements Singer{
    
        @Override
        public String sing(String lyrics) {
            return "I am singing in Bocelli voice: "+lyrics;
        }
    }
    

    如果代码改成这样,再次运行,结果如下:
    “I am singing in Bocelli voice: song lyrics”, 用@Primary 告诉spring 在犹豫的时候优先选择哪一个具体的实现。

    二、用@Qualifier这个注解来解决问题

    将上面的两个类改为如下:

    @Component("metalSinger") // 加注解,让spring识别
    public class MetalSinger implements Singer{
    
        @Override
        public String sing(String lyrics) {
            return "I am singing with DIO voice: "+lyrics;
        }
    }
    
    @Component("opreaSinger")
    public class OperaSinger implements Singer {
        @Override
        public 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);
    
        @Autowired
        @Qualifier("opreaSinger")
        private Singer singer;
    
        public String sing(){
            return singer.sing("song lyrics");
        }
    }
    

    扩展:Spring注解常用汇总

    使用注解之前要开启自动扫描功能

    其中base-package为需要扫描的包(含子包)

    <context:component-scan base-package=“cn.test”/>
    @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”) 存在多个实例配合使用

    展开全文
  • @Primary

    2020-05-13 23:48:06
    @Autowired private MediaService mediaService; @Primary @Service public class MediaServiceImpl implements MediaService ...@Primary is an effective way to use autowiring by type with se.
     @Autowired
     private MediaService mediaService;
    
    
     @Primary
     @Service
    public class MediaServiceImpl implements MediaService 
    

    service有多个实现类的时候,注入的时候需要按照@Qualifier() 注入,
    加了@Primary 可以实现一个默认的注入类

    @Primary is an effective way to use autowiring by type with several instances when one primary candidate can be determined. When you need more control over the selection process, you can use Spring’s @Qualifier annotation. You can associate qualifier values with specific arguments, narrowing the set of type matches so that a specific bean is chosen for each argument. In the simplest case, this can be a plain descriptive value, as shown in the following example:

    展开全文
  • 主要介绍了Spring @Primary和@Qualifier注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • @Primary注解使用

    千次阅读 2020-01-21 13:54:10
    当一个方法有多个实现类时,在方法中注入了多个,@primary可以指定注入哪一个。 @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常 @Autowired 默认按类型装配,...

    当一个方法有多个实现类时,在方法中注入了多个,@primary可以指定注入哪一个。
    @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
    @Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用
    @Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用

    展开全文
  • spring注解 @primary

    千次阅读 2018-07-26 17:16:56
    @Primary:意思是在众多相同的bean中,优先使用用@Primary注解的bean。 1.在多数据源的时候,使用@Primary注解用于指定其中一个作为主数据源,即如果数据库操作没有指明使用哪个数据源的时候,默认使用主数据源,这...

    @Primary:意思是在众多相同的bean中,优先使用用@Primary注解的bean。

    1.在多数据源的时候,使用@Primary注解用于指定其中一个作为主数据源,即如果数据库操作没有指明使用哪个数据源的时候,默认使用主数据源,这个时候我们就使用到了@primary这个注解。

    在此之前先认识一下@Qualifier、@Bean注解的意思:

    @Qualifier:指定某个bean有没有资格进行注入。

    @Bean:用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。

    在项目中的使用:

    @Configuration
    @MapperScan(basePackages = "com.dunoinfo.jsqxt.estimate.algorithm.repository.oracle", sqlSessionTemplateRef = "oracleSemiSqlSessionTemplate")
    public class DruidConfig {
        private Logger logger = LoggerFactory.getLogger(DruidConfig.class);
    
        @Bean(name = "oracleSemiDataSource")     //声明其为Bean实例
        @ConfigurationProperties("spring.datasource.druid")
        @Primary  //在同样的DataSource中,首先使用被标注的DataSource
        public DataSource dataSource() {
            return DruidDataSourceBuilder.create().build();
        }
    
        @Bean(name = "oracleSemiSqlSessionFactory")
        @Primary
        public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleSemiDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/oracle/semi/*.xml"));
            return bean.getObject();
        }
    
        @Bean(name = "oracleSemiSqlSessionTemplate")
        @Primary
        public SqlSessionTemplate oracleSqlSessionTemplate(@Qualifier("oracleSemiSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }

    2.当对同一个接口可能会有几种不同的实现类时,默认情况下只会采用其中的一种情况,使用@Primary注解来进行声明优先选择哪一个。

    如下面的一个小例子:

    先定义一个Person接口,有一个Study方法:

    public interface Person {
        public void study(String subject);
    }

    再给此接口定义两个子类,其中一个加@Component注解进行声明,将其实例化到spring容器中;另一个子类不加注解:

    @Component
    public class StudentLi implements Person{
        @Override
        public void study(String subject) {
            System.out.println("I'm Li Lei. I'm learning "+subject);
        }
    }
    public class StudentHan implements Person{
        @Override
        public void study(String subject) {
            System.out.println("I'm Han Meimei. I'm learning "+subject);
        }
    }

    注入接口实现类进行测试:

    @Controller
    @RequestMapping(value = "/primary")
    public class TestPrimary {
        @Autowired
        private Person person;
    
        @RequestMapping(value = "test", method = RequestMethod.GET)
        @ResponseBody
        public void Test(){
            person.study("Chinese");
        }
    }

    输出结果:I'm Li Lei. I'm learning Chinese

    这个结果毫无疑问,因为StudentHan.java这个实现类没有加@Component注解,无法被加入到spring容器,下面对该实现类添加@Component注解,再进行测试。运行时程序出现异常,由于我们有两个实现类,spring无法确定注入哪一个。

     

    在StudentHan.java实现类上添加@Primary注解进行声明,再进行测试。

    @Primary
    @Component
    public class StudentHan implements Person{
        @Override
        public void study(String subject) {
            System.out.println("I'm Han Meimei. I'm learning "+subject);
        }
    }

    输出结果:I'm Han Meimei. I'm learning Chinese

     

    展开全文
  • Spring @Primary注解

    2020-10-21 23:57:33
    同一个接口,有几种不同的实现类Bean,使用@Primary标注的实现类Bean可以被优先获取; 同一个接口,有几种不同的实现类Bean,其他类在引用时如果没有唯一指定(@Primary或者@Qualifier都可以进行唯一指定),那么将...
  • spring中少用的注解@primary解析.pdf
  •   当一个接口有多个不同实现时,注入Spring的时候会产生org....  解决方式有2种,使用@Primary 和 @Qualifier注解。 注解 区别 @Primary 优先注入该注解的标注的bean @Qualifier 确定注入该注解标定的...
  • 文章目录@Autowire/@Qualifier/@Primary/@Value一、@Value赋值二、依赖注入2.1 @Autowire2.2 @Resource(JSR250)2.3 @Inject(JSR330)2.4 @Qualifier三、bean修饰@Primary四、对比4.1 表格对比4.2 注意 @Autowire/@...
  • @Primary:在众多相同的Bean中,优先使用@Primary注解的Bean。 这个和@Qualifier有点区别,@Qualifier指的是使用哪个Bean进行注入。
  • Spring框架中的@Qualifier注解和@primary注解,它解决了哪些问题,以及如何使用它。我们还将了解它与@Primary注解的不同之处。 2. 痛点 使用@Autowired注解是Spring依赖注入的绝好方法。但是有些场景下仅仅靠这个...
  • Spring @Primary 注解,指定主要实现

    千次阅读 2018-11-26 09:51:37
    Spring @Primary 注解,指定主要实现,一个接口有多个实现时,只引入接口时,可以spring 可以直接引入@Primary 注解的实现 举例: 这样尽管一个接口有多个实现,只要其中一个service 上注解了@Primary 注解,这样在其他类...
  • @Primary注解的作用

    千次阅读 2020-02-13 14:19:46
    同一个借口可能有很多实现类,但bean一定要区分开来,@Primary注解的作用其实就是相当于默认值,在众多实现类中给他一个这样的注解就会在不指定调用哪个bean类时会默认调用有这个注解的方法。 当然如果一个接口被多...
  • 对@Primary理解

    2021-01-09 10:24:14
    但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。下面是个简单的使用例子。有如下一个接口: @Component // 加注解,让spring识别 public ...
  • 利用@Primary和@Qualifier。 使用接口来编写一些操作类,是spring所推荐的,他可以将定义和实现相分离,这样更灵活。 歧义性的产生是因为接口的实现方式,因为接口有多个实现类。这样在自动装配时不知道找哪一个...
  • Spring注解@Primary作用

    2019-11-15 16:46:30
    通过@Autowired注解可以将Spring Bean注入。 如果注入的是一个接口,那么我们实际上用的是它的实现类。 如果一个接口有多个实现类...这个时候我们为某个实现类加上@Primary注解,则Spring就会优先注入这个实现类。 ...
  • Spring --@Primary注解

    千次阅读 2019-03-13 11:51:08
    1.问题 当一个接口有2个不同实现时,使用@Autowired注解时会报org.springframework.beans.factory.NoUniqueBeanDefinitionException异常信息 ...Primary可以理解为默认优先选择,同时不可以同时设置多个,...
  • 首先解释一下@Primary和@Qualifier这两个注解的意思:@Primary的意思是在众多相同的bean中,优先使用用@Primary注解的bean.而@Qualifier这个注解则指定某个bean有没有资格进行注入。   示例代码的思路是:1.一个...
  • @Qualifier和@Primary都是属于spring框架下的注解,@Priority属于javax.annotation,JSR250规范。 @Primary官方文档的大概意思是,如果在自动注入的多个候选bean中,有一个primary bean的话,那么这个bean就会是自动...
  • Sprint Boot————@Qualifier、@Primary

    千次阅读 2018-10-31 19:06:07
    引言 使用@Autowired自动注入时: 如果注入的接口有多个实现类,如下所示: ... 异常的描述信息非常简单,就是告诉开发者,自动注入的地方需要一个Bean,而...Action(可以采取的行动): 考虑使用@Primary注解...
  • SpringBoot源码解析(七)@Primary

    千次阅读 2018-07-24 21:34:09
    在SpringBoot中有许多类使用到了@Primary注解,关于用法,请看这篇博客:在spring中常被忽视的注解 @Primary。 这次我们不说用法,从源码层面来看下: 一、入口 在创建bean的时候,我们会获取bean的依赖bean,这...
  • spring 注解@primary解析

    千次阅读 2017-04-14 22:51:43
    文章引自:http://jackyrong.iteye.com/blog/2208000spring中少见的注解@primary注解,例子 @Component public class MetalSinger implements Singer{ @Override public String sing(String lyrics) { return
  • 本篇内容主要是讲解2个重要的注解使用方式和场景,@Primary,@Qualifier注解;其作用就是消除bean注入时的歧义,能够让spring容器知道加载哪个bean; 知识追寻者(Inheriting the spirit of open source, Spreading ...
  • 由于在开发中多个地方使用了service层中的接口,所以对要使用的实现类需要标明,要不然会注入失败,而@Primary的功能就是为此: @Service @Primary public class TranServiceImpl implements TranService { } 因为...
  • apring中@Primary和@Qualifier注解的区别

    千次阅读 2017-10-23 09:22:09
    @Primary:在众多相同的bean中,优先选择用@Primary注解的bean(该注解加在各个bean上) @Qualifier:在众多相同的bean中,@Qualifier指定需要注入的bean(该注解跟随在@Autowired后) 下面一个小例子: ...
  • 1.问题 当一个接口有2个不同实现时,使用@Autowired注解时会报org.springframework.beans.factory.NoUniqueBeanDefinitionException异常信息 2.方案1-@Qualifier ...Primary可以理解为默认优先选择,同时不可以同...
  • @Primary 标签的使用

    2018-07-12 09:33:00
    其实@Primary注解的实例优先于其他实例被注入。 第一个方法是默认的数据源,所以默认优先注入 转载于:https://www.cnblogs.com/mfser/p/9297861.html...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 805,739
精华内容 322,295
关键字:

@primary