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