Bean的作用域与生命周期
Bean的作用域
Bean作用域的问题
当甲、乙两人一起去调用Bean时,甲修改的Bean的内容,会导致乙获得的内容就不是他所想要的内容了。
@Component
public class Users {
@Bean
public User user1() {
User user = new Us
user.setId(1);
user.setName("1");
}
}
甲进行修改操作
@Controller
public class BeanScopesController {
@Autowired
private User user1;
public User getUser1() {
User user = user1;
user.setName("2");
return user;
}
}
乙获取Bean时得到的结果会是甲修改后的内容。原因是因为 Bean 默认情况下是单例状态(singleton),也就是所有⼈的使⽤的都是同⼀个对象,使⽤单例可以很⼤程度上提⾼性能,所以在 Spring 中 Bean 的作⽤域默认的是 singleton 单例模式。
Bean的六种作用域
1、singleton,单例作用域
2、prototype,原形作用域(多例作用域)
1 和 2 Spring Core 项目可以使用
3、request,请求作用域
4、session,回话作用域
5、application,全局作用域
3、4和5 Spring MVC 中使用
6、websocket,HTTP WebSocket 作用域
设置Bean作用域
通过将 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 或者 @Scope(“prototype”) (“” 内添加自己想设置的作用域)
添加在方法上可以使甲修改的内容不影响到乙获取Bean。
@Component
public class UserBean {
@Scope("prototype")
@Bean
public User user1(){
//伪代码一个对象
User user = new User();
user.setId(1);
user.setName("三");
user.setAge(1);
return user;
}
}
Bean的执行流程
1、加载Spring容器
2、加载Spring配置文件
3、加载配置文件的Bean,或根据配置文件中的组件根路径,进行Bean对象的扫描
4、加载的对象存储到Spring
5、其他需要使用Bean对象可以直接获取并使用
6、执行完后,进行销毁操作
Bean的生命周期
Bean的生命周期分为五部分
1、实例化Bean:为Bean对象分配内存
2、设置属性:Bean进行初始化注入
3、初始化:各种通知(Aware),执行初始化方法@PostConstruct,执行init-method初始化方法,BeanPostProcessor 处置和后置方法
4、使用Bean
5、销毁Bean:@PreDestroy 销毁前方法,DIsposableBean 销毁接口的实现方法,dstory-method 销毁前的执行方法