限定程序中变量的可用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域。
而Bean的作用域是指Bean在 Spring 整个框架中的某种行为模式,比效 singleton
单例作用域,就表示Bean 在整个Spring 中只有一份,它是全局共享的,那么当其他人修改了这个值之后,另一个人读取到的就是被修改的值。
Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。Spring有6种作用域,最后四种是基于Spring MVC
生效的:
singleton
:单例作用域(默认)prototype
:原型作用域(多例作用域)request
:请求作用域(Spring MVC)session
:会话作用域(Spring MVC)application
:全局作用域(Spring MVC)websocket
: HTTP WebSocket
作用域(Spring WebSocket)单例作用域和全局作用域的区别:
singleton
是 Spring Core
的作用域;application
是 Spring Web
中的作用域; singleton
作用于loC
的容器,而application
作用于Servlet
容器。
启动Spring容器->实例化Bean(分配内存空间,从无到有)->Bean注册到 Spring 中(存操作)->将Bean 装配到需要的类中(取操作)。
所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期。
Bean的生命周期分为以下5大部分:
BeanNameAware
、BeanFactoryAware
、ApplicationContextAware
的接口方法。@PostConstruct
,另一种实质性 init-method
;@PreDestroy
DisposableBean
接口方法destroy-method
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
//@Component
public class BeanLifeComponent implements BeanNameAware {
@PostConstruct
public void postConstruct() {
System.out.println("执行 @PostConstruct");
}
public void init() {
System.out.println("执行 init-method");
}
public void use() {
System.out.println("使用 bean");
}
@PreDestroy
public void preDestroy() {
System.out.println("执行了 @PreDestroy");
}
public void setBeanName(String s) {
System.out.println("执行了 Aware 通知");
}
}
调用类:
public class App3 {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
BeanLifeComponent beanLifeComponent = context.getBean("beanLifeComponent", BeanLifeComponent.class);
beanLifeComponent.use();
context.destroy();
}
}