spring注解@Autowired、@Resource、@Inject

注入bean的注解:@Autowired、@Resource、@Inject

一、@Autowired注解

        (1)以下例子,若不写 @Qualifier注解,代表按照类型(GoodsService的类型)去spring容器中找对应的bean,并注入,找不到则抛出异常,如果允许null值,则这样@Autowired(required=false) 书写;

        (2)若写@Qualifier("goodsService")注解,代表按照名称goodsService去spring容器中找对应的name=goodsService的bean,找不到则抛出异常,如果允许null值,同样需要这样@Autowired(required=false) 书写;

            

         说明:Car是一个接口,那么自动装配的时候,会去spring容器中找到实现这个接口的实现类,并注入该实现类;

         

 

  1. 提供方:Autowired注解,是由spring提供;
  2. 目的:@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
  3. 范围:它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
  4. @Autowired注解,默认按类型(ByType)装配, 默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false) ,如果我们想使用名称(ByName)装配可以结合@Qualifier注解进行使用;
  5. @Autowired注入普通java类
  6. @Autowired注入接口

         问题:

     (1)当Car的实现类出现多个的时候,那么就会报错;

     (2)如果必须允许多个Car接口的实现类,那么使用@Qualifier("name")注解,可以解决这个问题,其中name是某一个实现类的类名;

       引用:注意@Qualifier注解括号里面的应当是Car接口实现类的类名,我之前试的时候一直以为是bean的名字,所以写了"bMW",结果一直报错

        

      7、@Autowired用于构造器;

          问题:@Autowired对成员变量和构造函数进行注释又有什么区别呢?

          (1)顺序不同,在构造器执行的时候就需要注入bean;

          (2)使用构造器注入的方法,可以明确成员变量的加载顺序

       PS:Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired

 

二、@Resource注解

  1. 提供方:Resource注解,是由javaSE提供;
  2. @Resource注解放在@Autowired下面说,是因为它们作用非常相似;

     用法说明:

     1、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配;

     2、@Resource(name="tiger")指定了name,例如:则根据指定的name去匹配bean,不匹配都将报错;

     3、@Resource(type=Mokey.class)指定了type,则根据指定的类型去匹配bean,不匹配都将报错;

     4、@Resource如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

     不同点(区别):

     1、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配;

     2、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

 

 

三、@Inject注解

  1. 提供方:Inject注解,是由javaSE提供;
  2. 和@Autowired一样,@Inject可以用来自动装配属性、方法和构造器;与@Autowired不同的是,@Inject没有required属性。因此@Inject注解注入的依赖关系必须存在,否则报异常。

    与@Autowired一样,@Inject有自己限定的方法,即处理限定歧义性的依赖,配置如下:

       注:实际上,@Named注解就是一个使用@Qualifier注解所标注的注解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值