目录
对象装配的四种方式
1、@Autowired属性注入(使用最多)
2、Setter注入
3、构造函数注入
4、@Resource:另⼀种注⼊关键字
对象装配:获取bean对象也叫作对象装配,是将对象取出来放在某个类中,有时候也叫对象注入。对象装配的实现方式有三种:属性注入、构造方法注入、Setter注入,还有一个额外的@Resource注入
实现:将Service类注入到Controller类中。xml文件内容如下:
UserController类和UserService类
执行结果:
注意:@Autowired在注入的时候
(1)先以类型匹配;
(2)如果类型匹配出多个对象,就以名称来匹配;
(3)如果匹配出来的是一个对象,就直接注入。
比如上述代码符合情况1:因为UserService类直接根据类来匹配了,所以在上述代码中,这
但是对于下面这种情况:一个User类中有两个对象,这个时候满足上述条件2,就不能随意起名了,这里的名字要和对象名匹配,否则就会报错,显示不匹配。
UserController类:
UserService类:
执行结果:
UserController类
UserService类
执行结果:
现在如果想要注入多个,那么就要写多个构造函数,但是为了能让Spring知道使用哪个构造函数,就要加一个@Autowired注解。
总结:三种注入方式的优缺点分析
(1)属性注⼊(一般使用)
优点:简洁,使⽤⽅便。。
缺点:只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常),不能修饰final修饰的属性。
(2)Setter注入
优点:方便在类实例后,重新对该对象进行配置或者注入;
缺点:不能注入一个final修饰的属性;注入对象可能会被改变,因为setter方法可能会被多次 调用,就有被修改的风险。
(3)构造方法注入
优点:可以注入final修饰的属性,注入的对象不会被改变;依赖对象在使用之前一定会被完全初始化,因为构造方法是在类加载阶段就会执行的方法。还有就是通用性好,构造方法是JDK支持的,所以更换任何框架,都是适用的。
缺点:注入多个对象的时候,代码比较繁琐。
在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊。
@UserController
@UserService
执行结果
问题2:将@Autowired更改为@Resource也可以执行成功,因此@Resource与@Autowired之间的区别是什么?
(1)出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
(2)使⽤时设置的参数不同:但是@Autowired根据类型来获取bean,如果只有同一个类型的bean只有一个,直接注入成功;如果同一个类型的bean有多个,根据名称匹配;如果没如有名称相同的,就报错。@Resource ⽀持更多的参数设置,如果没如有名称相同的,就报错,但是有解决办法,例如name 设置,根据名称获取 Bean。但是其实@Autowired也有其他的解决办法,搭配一个注解@Qualifier来使用。
注意:下面的user1和user2存在,user不存在。
@Resource的解决办法
@Autowired的解决办法
(3)@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注⼊和属性注⼊,不能⽤于构造函数注⼊。
前三篇文章知识的总结:
1. 将对象存储到 Spring 中:
(1)使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】
(2) 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】
2. Bean 的命名规则:⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。
3. 从 Spring 中获取对象:
- 属性注⼊
- Setter 注⼊
- 构造函数注⼊(推荐)
4. 注⼊的关键字有:
- @Autowired
- @Resource
5. @Autowired 和 @Resource 区别:出身不同; 使⽤时设置参数不同 @Resource ⽀持更多的参数,⽐如 name。
6. 解决同⼀类型多个 Bean 的报错:
- 使⽤ @Resource(name="")
- 使⽤ @Qualifier("")