目录
获取Bean对象(对象装配)
属性注入
构造注入
Setter注入
三种注入的优缺点分析
注入的注解:
一个类型多个bean对象的注入方式
1.让变量名等于bean的id
2.用Resource注解(name=“bean的id”)
3.用Qualifier注解(“bean的id”)
Bean的作用域
作用域的概念:
Bean的六种作用域
Bean的生命周期
获取Bean对象(对象装配)
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入。
对象装配(对象注入)的方式有以下三种:
- 属性注入
- 构造方法注入
- Setter注入
属性注入
属性注入是使用 @Autowired 实现的,将 Service 类注入到 Controller 类中。
一般是Controller写一个方法(处理http请求),调用service的业务方法(处理业务逻辑),再调用repository的方法(处理数据库的CRUD操作)
//Controller类
@Controller
@Data //lombok注解
public class UserController {
@Autowired
private UserService userService;
}
//Service类
@Service
@Data
public class UserService {
@Autowired
private UserRepository userRepository;
}
构造注入
// 构造注入
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
private UserRepository getUserRepository(){
return userRepository;
}
注意事项:如果类只有一个构造方法,那么 @Autowired 注解可以省略;如果类中有多个构造方法,那么需要添加上 @Autowired 来明确指定到底使用哪个构造方法。
Setter注入
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
三种注入的优缺点分析
属性注入:
优点:简洁,使用方便 缺点:只能用于loC容器
构造注入:
优点:通用性 缺点:有多个注入的时候会比较臃肿
Setter注入:
现在几乎不使用了,通用性不如构造注入,也比较臃肿
注入的注解:
@Autowirte、@Resource 实现的效果是一样的
区别:@Autowirte是Spring框架提供的,@Resource是JDK提供的
一个类型多个bean对象的注入方式
当一个类型有多个bean对象时,该如何注入?
@Bean
public Bean对象1 test_1(){
Bean对象1 bean=new Bean对象1();
bean.setName("hello");
return bean;
}
@Bean
public Bean对象1 test_2(){
Bean对象1 bean=new Bean对象1();
bean.setName("word");
return bean;
}
当出现多个Bean注解,返回同一对象类型是程序会报错
解决的方式有三种:
1.让变量名等于bean的id
@Autowired
private Bean对象1 test_1;
2.用Resource注解(name=“bean的id”)
第二种:用@Resource注解
@Resource(name = "test_1")
private Bean对象1 bean对象1;
3.用Qualifier注解(“bean的id”)
@Autowired
@Qualifier("test_2")
private Bean对象1 bean对象1;
Bean的作用域
假设现在有一个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的途中 A 用户却“悄悄”地修改了公共 Bean 的数据,导致 B 用户在使用时发生了预期之外的逻辑错误。
作用域的概念:
Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式,比如 singleton 单例作用域(默认),就表示 Bean 在整个 Spring 中只有一份,它是全局共享的,那么当其他人修改了这个值之后,那么另一个人读取到的就是被修改的值。
Bean的六种作用域
singleton:单例作用域 (Spring默认的作用域)
prototype:原型作用域(多例作用域)
request:请求作用域(一次请求响应范围)
session:回话作用域(一个会话的范围)
application:全局作用域
websocket:HTTP WebSocket 作用域
(注意:后4种状态是Spring MVC中的值,在普通Spring项目中只有前两种)
Bean的生命周期
Bean 的生命周期分为以下 5 大部分:
1.实例化 Bean(为 Bean 分配内存空间)
2.设置属性(Bean 注入和装配)
3.Bean 初始化
实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、
ApplicationContextAware 的接口方法;
执行 BeanPostProcessor 初始化前置方法;(XXXbedoreXXX)
执行 @PostConstruct 初始化方法,依赖注入操作之后被执行;
执行自己指定的 init-method 方法(如果有指定的话);
执行 BeanPostProcessor 初始化后置方法。(XXXafterXXX)
4.使用 Bean
5.销毁 Bean
销毁容器的各种方法,如 @PreDestroy、DisposableBean 接口方法、destroy-method。