Spring笔记-自动装配注解

发布于 2020-02-07  240 次阅读


分别是@Primary,@Autowired,@Qualifier,@Resource,@Inject,下面依次介绍

@Autowired

  • @Autowired是Spring自带的注解,通过AutowiredAnnotationBeanPostProcessor类实现的依赖注入
  • @Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier
  • @Autowired有个属性为required,默认值为true,可以配置为false,如果配置为false之后,当没有找到相应bean的时候,系统不会抛错
  • @Autowired可以作用在变量、setter方法、构造函数上
@Component
public class Animal {
    //直接注解于变量
    @Autowired
    private Dog dog;
    
    public Animal() {
    }
    //注解于构造函数 idea提示推荐方式
    @Autowired
    public Animal(  Dog dog) {
        this.dog = dog;
        System.out.println("-----------Animal => dog = " + dog);
    }
    //注解于setter
    @Autowired
    public void setDog(Dog dog) {
        this.dog = dog;
        System.out.println("-----------setDog => dog = " + dog);
    }
}

@Qualifier

  • @Qualifier配合@Autowired,可以指定装配的bean名称
@Component("Dog1")
public class Dog extends Animal {
    private String Name;
    public Dog() {
        this.Name = "小黑";
    }
    //....getter/setter
}

@Component
public class Animal {
    @Autowired
    @Qualifier("Dog1") //指定名称
    private Dog dog;

    public Animal() {
    }
    //....getter/setter
}

@Inject

  • @Inject是JSR330规范中的注解,和@Autowired用法差不多
  • @Inject可作用在变量、setter方法、构造函数上并且@Qualifier,@Primary对它也同样有效
  • @Inject使用需要导入javax.inject
<dependency>
   <groupId>javax.inject</groupId>
   <artifactId>javax.inject</artifactId>
   <version>1</version>
</dependency>
@Component
public class Animal {
    //直接注解于变量
    @Inject
    private Dog dog;    

    public Animal() {
    }
    //注解于构造函数 idea提示推荐方式
    @Inject
    public Animal(  Dog dog) {
        this.dog = dog;
        System.out.println("-----------Animal => dog = " + dog);
    }
    //注解于setter
    @Inject
    public void setDog(Dog dog) {
        this.dog = dog;
        System.out.println("-----------setDog => dog = " + dog);
    }
}

@Resource

  • @Resource是JSR250规范中的注解,参数为bean的名称
@Component
public class Animal {
    @Resource(name = "Dog1")
    private Dog dog;
    public Animal() {
    }
}

@Primary

  • @Primary当一个接口有多个实现类,你想让自动装配时优先选择某个实现类,在这个类上面加上该注解即可
@Component
public class Animal {
    @Autowired
    private Animal animal;    //因为Cat类上面有@Primary 所以优先选择Cat
    public Animal() {
    }
    private String name;
    public String getName() {
        return name;
    }
}

@Primary  //优先选择Cat
@Component("Cat1")
public class Cat extends Animal {
     public Cat() {
        this.setName("小白");
    }
}

@Component("Dog1")
public class Dog extends Animal {
    public Dog() {
        this.setName("小黑");
    }
}

常见注解

  • @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”) 存在多个实例配合使用


LoneKing