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的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...
- **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...
Spring中的Bean生命周期主要分为两个阶段:容器管理阶段和用户自定义阶段。在容器管理阶段,Spring容器负责Bean的实例化、属性注入、初始化、使用和销毁。而在用户自定义阶段,开发者可以通过定义回调方法或使用特定...
接下来,我们将深入探讨Spring Bean生命周期的各个阶段,并通过具体的示例来演示。 1. **配置阶段** 在Spring容器初始化时,它会读取配置文件(如XML或Java配置),解析Bean定义,包括其依赖关系、初始化方法、...
这些作用域定义了Bean的生命周期和创建行为: 1. **单例(Singleton)**:默认作用域,每个容器中只有一个实例,适合无状态的服务。 2. **原型(Prototype)**:每次请求都会创建一个新的Bean实例,适用于有状态的...
在Spring框架中,Bean的作用域是管理Bean实例创建和存活范围的重要概念。Bean的作用域决定了在特定上下文中,Spring容器如何管理和提供Bean的实例。在Spring中,有五种主要的Bean作用域: 1. **Singleton作用域**:...
Bean生命周期的理解对于优化应用性能和理解Spring内部工作原理至关重要。这里我们将深入探讨Spring的Bean生命周期、容器周期以及工厂周期。 首先,让我们从Bean生命周期开始。在Spring中,Bean的生命周期包括以下几...
- 在Spring中,一个Bean代表了一个Java对象,它由Spring容器管理,包括其生命周期和依赖关系。 - Bean的定义通常在XML配置文件中完成,如`beans.xml`,通过`<bean>`标签进行声明。例如: ```xml <bean id=...
Spring 中 bean 的作用域是指 Spring IoC 容器中 bean 的生命周期和实例化方式。bean 的作用域决定了 bean 的实例化和生命周期的管理方式。在 Spring 中,bean 的作用域可以分为五种:singleton、prototype、...
Spring中Bean的作用域和生命周期 Spring框架中,Bean的作用域和生命周期是两个非常重要的概念,了解这两个概念对深入理解Spring框架的工作机理具有非常重要的意义。本文将对Spring中Bean的作用域和生命周期进行详细...
Spring框架是Java应用开发中的一个核心组件,尤其在企业级应用中广泛使用。Spring通过其IoC(Inversion of Control,控制反转)容器管理Bean的生命周期,...理解Bean生命周期对于有效管理和优化Spring应用至关重要。
SPRING FRAMEWORK BEAN作用域和生命周期原理解析 Spring Framework 是一个流行的 Java Web 应用程序框架,它提供了一个强大的依赖注入机制,称为 Bean 容器。Bean 容器管理着应用程序中的所有对象,并提供了一些...
在Spring框架中,Bean配置是核心概念之一,它关乎到对象的创建、初始化、依赖注入以及生命周期管理。在"Spring--2.Spring 中的 Bean 配置-2-2"这个主题下,我们将深入探讨如何在Spring中进行Bean的详细配置。 1. **...
本篇将详细阐述Spring Bean生命周期的各个阶段,以及如何记忆和深入理解这一过程。 首先,Spring Bean的生命周期可以分为两个主要阶段:容器初始化阶段和容器销毁阶段。 在容器初始化阶段,Spring Bean会经历以下...
此外,`<bean>`元素还支持通过`init-method`和`destroy-method`属性指定bean的初始化和销毁方法,以进行自定义的生命周期管理。 `spring-context-4.2.xsd`还定义了处理bean作用域(scope)、AOP代理(proxy)、事件...
深入了解Spring中Bean的作用域和生命周期 在 Spring 框架中,Bean 的作用域和生命周期是两个非常重要的概念,它们决定了 Bean 的实例化和生命周期。了解 Spring 中 Bean 的作用域和生命周期是非常重要的,这将有助...
在Spring框架中,Bean生命周期是核心概念之一,它涉及到Bean的创建、初始化、使用和销毁等阶段。了解和掌握Bean生命周期对于开发高质量的Spring应用至关重要。以下是对Spring Bean生命周期的详细解析。 首先,Bean...
这些方法会在Bean生命周期的特定时刻被调用。 最后,Bean之间的依赖关系可以通过XML中的`ref`属性,Java配置中的`@Autowired`,或注解配置中的构造函数、setter方法、字段注入等方式来解决。Spring提供了基于类型、...
Spring 框架系列(8)- Spring IOC 实现原理详解之 Bean 实例化(生命周期、循环依赖等) 本文主要研究 Spring 框架中 Bean 的实例化过程,包括 Bean 的生命周期和循环依赖问题的解决方案。在 Spring 框架中,Bean ...
实例化过程是Bean生命周期的起点。 2. **依赖注入**: - 在Bean实例化后,Spring会执行依赖注入(Dependency Injection,DI),将所需的属性值注入到Bean中。这可以通过setter方法、构造函数或者字段注入实现。 3...