前言
使用 Spring 开发时,进行配置主要有两种方式,一是 xml 的方式,二是 java config 的方式。Spring 技术自身也在不断的发展和改变,从当前 Springboot 的火热程度来看,java config 的应用是越来越广泛了,在使用 java config 的过程当中,我们不可避免的会有各种各样的注解打交道,其中,我们使用最多的注解应该就是 @Autowired 注解了。这个注解的功能就是为我们注入一个定义好的 bean。
@Autowired 注解的作用到底是什么?
@Autowired 这个注解我们经常在使用,现在,我想问的是,它的作用到底是什么呢?
首先,我们从所属范围来看,事实上这个注解是属于 Spring 的容器配置的一个注解,与它同属容器配置的注解还有:@Required,@Primary, @Qualifier 等等。因此 @Autowired 注解是一个用于容器 ( container ) 配置的注解。
其次,我们可以直接从字面意思来看,@autowired 注解来源于英文单词 autowire,这个单词的意思是自动装配的意思.
例子
//定义一个 Service 的 Bean @Service public class LogonService implements BeanNameAware { //分别注入logDao和userDao的Bean @Autowired private LogDao logDao; @Autowired private UserDao userDao; }
使用 @Service 将 LogonService 标注为一个 Bean,通过 @Autowired 注入 LogDao 及 UserDao 的 Bean。@Autowired 默认按类型(byType)匹配的方式在容器中查找匹配的 Bean,当有且仅有一个匹配的 Bean 时,Spring 将其注入 @Autowired 标注的变量中。
@Autowired 的 required 属性
如果容器中没有一个和标注变量类型匹配的 Bean,那么 Spring 容器启动时将报 NoSuchBeanDefinitionException 异常。如果希望 Spring 即使找不到匹配的 Bean 完成注入也不要抛出异常,那么可以使用 @Autowired(required=false) 进行标注。在默认情况下,@Autowired 的 required 属性值为 ture,即要求必须找到匹配的 Bean,否则将报异常。
示例
... @Service public class LogonService implements BeanNameAware { @Autowired(required=false) private LogDao logDao; ... }
总结
@Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源。 两者的功能是一样的,就是能减少或者消除属性或构造器参数的设置,只是配置地方不一样而已。