Bean
的生命周期及作用域
在
BeanFactory
中
Bean
的生命周期:
1、
容器寻找
Bean
的定义信息并将其实例化。
2、
使用依赖注入,
spring
按照
Bean
定义信息配置
Bean
的所有属性。
3、
如果
Bean
实现了
BeanNameAware
接口,工厂调用
Bean
的
setBeanName()
方法传递
Bean
的
id
。
4、
如果
Bean
实现了
BeanFactoryAware
接口,工厂调用
setBeanFactory()
方法传入工厂自身。
5、
如果有
BeanPostProcessor
和
Bean
关联,那么其
postProcessBeforeInitialization()
方法将调被调用
6、
如果
Bean
指定了
init
—
method
方法,将被调用
7、
如果有
BeanPostProcess
和
Bean
关联,那么其
postProcessAfterInitialization()
方法将被调用。
Bean
在加载容器时创建
、
Bean
初始化时执行
init-method
方法、
Bean
被关闭时执行
destory-method
方法。
消除
BeanFactory
中
bean
的方法:
1、
如果
Bean
实现了
DisposableBean
接口,
destory()
方法被调用
2、
如指定了定制的销毁方法,就调用这个方法
注:
Bean
的
spring
应用上下文中的生命周期与在
BeanFactory
中的生命周期只有一点不同:即
Bean
实现了
ApplicationContextAware
接口,
setApplicationContext()
放法会被调用。
案例:简单介绍Bean的生命周期
public class CycleLifeService implements BeanNameAware, BeanFactoryAware,BeanPostProcessor{
private String say;//say的属性
private Test test;//java类的实例
public void setSay(String say) {
this.say = say;
}
public Test getTest() {
return test;
}
public void setTest(Test test) {
this.test = test;
}
public void test(){
System.out.println("-------------"+this.say);
}
//初始化的方法
public void init(){
System.out.println("初始化方法....");
}
//销毁的方法
public void destroy(){
System.out.println("销毁方法.....");
}
//设置Bean的name
@Override
public void setBeanName(String name) {
System.out.println("===="+name);
}
@Override
public void setBeanFactory(BeanFactory arg0) throws BeansException {
// 设置一个beanFactory
System.out.println(BeanFactory.class);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("------后"+beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("--------前"+beanName);
return bean;
}
}
Test的类
public class Test {
public void test() {
System.out.println("======================");
}
}
applicationContext.xml文件
文件中定义的初始化的方法和销毁的方法
<bean id="cycleLifeService" class="cn.csdn.cyclelife.CycleLifeService"
init-method="init" destroy-method="destroy">
<property name="say">
<value>你好!!!</value>
</property>
<property name="test">
<ref bean="test"></ref>
</property>
</bean>
<bean id="test" class="cn.csdn.cyclelife.Test"/>
其中的init-method方法在Bean实例化时被调用;destory-method方法在Bean从容器删除之前被调用
Bean
的作用域
Spring Framework
支持五种作用域(其中有三种只能用在基于
web
的
Spring
ApplicationContext
)。
1
、
singleton
:在每个Spring IoC
容器中一个bean
定义对应一个对象实例。(
在初始化容器时,创建一个
bean
的实例对象
)
2
、
prototype
:
一个bean
定义对应多个对象实例。(
在每次请求该
bean
时,都会创建一个
bean
的实例对象
)
3
、
request
:在一次HTTP
请求中,一个bean
定义对应一个实例;即每次HTTP
请求将会有各自的bean
实例,它们依据某个bean
定义创建而成。该作用域仅在基于web
的Spring ApplicationContext
情形下有效。
4
、
session
:
在一个HTTP Session
中,一个bean
定义对应一个实例。该作用域仅在基于web
的Spring ApplicationContext
情形下有效。
5
、
global
session
:在一个全局的HTTP Session
中,一个bean
定义对应一个实例。典型情况下,仅在使用portlet context
的时候有效。该作用域仅在基于web
的Spring ApplicationContext
情形下有效。
我们在
spring
中常用的两种作用域:
singleton
和
prototype
一下主要详细介绍该两种作用域。
第一种:
Singleton作用域:
当把一个bean定义设置为singlton作用域时,Spring IoC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。
<bean id="studentServiceImpl" class="cn.csdn.service.StudentServiceImpl"
scope="singleton">
<property name="studentDaoImpl" ref="studentDaoImpl">
</property>
</bean>
public class StudentServiceImpl {
private StudentDaoImpl studentDaoImpl;
public void setStudentDaoImpl(StudentDaoImpl studentDaoImpl) {
this.studentDaoImpl = studentDaoImpl;
}
@Override
public void insert() {
studentDaoImpl.insert();
}
}
public class StudentDaoImpl {
@Override
public void insert() {
System.out.println("插入成功.....");
}
}
第二种:
Prototype作用域:
Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
注:Spring不能对一个prototype bean的整个生命周期负责:容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。
<!-- 使用singleton模式创建bean实例对象 -->
<bean id="cityService" class="cn.csdn.service.CityService" scope="prototype"></bean>
补充:延迟初始化:
依赖:
延迟初始化
:lazy-init:false true;
false:
加载容器时
初始化对象
true
:第一次调用时初始化对象
在根标签中有一个
default-lazy-init
的属性
如果该属性设置为
true
该文件中的所有
bean
都会被延迟初始化。
注意:如果在
lazy-init
='false'
的
bean
中,引用
lazy-init
="true"
的
bean,
那么
lazy-init
就失去了延迟的效果。
<
分享到:
相关推荐
主要给大家介绍了Spring中Bean的生命周期和作用域及实现方式的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
NULL 博文链接:https://cici9898-007.iteye.com/blog/1407695
主要介绍了浅谈Spring中Bean的作用域、生命周期,具有一定借鉴价值,需要的朋友可以参考下
主要介绍了SPRING FRAMEWORK BEAN作用域和生命周期原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了深入了解Spring中Bean的作用域和生命周期,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
spring的生命周期及BeanPostProcessor的使用,注解方式创建bean 及使用Autowried标签关联类的属性 ,泛型依赖注入的使用 spring-3 演示使用动态代理模式实现面向切面编程 使用注解方式进行AOP编程及使用配置xml方式...
摘录了spring的核心逻辑,代码极度简化,保留spring的核心功能,如IoC和AOP,资源加载器,事件监听器,类型转换,容器扩展点,bean生命周期和作用域,应用某些等核心功能。 如果本项目能帮助到你,请给个STAR,谢谢...
提取了Spring的核心逻辑,极大地简化了代码,并完善了Spring的核心功能,例如IoC和AOP,资源加载器,事件侦听器,类型转换,容器扩展点,Bean生命周期和作用域以及应用程序上下文,被保留。 如果这个项目可以为您...
代码及ppt涵盖 Spring4.0 的所有核心内容:在 Eclipse 中安装 SpringIDE 插件、IOC & DI、在 Spring 中配置 Bean、自动装配、Bean 之间的关系(依赖、继承)、Bean 的作用域、使用外部属性文件、SpEL、管理 Bean 的...
7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.3.2.1. 拦截around通知 7.3.2.2. 前置通知 7.3.2.3. 异常通知 7.3.2.4. 后置通知 7.3.2.5. 引入通知 7.4. Spring里的advisor(Advisor) API 7.5. 使用...
Spring Bean的生命周期? Spring中bean的作用域 说一下Spring基于xml注入bean的几种方式? Spring如何解决循环依赖问题? Spring的自动装配 Spring框架中都用到了哪些设计模式? Spring框架中有哪些不同类型的事件?
1.spring中bean实例化的俩种方式 2.spring中bean的各种元素如何使用 ...4.spring中不同类型bean的作用域 5.spring中bean的生命周期 通过我的项目,可以跟着学习SPringIoC容器和Bean管理,帮助你快速上手SSM框架
spring框架技术+第2天+xmind思维导图:生命周期,介绍simple project,打印出构造方法...bean作用域request session globalSession:web项目获取核心配置文件要配置两个地方:spring监听器、spring作用域范围的监听。
本篇博文适合零基础的同学:主要包括:spring介绍; Ioc 入门案例; Di 入门案例; 核心API介绍;...bean作用域; 生命周期; 属性注入--setter方法 p命名空间; sqel; 集合注入; 装配bean基于注解;
05_配置Spring管理的bean的作用域 06_Spring管理的Bean的生命周期 07_编码剖析Spring依赖注入的原理 08_编码剖析Spring装配基本属性的原理 09_Spring如何装配各种集合类型的属性 10_使用构造器装配属性 11_用...
在通过两种方式集成的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员...
Spring中注入属性值细节、自动装配、bean之间的关系、bean的作用域、使用外部属性文件、SpEL、IOC容器中Bean 的生命周期、泛型依赖注入。
请解释Spring Bean的生命周期 Spring Bean的作用域之间有什么区别 什么是Spring inner beans Spring框架中的单例Beans是线程安全的么 请举例说明如何在Spring中注入一个Java Collection 如何向Spring Bean中注入一个...
在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员
毕业设计,java语言,基于spring+springMvc+mybatis ...在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程保留核心功能,例如:I0C、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。