@Autpwired和@Resource注入都需要在五大类注解修饰的类里面使用,注入也只会注入被Spring容器装配的对象,正常new的对象不会被注入。
一、@Autowired
1.属性注入
直接在类属性的上面添加@Autowired
注入时,首先Autowired会查找Spring容器中是否有User类的Bean对象,如果找到且只有一个,则直接注入这个对象,如果找到了多个,则继续通过下方的对象的名称在Spring容器中查找Bean的id,如果没找到直接报错,但是找到就将Bean对象注入到下方的属性中。
优点:简单
缺点:1.只能在IoC容器中使用
2.不能实现final对象的注入
3. 注入很简单,有不符合单一设计原则的风险
2.Setter注入
在set方法的上面加上@Autowired注解,Autowired会将Bean对象注入到set方法的参数中。
优点:符合单一设计原则(每个方法只传一个对象)
缺点:1.不能注入final修饰的对象
2.由于这个对象有Setter方法,所以注入的对象可以被修改
3. 构造注入(官方推荐)
在构造函数的上面加上@Autowired注解
特点:如果只有一个构造函数,不加@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框架支持的