下面是详解Spring中Bean的作用域与生命周期的完整攻略:
一、作用域
在Spring中,Bean的作用域可以理解为Bean生命周期内存在的范围。Spring提供了五种Bean作用域,分别是:Singleton、Prototype、Request、Session和GlobalSession。
1. Singleton
Singleton是Spring默认的Bean作用域。在Singleton作用域下,Spring IoC容器仅存在一个Bean实例,所有对该Bean的请求都将返回同一个Bean实例。示例代码:
@Service
@Scope("singleton")
public class SingletonService {
// ...
}
2. Prototype
Prototype是Spring中的原型作用域,每次请求Bean时,都会创建一个新的Bean实例。示例代码:
@Service
@Scope("prototype")
public class PrototypeService {
// ...
}
3. Request
Request作用域仅在Web应用中有效,它表示每次HTTP请求都会创建一个新的Bean实例,并且该Bean实例仅在当前HTTP请求中有效。示例代码:
@Service
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestService {
// ...
}
4. Session
Session作用域表示每个HttpSession都有一个Bean实例,且该Bean仅在当前HttpSession中有效。示例代码:
@Service
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionService {
// ...
}
5. GlobalSession
GlobalSession作用域表示Bean的生命周期与PortletSession绑定,仅在Portlet环境下才有意义。示例代码:
@Service
@Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class GlobalSessionService {
// ...
}
二、生命周期
在Spring中,Bean的生命周期分为两个阶段:初始化和销毁。Spring提供了两个接口来处理Bean的生命周期,分别是InitializingBean和DisposableBean接口。
1. InitializingBean
InitializingBean接口定义了一个afterPropertiesSet()方法,当Bean的所有属性设置完毕后会自动调用该方法进行初始化。示例代码:
@Service
public class InitializingBeanImpl implements InitializingBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBeanImpl初始化完成,name=" + name);
}
}
2. DisposableBean
DisposableBean接口定义了一个destroy()方法,当Bean被销毁时会自动调用该方法进行清除操作。示例代码:
@Service
public class DisposableBeanImpl implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("DisposableBeanImpl已销毁");
}
}
除了上述两个接口,Spring还提供了一种更常用的方式来处理Bean的生命周期,即利用@PostConstruct和@PreDestroy注解。
3. @PostConstruct和@PreDestroy
@PostConstruct注解用于在Bean初始化完成后自动调用方法。示例代码:
@Service
public class PostConstructService {
private String name;
public void setName(String name) {
this.name = name;
}
@PostConstruct
public void init() {
System.out.println("PostConstructService初始化完成,name=" + name);
}
}
@PreDestroy注解用于在Bean销毁前自动调用方法。示例代码:
@Service
public class PreDestroyService {
@PreDestroy
public void destroy() {
System.out.println("PreDestroyService已销毁");
}
}
以上就是对Spring中Bean的作用域与生命周期的详细讲解,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring中Bean的作用域与生命周期 - Python技术站