对于Bean对象的注入
1.可以采用手写方式(在IOC中取id,标明class,给类中的属性挨个赋值)写入IOC容器。可以参考这篇博客
2.也可以采用三层注解加扫描器的方式注入。
对于Bean中的属性值
1.可以在将对象纳入IOC容器时,直接手写可以参考这篇博客
2.采用注解方式自动注入,下面就正式进入本文的正片了
一、@Autowired + [@Qualifier]注解方式
@Autowired (Spring) ,默认根据类型,配合@Qualifier即可根据id注入。
下面是@Autowired可以写的地方:
以下情况中存在一个B类:
Public class B{
....
}
1.类的属性上面
假设B类在IOC容器中仅存在一个实例
@Component("a")
public class A{
@Autowired
private B b;//B指的是类
public B getB(){
return b;
}
}
则下面的代码可以取得b
public class test{
public static void main(String[] args){
...
A a = (A)context.getBean("a");
System.out.println(a.getB());
...
}
}
假设B类在IOC容器中存在多个实例:
比如一个实例的id=b1,另一个实例的id=b2
这个时候只使用@Autowired注解会报错,下面是正确的使用方法:
或者可以考虑使用使用@primary注解
@Component("a")
public class A{
@Qualifier("b1")
@Autowired
private B b;//B指的是类
public B getB(){
return b;
}
}
注:该注入不依赖构造器和构造方法
2.属性的set方法上面
@Component("a")
public class A{
private B b;//B指的是类
@Autowired//放在set方法前,执行会调用set方法
public void setB(B b){
this.b = b;
}
public B getB(){
return b;
}
}
3.属性的构造方法上面
@Component("a")
public class A{
private B b;
@Autowired//如果只有一个有参构造方法,则构造方法前的@Autowired也可以省略
public A(B b){
this.b = b;
}
public B getB(){
return b;
}
}
4.方法的参数前
适用于配置类中的 Bean+返回值 方式:
@Configuration
public class MyConfig {
@Bean
public A ia(@Autowired B b){//其实这里的注解可以卸载该方法上面,也可以省略
//A中存在无参构造
A a = new A();
return a;
}
@Bean
public B ib(){
return new B();
}
}
二、@Resource注解方式
该注解是JSR250规范:默认根据名字 (如果 有名字,根据名字匹配;如果没有名字,先根据名字查找,如果没找到,再根据类型查找);也可以通过name或type属性 指定根据名字 或类型找。
假设B类在IOC容器中存在多个实例:
比如一个实例的id=b1,另一个实例的id=b2
@Component("a")
public class A{
@Resource(name="b1")
//@Resource(type=XXX)
private B b;//B指的是类
public B getB(){
return b;
}
}
三、@Inject注解方式
该注解来源于JSR330规范,使用前需要先导入一个jar:javax.inject-1.jar
它默认根据类型匹配 (同样可以用@primary注解)
假设B类在IOC容器中仅存在一个实例
@Component("a")
public class A{
@Inject
private B b;//B指的是类
public B getB(){
return b;
}
}
额外补充:
最后补一下@primary注解的使用:
比如C是个接口
C1和C2都实现了该接口,并且都纳入到了IOC容器
@Component
public class C1 implements C{
...
}
@Primary
@Component
public class C2 implements C{
...
}
现在有以下的类,因为C类相关的实例存在上面的两个,这种情况下,可以直接加上@qulifier注解解决冲突,也可以给上面的类上面加上@primary,比如上面的C2就加了,所以下面的c已经自动注入了C2类的实例。
public class W implements C{
@Autowired
private C c;
}