《深入浅出Spring》Spring注解(@Autowired、@Resource、@Primary、@Qulifier)

本文详细介绍了Spring框架中的注解使用,包括@Autowired的多种注入方式,如构造器、方法、字段、参数等,并讲解了其查找候选者的规则。同时,解释了@Resource注解的注入逻辑,@Qualifier如何限定注入的bean,以及@Primary设置主要候选者。此外,还探讨了@Bean注解定义bean时注入依赖的几种方式和泛型注入的使用。

@Autowired:注入依赖对象

实现依赖注入,spring容器会对bean中所有字段、方法进行遍历,标注有@Autowired注解的,都会进行注入

源码:

@Target({
   
   ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
   
   
    /**
     * Declares whether the annotated dependency is required.
     * <p>Defaults to {@code true}.
     */
    boolean required() default true;
}

可以用在构造器、方法、方法参数、字段、注解上。
参数:
required:标注的对象是否必须注入,可能这个对象在容器中不存在,如果为true的时候,找不到匹配的候选者就会报错,为false的时候,找不到也没关系 。

  • 将指定类型的所有bean注入到Collection中
    如果被注入的对象是Collection类型的,可以指定泛型的类型,然后会按照上面的方式查找所有满足泛型类型所有的bean

  • 将指定类型的所有bean注入到Map中
    如果被注入的对象是Map类型的,可以指定泛型的类型,key通常为String类型,value为需要查找的bean的类型,然后会按照上面方式查找所有注入value类型的bean,将bean的name作为key,bean对象作为value,放在HashMap中,然后注入。

@Autowired查找候选者可以简化为下面这样

按类型找->通过限定符@Qualifier过滤->@Primary->@Priority->根据名称找(字段名称或者参数名称)

@Autowired标注在构造器上,通过构造器注入依赖对象

在Service2有参有参构造器上面加上@Autowired注解,如下:

@Component
public class Service2 {
   
   
    private Service1 service1;
    public Service2() {
   
    //@1
        System.out.println(this.getClass() + "无参构造器");
    }
    @Autowired
    public Service2(Service1 service1) {
   
    //@2
        System.out.println(this.getClass() + "有参构造器");
        this.service1 = service1;
    }
    @Override
    public String toString() {
   
    //@2
        return "Service2{" +
                "service1=" + service1 +
                '}';
    }
}

@1:方法上标注了@Autowired,spring容器会调用这个方法,从容器中查找Service1类型的bean,然后注入

@Autowired标注在方法上,通过方法注入依赖的对象

 @Component
public class Service2 {
   
   
    private Service1 service1;
    @Autowired
    public void injectService1(Service1 service1) {
   
    //@1
        System.out.println(this.getClass().getName() + ".injectService1()");
        this.service1 = service1;
    }
    @Override
    public String toString() {
   
   
        return "Service2{" +
                "service1=" + service1 +
                '}';
    }
}

@1:方法上标注了@Autowired,spring容器会调用这个方法,从容器中查找Service1类型的bean,然后注入

@Autowired标注在setter方法上,通过setter方法注入

@Component
public class Service2 {
   
   
    private Service1 service1;
    @Autowired
    public void setService1(Service1 service1) {
   
    //@1
        System.out.println(this.getClass().getName() + ".setService1方法");
        this.service1 = service1;
    }
    @Override
    public String toString() {
   
   
        return "Service2{" +
                "service1=" + service1 +
                '}';
    }
}

@1:标准的set方法,方法上使用了 @Autowired,会通过这个方法注入Service1类型的bean对象。

@Autowired标注在方法参数上

@Component
public class Service2 {
   
   
    private Service1 service1;
    @Autowired
    public void injectService1(Service1 service1, String name) {
   
    //@1
        System.out.println(String.format("%s.injectService1(),{service1=%s,name=%s}", this.getClass().getName(), service1, name));
        this.service1 = service1;
    }
    @Override
    public String toString() {
   
   
        return "Service2{" +
                "service1=" + service1 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值