@Autowired注入和@Resource注入

@Autpwired和@Resource注入都需要在五大类注解修饰的类里面使用,注入也只会注入被Spring容器装配的对象,正常new的对象不会被注入。

一、@Autowired

1.属性注入

直接在类属性的上面添加@Autowired

 注入时,首先Autowired会查找Spring容器中是否有User类的Bean对象,如果找到且只有一个,则直接注入这个对象,如果找到了多个,则继续通过下方的对象的名称在Spring容器中查找Bean的id,如果没找到直接报错,但是找到就将Bean对象注入到下方的属性中。

优点:简单

缺点:1.只能在IoC容器中使用

           2.不能实现final对象的注入

           3. 注入很简单,有不符合单一设计原则的风险

2.Setter注入

@Autowired注入和@Resource注入_第1张图片

 在set方法的上面加上@Autowired注解,Autowired会将Bean对象注入到set方法的参数中。

优点:符合单一设计原则(每个方法只传一个对象)

缺点:1.不能注入final修饰的对象

           2.由于这个对象有Setter方法,所以注入的对象可以被修改

3. 构造注入(官方推荐)

在构造函数的上面加上@Autowired注解

@Autowired注入和@Resource注入_第2张图片

特点:如果只有一个构造函数,不加@Autowired也是会注入的

优点:1.可以注入final修饰的对象

           2.注入对象后不会被修改

           3.构造方法可以保证被注入的对象可以完全被初始化

           4.构造方法注入通用性更好
(1)构造方法可以注入final属性的对象是因为:final对象的定义就是只有两种情况下可以初始化

                1.在定义这个变量的时候,直接就地初始化

                2.在构造函数里面初始化

因为在这里需要注入属性,所以不能就地初始化,所以final对象只能通过构造函数注入

二、@Resource

和@Autowired相比

(1)@Resource在使用方法上比@Autowired相比只少了构造函数注入的方法

(2)@Resource在spring容器中搜寻是先搜索名称,再搜索类型,如果搜索到有该名称只一个Bean,则直接注入,如果有多个,则再根据类型搜寻,类型不匹配则报错

        @Autowired是先搜索类型,如果类型匹配且只有一个则直接注入,如果有多个同类,则搜索名称,名称不匹配则直接报错

(3)@Resource支持在注入时使用name来制定要注入的Bean对象的id,@Autowired可以通过和@Qulifier(value="")配合,来选中对应的value

(4)@Resource是jdk支持的,@Autowired是Spring框架支持的

你可能感兴趣的:(java,开发语言)