Spring的注解注入

对于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;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘歌唱家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值