获取Bean对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入!
对象装配(对象注入)更加简单的读取Bean(是从Spring容器中读取某个对象放到当前类里面)的实现方法有以下3种:
- 属性注入:最简单,日常工作见的最多的
- 构造方法注入
- Setter注入
使用这三种方法,就可以更加简单的读取Bean(从容器中读取某个对象,放到当前类里面)
- 属性注入:
@RestController class UserController { //属性注入 @Autowired //自动注入对象(更加简单的从Spring容器中获取到对象 private UserService userService; @RequestWrapper("/add") public UserInfo add(String username,String password){ return userService.add(username,password); } }
优点分析:
属性注入最大的优点就是实现简单、使用简单,只需要给变量上添加一个注解(@Autowired),就可以在不 new 对象的情况下,直接获得注入的对象了(这就是 DI 的功能和魅力所在),所以它的优点就是使用简单。
缺点分析:
有的编辑器idea都会提醒你:”不建议使用此方法注入“
属性注入的缺点主要包含以下3个:
1.功能性问题:无法注入一个不可变的对象(final修饰的对象)
2.通用性问题:只能适用于Ioc容器
3.设计原则问题:更容易违背单一设计原则
- Setter注入
@RestController class UserController { //Setter注入 private UserService userService; @Autowired //Setter方法+ @Autowired注解 public void setUserService(UserService userService){ this.userService=userService; } @RequestWrapper("/add") public UserInfo add(String username,String password){ return userService.add(username,password); } }
优点分析:
完全符合单一职责的设计原则,因为每一个 Setter 只针对一个对象
缺点分析:
1.不能注入不可变对象(fianl修饰的对象)
2.注入的对象可被修改
@Resource:另一种注入关键字
在进行类注入的时候,可以使用@Autowried关键字之外,我们还可以使用@Resource进行注入
@Controller
class UserController {
//注入
@Resource
private UserService userService;
public User getUser(Integer id) {
return userService.getUser(id);
}
}
那么,我们来看一下@Autowired和@Resource的区别吧!!
- 出身不同
@Autowired来自于Spring
@Resource来自于JDK的注解
- 使用时设置的参数不同
相比于@Autowired来说,@Resource支持更多的参数设置
列如:name,根据名称获取Bean
- @Autowired可以用于Setter注入,构造函数注入和属性注入,而@Resource只能用于Setter注入和属性注入,不能适用于构造函数注入
- @Autowired先根据类型查找(byType),之后再根据名称查找(byName);@Resource先根据名称查找,然后再根据类型查找
在Spring(容器)中找Bean有两种方式:
- 根据类型查找
- 根据名称查找
综合练习:
在 Spring 项⽬中,通过 main ⽅法获取到 Controller 类,调⽤ Controller ⾥⾯通过注⼊的⽅式调⽤ Service 类,Service 再通过注⼊的⽅式获取到 Repository 类,Repository 类⾥⾯有⼀个⽅法构建⼀ 个 User 对象,返回给 main ⽅法。Repository ⽆需连接数据库,使⽤伪代码即可。
总结:
- 将对象存储到 Spring 中:
a. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它 们之间的关系】
b. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】
- Bean 的命名规则:
⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个 字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean
- 从 Spring 中获取对象:
a. 属性注⼊
b. Setter 注⼊
c. 构造函数注⼊(推荐)
- 注⼊的关键字有:
a. @Autowired
b. @Resource
- @Autowired 和 @Resource 区别:
出身不同; 使⽤时设置参数不同 @Resource ⽀持更多的参 数,⽐如 name。
- 解决同⼀类型多个 Bean 的报错:
a. 使⽤ @Resource(name="")
b. 使⽤ @Qualifier("")