标题: SPRING FRAMEWORK BEAN作用域和生命周期原理解析
1. BEAN的作用域
在Spring框架中,Bean的作用域是非常重要的概念。它决定了一个Bean对象在容器中的生命周期,也就是对象创建和销毁的时间。总的来说,Spring框架中Bean的作用域有以下4种:
1.1 单例模式(Singleton)
在Spring框架中,只要我们不进行任何配置,Bean的默认作用域都是Singleton单例模式。这意味着一个Bean对象在Spring容器中只会被创建一次,之后多次调用时只返回同一个对象实例。这种方式可以提高运行效率,但如果Bean中包含了一些需要动态加载的成员属性,可能会面临并发问题。
例如:
@Service
public class ExampleServiceImpl implements ExampleService {
private List<String> dataList = new ArrayList<>();
public void addData(String data) {
dataList.add(data);
}
public void printData() {
System.out.println(dataList);
}
}
以上代码中的ExampleServiceImpl类是一个服务类,它中包括一个List类型的dataList属性,用于存储一些数据。如果我们在多个调用端同时调用了addData方法,由于默认是单例模式,可能会导致数据混乱。
1.2 原型模式(Prototype)
与Singleton不同,Prototype模式每次从Spring容器中注入时都会新创建一个Bean对象。因此每次调用都会返回一个新的Bean实例。这种方式消耗的内存可能会大于单例模式,但同时也可以避免并发问题。
例如:
@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ExampleServiceImpl implements ExampleService {
private List<String> dataList = new ArrayList<>();
public void addData(String data) {
dataList.add(data);
}
public void printData() {
System.out.println(dataList);
}
}
以上代码的@Service注解中使用了@Scope注解,其中value参数指定了作用域为prototype类型。这样,每次注入ExampleServiceImpl对象时都会创建一个新的实例。
1.3 会话模式(Session)
Session模式创建的Bean对象在一个HTTP会话期间只存在一个实例。在Web应用中,当一个用户打开了浏览器访问某个网站时,创建的Bean对象在不同的请求中会保持相同。
例如:
@Service
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ExampleServiceImpl implements ExampleService {
private List<String> dataList = new ArrayList<>();
public void addData(String data) {
dataList.add(data);
}
public void printData() {
System.out.println(dataList);
}
}
以上代码的@Service注解中使用了@Scope注解,其中value参数指定了作用域为Session类型。这样,只要用户在一次会话期间内没有关闭浏览器,就可以一直使用同一个ExampleServiceImpl对象。
1.4 请求模式(Request)
Request模式创建的Bean对象在一个HTTP请求中只存在一个实例。当请求结束时,Bean对象也会随着销毁。
例如:
@Service
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ExampleServiceImpl implements ExampleService {
private List<String> dataList = new ArrayList<>();
public void addData(String data) {
dataList.add(data);
}
public void printData() {
System.out.println(dataList);
}
}
以上代码的@Service注解中使用了@Scope注解,其中value参数指定了作用域为Request类型。这样,每次HTTP请求都会创建新的ExampleServiceImpl对象,当请求结束后会销毁该对象。
2. BEAN的生命周期
Bean的生命周期指的是一个Bean对象从创建到销毁的整个过程。在Spring框架中,可以通过实现一些特定的接口或配置一些特定的方法,来控制Bean对象的生命周期。
Spring框架中Bean对象的生命周期主要涉及以下几个阶段:
2.1 实例化(Instantiation)
该阶段指Bean对象在内存中分配空间并由Spring容器读取配置文件进行实例化。该阶段的主要方法是构造器。
例如:
public class ExampleServiceImpl implements ExampleService {
public ExampleServiceImpl() {
System.out.println("实例化ExampleServiceImpl对象");
}
public void initMethod() {
System.out.println("调用ExampleServiceImpl对象的initMethod方法");
}
@Override
public void addData(String data) {
System.out.println("调用ExampleServiceImpl对象的addData方法");
}
@Override
public void printData() {
System.out.println("调用ExampleServiceImpl对象的printData方法");
}
public void destroyMethod() {
System.out.println("调用ExampleServiceImpl对象的destroyMethod方法");
}
}
以上代码中定义了initMethod和destroyMethod两个方法,用于在Bean对象实例化和销毁时进行一些操作。
2.2 属性注入(Property injection)
该阶段指Bean对象在完成实例化后,Spring容器将会使用反射机制以及框架内部一些封装好的方法,将配置文件中定义的属性注入到Bean对象中。该阶段的主要方法是Setter方法。
例如:
public class ExampleServiceImpl implements ExampleService {
private String message;
public void setMessage(String message) {
this.message = message;
}
@Override
public void addData(String data) {
System.out.println("调用ExampleServiceImpl对象的addData方法");
}
@Override
public void printData() {
System.out.println("调用ExampleServiceImpl对象的printData方法,message为:" + message);
}
}
以上代码中定义了message属性以及Setter方法,用于在属性注入阶段将配置文件中的属性值注入到Bean对象中。
2.3 初始化(Initialization)
该阶段指当Bean对象完成属性注入后,Spring容器将会调用一些预定义的配置方法对对象进行初始化。该阶段的主要方法是实现InitializingBean接口或定义自定义的初始化方法。
例如:
public class ExampleServiceImpl implements ExampleService, InitializingBean {
private String message;
public void setMessage(String message) {
this.message = message;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("调用ExampleServiceImpl对象的afterPropertiesSet方法");
}
@Override
public void addData(String data) {
System.out.println("调用ExampleServiceImpl对象的addData方法");
}
@Override
public void printData() {
System.out.println("调用ExampleServiceImpl对象的printData方法,message为:" + message);
}
}
以上代码中实现了InitializingBean接口,并实现了接口中定义的afterPropertiesSet方法。该方法会在Bean对象完成属性注入后被调用。
2.4 销毁(Destruction)
该阶段指在Bean对象被容器销毁时,Spring容器调用了一些预定义的配置方法进行清理操作。该阶段的主要方法是实现DisposableBean接口或定义自定义的销毁方法。
例如:
public class ExampleServiceImpl implements ExampleService, InitializingBean, DisposableBean {
private String message;
public void setMessage(String message) {
this.message = message;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("调用ExampleServiceImpl对象的afterPropertiesSet方法");
}
@Override
public void destroy() throws Exception {
System.out.println("调用ExampleServiceImpl对象的destroy方法");
}
@Override
public void addData(String data) {
System.out.println("调用ExampleServiceImpl对象的addData方法");
}
@Override
public void printData() {
System.out.println("调用ExampleServiceImpl对象的printData方法,message为:" + message);
}
}
以上代码中实现了DisposableBean接口,并实现了接口中定义的destroy方法。该方法会在Bean对象被容器销毁时被调用。
示例就是以上这些啦,如有疑问可以提出,我会尽快回复。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SPRING FRAMEWORK BEAN作用域和生命周期原理解析 - Python技术站