文章目录
Spring —— 注解 [@Resource、@Autowired、@Inject]
简介
传统的Spring可以通过.xml文件来配置Bean的注入、配置AOP、Transaction等操作,而这样做却有一些弊端:
- 如果
“Bean”
过多,那么.xml就会很庞大,如果按业务或功能分割.xml,就会出现很多.xml。非常不利于维护!
- 如果习惯了这种配置可能并不觉得麻烦,而我是先接触的注解后了解的xml配置方式,
xml需要在.java与.xml之间切换,代码阅读起来会比较麻烦和不好理解(有的.xml会通过表达式获取.properties的配置)
,不利于理解阅读!
下面我们要介绍的是,通过@注解来把类交由Spring容器进行管理,主要介绍
@Autowired、@Resource、@Inject这三种注入Bean的注解。
注解 | 所属包 | 源自 |
---|---|---|
@Resource | javax.annotation | Java JSR-250 |
@Inject | javax.inject | Java JSR-330 |
@Autowired | org.springframework.bean.factory | Spring 2.5+ |
JSR
Java Specification Requests【Java规范提案】,意指向JCP【Java Community Process】新增一个标准化技术规范的正式请求。
任何人都可以提交JSR,向Java开源语言添加API和服务。
JSR是Java开源语言中一个重要都标准。
@Resource
J2EE包下
用来装配“Bean”的,@Resource可以用在声明类时装配Bean,也可以用在setter函数上,装配参数:
// 通过名字注入
@Resource(name = "testDao")
private TestDao testDao;
// 采用set方式注入,这样可以注入TestDao
@Resource
public void setTestDao(TestDao testDao) {
.....
}
属性详解
- name
默认 ""
定义要注入的bean,按名称注入,如果没有属性name,则按照参数名称向Spring容器查找相同名称对象。 - lookup
默认 ""
Spring支持JNDI lookup,通过指定lookup属性值向Spring容器中查询对应对象。 - type
默认 java.lang.Object.class
必须是Java所属类型,指定需注入的Bean类型。 - authenticationType
默认 AuthenticationType.CONTAINER
使用Bean的身份验证类型,默认是(容器),设置允许使用此Bean的类型指定,不允许其它类型使用。 - shareable
默认 true
设置这个Bean是否可以用于别处。 - mappedName
默认 "" - description
默认 ""
Bean描述信息。
必须的依赖
当我们使用注解方式注入属性时,一定要往项目中导入spring-aop-4.2.5.RELEASE.jar包,不然就会报异常。
@Autowired
所属spring-beans包下。
较@Resource注解方式更简单的配置。在调用配置方法前,加载使用注解的类时注入bean,无序将注入的Bean设置为public。
// 注入testDao对象
@Autowired
private TestDao testDao;
属性详解
只有一个属性。
- required
默认 true
默认是必须的,如果设置为false,当无法在IoC中找到对应值时,不会报错,反之则会报错。
注解解析
启动Spring IoC时,容器自动装载一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Resource、@Autowired、@Inject这些注解时,就会在IoC容器自动查找需要的Bean,并装配给该对象的属性。
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
@Inject
- @Inject是JSR330 (Dependency Injection for Java)中的规范,需要导入javax.inject.Inject;实现注入。
- @Inject是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Named;
- @Inject可以作用在变量、setter方法、构造函数上。
三者区别
@Autowired | @Resource | @Inject | |
---|---|---|---|
由来 | Spring自带 | JSR-250标准,JDK6以上自带,Spring版本要求2.5以上 | JSR-303标准,Spring版本3以上,需导入外部依赖 |
作用范围 | 构造器、方法、属性、参数作为注解使用 | 方法、属性、类上 | 方法、属性、构造器上 |
使用方式 | 可根据名字、类型注入,可通过设置required(false)指定找不到对应bean时不抛出异常 | 注入方式与@Autowired一致,但如果name对应的bean不存在,则会抛出异常,且没有required属性 | 与@Autowired一致,区别在于没有required属性 |
注入方式 | 通过AutowiredAnnotationBeanPostProcessor类实现依赖注入 | 通过CommonAnnotationBeanPostProcessor类实现依赖注入 | 通过AutowiredAnnotationBeanPostProcessor类实现依赖注入 |