Spring —— 注解 [@Resource、@Autowired、@ Inject]

39 篇文章 0 订阅
32 篇文章 0 订阅

Spring —— 注解 [@Resource、@Autowired、@Inject]

简介

传统的Spring可以通过.xml文件来配置Bean的注入、配置AOP、Transaction等操作,而这样做却有一些弊端:

  • 如果 “Bean” 过多,那么.xml就会很庞大,如果按业务或功能分割.xml,就会出现很多.xml。非常不利于维护!
  • 如果习惯了这种配置可能并不觉得麻烦,而我是先接触的注解后了解的xml配置方式,xml需要在.java与.xml之间切换,代码阅读起来会比较麻烦和不好理解(有的.xml会通过表达式获取.properties的配置)不利于理解阅读!

下面我们要介绍的是,通过@注解来把类交由Spring容器进行管理,主要介绍@Autowired、@Resource、@Inject这三种注入Bean的注解。

注解所属包源自
@Resourcejavax.annotationJava JSR-250
@Injectjavax.injectJava JSR-330
@Autowiredorg.springframework.bean.factorySpring 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类实现依赖注入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值