Spring注解学习_自动装配1_@Autowired&@Qualifier&@Primary

  1. @Autowired自动注入
    1. 方法、构造器上标注@Autowired实现自动装配
    2. @Bean标注的方法创建对象时,方法参数的值从容器中获取
  2. @Qualifier
  3. @Primary

自动装配:Spring利用依赖注入,完成对IOC容器中各个组件的依赖关系赋值;

@Autowired自动注入

  • 1️⃣ 默认优先按照类型去容器中找对应的组件,找到就为标注的属性赋值
  • 2️⃣ 如果找到了多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
  • 注意:
    • 默认情况下,一定要在容器中有该组件的情况下才能自动装配,否则就会报错
    • 如果我们容器中没有对应组件时不进行装配,应写:@Autowired( required=false )

验证:

BookDao:

@Repository
public class BookDao {
    private String label="1";
    public String getLabel() {
        return label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
    @Override
    public String toString() {
        return "BookDao{" +
                "label='" + label + '\'' +
                '}';
    }
}

BookService:

@Service
public class BookService {
    @Autowired
    private BookDao bookDao;	//自动装配

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao +
                '}';
    }
}

配置类:除了ComponentScan将扫描到BookDao(Bean name默认为首字母小写:bookDao)外,我们另外注入名为bookDao2的Bean,看最终Autowired究竟会装配哪一个

@Configuration
@ComponentScan({"com.study.service","com.study.controller","com.study.dao"})
public class MainConfigOfAutowired {
    //除了ComponentScan将扫描到BookDao外,我们另外注入名为bookDao2的Bean,看最终Autowired究竟会装配哪一个
    @Bean("bookDao2")
    public BookDao bookDao(){
        BookDao bookDao=new BookDao();
        bookDao.setLabel("2");
        return bookDao;
    }
}

测试

public class IOCTest_Autowired {
    @Test
    public void test1(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
        BookService bookService = context.getBean(BookService.class);
        System.out.println(bookService);
    }
}

image-20200403012633248

那我们吧@Autowired标注的BookDao属性名改一改,改成bookDao2看看:

BookService:

@Service
public class BookService {
    @Autowired
    private BookDao bookDao2;
    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao2 +
                '}';
    }
}

结果:

image-20200403013128275

得证:​结论2️⃣ 成立

方法、构造器上标注@Autowired实现自动装配

除了在类属性上标注实现自动装配外,@Autowired 还可以标注在方法、构造器上方及它们的参数中,以从容器获取参数组件的值。

  • 标在方法位置

    public class Color {
        private Car car;
    
        public Car getCar() {
            return car;
        }
    
        @Autowired
        public void setCar(Car car) {
            this.car = car;
        }
    }
    
  • 标在构造器上。如果当前类只有一个有参构造器,@Autowired可以省略,参数位置对应的组件还是能被自动装配。

    @Component
    @Data
    public class Boss {
        private Car car;
        
        @Autowired		//Car将从容器中获取,此注解也可以省略
        public Boss(Car car){
            this.car=car;
            System.out.println("Boss有参构造器");
        }
    }
    
  • 标注在方法参数位置

@Bean标注的方法创建对象时,方法参数的值从容器中获取

@Configuration
@Import(Car.class)
MainConfigOfAutowired{
    
    @Bean
    public Color color(Car car){
        Color color=new Color();
        color.setCar(car);		//此Car实例将从容器中获取
        return new Color();
    }
}

@Qualifier

  • @Qualifier明确指定需要装配的Bean的ID

验证:

BookService:

@Service
public class BookService {
    @Qualifier("bookDao")
    @Autowired
    private BookDao bookDao2;
    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao2 +
                '}';
    }
}

同刚才测试用例,测试得结果:

image-20200403014312057

BookService:

@Service
public class BookService {
    @Qualifier("bookDao2")
    @Autowired
    private BookDao bookDao2;
    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao2 +
                '}';
    }
}

同刚才测试用例,测试得结果:

image-20200403014359736

@Primary

  • 标注有@Primary的Bean将成为Spring进行自动装配时的默认首选Bean

  • 标注有@Primary的Bean类不能同时标注@Qualifier

基本用不到,实际命名时不应模糊不清。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com

文章标题:Spring注解学习_自动装配1_@Autowired&@Qualifier&@Primary

文章字数:782

本文作者:梅罢葛

发布时间:2020-04-03, 00:06:03

最后更新:2020-04-03, 15:51:08

原始链接:https://qiurungeng.github.io/2020/04/03/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D1-Autowired-Qualifier-Primary/
目录
×

喜欢就点赞,疼爱就打赏