|
JavaEE
Spring —— Spring简单的读取和存储对象Ⅰ
Spring —— Spring简单的读取和存储对象 Ⅱ
Bean
的作用域是指 Bean 在 Spring
整个框架中的某种行为模式.
比如 singleton 单例作用域, 就表示 Bean 在整个 Spring 中只有一份, 它是全局共享的, 那么当其他人修改了这个值之后, 那么另一个人读取到的就是被修改的值.
singleton
: 单例作用域 (默认作用域)prototype
: 原型作用域 (多例作用域)request
: 请求作用域session
: 回话作用域application
: 全局作用域websocket
: HTTP# 注意 #
后 4 种状态是 Spring MVC
中的值,在普通的 Spring
项⽬中只有前两种.
Bean 默认情况下是单例状态(singleton),也就是所有⼈的使⽤的都是同⼀个对象,之前我们学单例模式的时候都知道,使用单例可以很大程度上提高性能,所以在 Spring 中Bean 的作用域默认也是 singleton 单例模式。
IoC
容器中只存在⼀个实例:获取 Bean(即通过 applicationContext.getBean
等方法获取)及装配 Bean(即通过 @Autowired
注入)都是同⼀个对象.Bean
使用该作用域. (无状态表示 Bean 对象的属性状态不需要更新)Bean
的请求都会创建新的实例:获取 Bean(即通过 applicationContext.getBean
等方法获取)及装配 Bean(即通过 @Autowired
注入)都是新的对象实例。http
请求会创建新的 Bean 实例,类似于prototype
SpringMVC
中使⽤http session
中,定义⼀个 Bean 实例SpringMVC
中使⽤application (了解)
http servlet Context
中,定义⼀个 Bean 实例SpringMVC
中使⽤websocket (了解)
HTTP WebSocket
的⽣命周期中,定义⼀个 Bean 实例Map
结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到 WebSocket 结束都是同⼀个 Bean。Spring WebSocket
中使⽤单例作用域 (singleton) VS 全局作用域 (application)
@Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式
使⽤枚举设置: @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
public class UserBeans {
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("Gujiu");
user.setPassword("123456");
return user;
}
}
直接设置值: @Scope("prototype")
@Component
public class UserBeans {
@Scope("prototype")
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("Gujiu");
user.setPassword("123456");
return user;
}
}
xml
直接注册 BeanBean
根 (扫描) 路径Spring
中: 通过类注解进行扫描和装配Bean
装配到需要的类中 (取操作)所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期。
Bean 的生命周期:
Bean
(对应 JVM 中的 “加载”, 从无到有, 将字节码转换成内存中的对象, 只是分配了内存) [买了一套毛坯房]Bean
初始化 [房子装修]
Bean
[房子可以入住使用了]BeanLifeComponent
类:
//@Component
public class BeanLifeComponent implements BeanNameAware {
@Override
public void setBeanName(String s) {
System.out.println("执行了通知");
}
@PostConstruct
public void postConstruct() {
System.out.println("执行了 @PostConstruct");
}
public void init() {
System.out.println("执行了 init-method");
}
@PreDestroy
public void preDestroy() {
System.out.println("执行了销毁方法");
}
}
xml
配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="myComponent" class="com.demo.component.BeanLifeComponent"
init-method="init" >bean>
beans>
调用类:
public class App2 {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-config.xml");
BeanLifeComponent beanLifeComponent =
applicationContext.getBean("myComponent", BeanLifeComponent.class);
System.out.println("使用Bean");
applicationContext.destroy();
}
}
运行结果展示:
|
以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!