Spring的@Autowired需要注意的地方

在官方文档2.5版本上写着Autowired是根据类型注入的,网上搜索也是说Autowired默认是按照类型注入的,而Resource才是默认按照名字注入的,但是后来发现不是这样的,Autowired的注入类型是和变量的名字有关的,不多说,还是老规矩,先上代码说明

我有一个Bean的接口,然后有Bean1,Bean2,Bean3,3个bean,代码如下

public interface Bean {
}

@Component
public class Bean1 {
	@Autowired
	private Bean bean;

	public Bean getBean() {
		return bean;
	}
}

@Component
public class Bean2 implements Bean{
	@Override
	public String toString() {
		return "bean2....";
	}
}

@Component
public class Bean3 implements Bean{
	@Override
	public String toString() {
		return "bean3....";
	}
}

其中Bean2和Bean3实现Bean接口,Bean1中有一个Bean类型的bean(名字为bean),接下来测试代码如下

public static void main(String[] args) {
	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	Bean1 b1 = (Bean1) ctx.getBean("bean1");
	System.out.println(b1.getBean());
}

按照以前的理解,这时候是会报错的,因为当spring要向Bean1注入其中的属性bean时,会发现在容器中有两个实现了Bean接口的bean(bean2和bean3),结果和预想的一样

No unique bean of type [bean.Bean] is defined: expected single matching bean but found 2: [bean2, bean3]

这是报的错误,说是找到了两个可以匹配的bean

但是这时候如果Bean1中的属性名字改个名字,改成bean2,然后再运行测试代码,会发现打出

bean2....

如果改成bean3,会打出

bean3....

当时测试到这时,感觉有点奇怪,感觉应该会报错才对啊,因为有两个Bean类型的bean,可结果好像不是这么一回事,接着我又把名字改成bean4,这时候又报错了,错误和上面一样,是找到两个bean

根据上面的测试,得到出了结论:

1.Autowired是先根据变量的名字在容器中找与名字相同的id的bean

2.如果找到了,则注入

3.如果没找到,则根据类型找

4.如果找到了该类型的,且只有一个该类型bean,则注入,找到多个同类型的bean则报错

时间: 2024-10-31 01:18:19

Spring的@Autowired需要注意的地方的相关文章

Spring 梳理 - @Autowired VS @Resource

Autowired @Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property.当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留. 这里@Autowired注解的意思就是,当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去. @Autowired(required = false) public class

Spring 注释 @Autowired 和@Resource 的区别

Spring 注释 @Autowired 和@Resource 的区别 一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired属于Spring的:@Resource为JSR-250标准的注释,属于J2EE的. 三. @Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false) ,如果我们

Spring中@Autowired注解与自动装配

1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法.比如:Boss 拥有 Office 和 Car 类型的两个属性:public class Boss { private Car car; private Office office; // 省略 get/setter @Override public String toString() { retu

Spring 的autowired大坑

---恢复内容开始--- @autowired 自动注入大坑 这几天在spring的配置上花了许多时间.... 首先appcontextconfig.xml 配置还是根据官方得来没有错的 >>>>>>>>>>>>>>>>>>>>>如下>>>>>>>>>>>>>>>>>> &g

Spring中@Autowired、@Resource和@Inject注解的使用和区别

在使用Spring进行项目开发的时候,会大量使用到自动装配,那自动装配是什么呢?简单来说:Spring 利用依赖注入(DI)功能,完成SpringIOC容器中各个组件之间的依赖关系赋值管理. 下面介绍和总结可以在在Spring使用的三种自动注入的注解.首先回顾一下最初使用xml进行是如何进行注入的. 零.回顾:XML方式注入 使用 property 或者 constructor-arg 属性. <!-- 配置需要被Spring管理的Bean(创建,创建后放在了Spring IOC容器里面)-->

Spring中 @Autowired标签与 @Resource标签 的区别

Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource. @PostConstruct及@PreDestroy. 1. @Autowired    @Autowired是Spring 提供的,需导入    Package:org.springframework.beans.factory.annotation.Autowired;    只按照byType 注入.2. @Resource    @Resource默认按 byNam

Spring中 @Autowired标签与 @Resource标签 的区别(转)

Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource. @PostConstruct及@PreDestroy. 1. @Autowired    @Autowired是Spring 提供的,需导入    Package:org.springframework.beans.factory.annotation.Autowired;    只按照byType 注入.2. @Resource    @Resource默认按 byNam

Spring中@Autowired注解、@Resource注解的区别(转)

标签: Autowired Resource Spring(3)  Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分是name和type,Spring将@Reso

Spring @Resource, @Autowired and @Inject 注入

Overview I’ve been asked several times to explain the difference between injecting Spring beans with ‘@Resource’, ‘@Autowired’, and ‘@Inject’. While I received a few opinions from colleagues and read a couple of posts on this topic I didn’t feel like