5.Bean的生命周期

1. Bean 的生命周期:

1). Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.

2). Spring IOC 容器对 Bean 的生命周期进行管理的过程:

<bean id="person" class="com.atguigu.spring.lifecycle.Person"

init-method="init"

destroy-method="destroy">

<property name="name" value="abcd"></property>

</bean>

①. 通过构造器或工厂方法创建 Bean 实例:调用构造器

②. 为 Bean 的属性设置值和对其他 Bean 的引用:调用 setter

③. 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法

④. 调用 Bean 的初始化方法:init-method

⑤. 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法

⑥. Bean 可以使用了

⑦. 当容器关闭时, 调用 Bean 的销毁方法:destroy-method

3). Bean 的后置处理器(了解):Spring
提供的特殊的 Bean

①. Bean 后置处理器允许在调用初始化方法(即:bean 节点 init-method 属性对应的方法的前后)前后对 Bean 进行额外的处理.

②. Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.

③. 对Bean 后置处理器而言, 需要实现  BeanPostProcessor  接口

public class PersonPostProcessor implements
BeanPostProcessor {

/**

* arg0:IOC 容器中 bean 的实例

* arg1:IOC 容器中该 bean 的名字

*/

@Override

public Object
postProcessAfterInitialization(Object arg0, String arg1)

throws BeansException {

if(arg0 instanceof Person){

System.out.println("postProcessAfterInitialization");

Person person = (Person) arg0;

String name = person.getName();

if(!name.equals("AAAA")){

System.out.println("name 值必须为 AAAA!");

person.setName("AAAA");

}

}

return arg0;

}

@Override

public Object
postProcessBeforeInitialization(Object arg0, String arg1)

throws BeansException {

System.out.println("postProcessBeforeInitialization");

return arg0;

}

}

④. Bean 后置处理器需要在 IOC 容器中进行配置,但不需要指定 id 属性, Spring IOC 容器会自动的识别这是个 Bean 后置处理器,自动的使用它。

<bean class="com.atguigu.spring.lifecycle.PersonPostProcessor"/>

2. 使用工厂方法配置 bean(了解)

1). 使用静态工厂方法来配置 bean

①. 静态工厂方法:直接调用某一个类的静态方法即可返回对应类的一个实例

public class StaticCarFactory {

private static Map<String, Car> cars = new HashMap<String, Car>();

static{

cars.put("ford", new Car("ford", "ChangAn", 200000, 200));

cars.put("mazda", new Car("Mazda", "ChangAn", 210000, 210));

}

public static Car get(String brand){

return cars.get(brand);

}

}

②. 配置:

<bean id="car3" class="com.atguigu.spring.factory.StaticCarFactory"

factory-method="get">

<constructor-arg
value="ford"></constructor-arg>

</bean>

注意:

I.   class 指向的是静态工厂类;

II.  factory-method 配置的是静态工厂方法中的方法;

III. 若静态方法需要传入参数,则使用 <constructor-arg value="ford"></constructor-arg> 方式传入参数

2). 使用实例工厂方法来配置 bean

public class InstanceCarFactory {

private Map<String, Car> cars = new HashMap<String, Car>();

public InstanceCarFactory() {

cars.put("ford", new Car("ford", "ChangAn", 200000, 200));

cars.put("mazda", new Car("Mazda", "ChangAn", 210000, 210));

}

public Car get(String brand){

return cars.get(brand);

}

}

<!-- 1. 配置实例工厂本身的 bean -->

<bean id="carFactory" class="com.atguigu.spring.factory.InstanceCarFactory"></bean>

<!-- 2.增加实例工厂方法配置 bean -->

<bean id="car4" factory-bean="carFactory" factory-method="get">

<constructor-arg value="mazda"></constructor-arg>

</bean>

3. 通过 FactoryBean 来配置 Bean 的实例(关注)

1). 实现 FactoryBean 接口:

public class CarFactoryBean implements FactoryBean<Car> {

//返回的 Bean 的实例

@Override

public Car getObject() throws Exception {

return new Car("BMW", "HUACHEN", 300000, 300);

}

//返回的 Bean 的类型

@Override

public Class<?> getObjectType() {

return Car.class;

}

//返回的 Bean 是否为单例

@Override

public boolean isSingleton() {

return true;

}

}

2). 在 IOC 容器中配置 Bean:class 属性指向 FactoryBean 接口的实现类,实际返回的是 FactoryBean 的 getObject() 方法的 Bean

<bean id="car5"  class="com.atguigu.spring.factorybean.CarFactoryBean"></bean>

3). 使用

Car car = (Car) ctx.getBean("car5");

时间: 2024-10-17 10:58:13

5.Bean的生命周期的相关文章

Spring中Bean的生命周期

Spring中Bean的生命周期过程: 1.Spring对Bean进行实例化(相当于程序中的new Xx()) 2.Spring将值和Bean的引用注入进Bean对应的属性中 3如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法 (实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有在Bean的ID的) 4.如果Bean实现了BeanFactoryAware接口,Spring将调用se

IOC容器中bean的生命周期

一.Bean生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: 通过构造器或工厂方法创建Bean实例 为Bean的属性设置值和对其它Bean的引用 调用Bean的初始化方法 Bean可以使用了 当容器关闭时,调用Bean的销毁方法 在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法. 下面通过示例

Spring容器中Bean的生命周期

日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此,闲言少叙,书归正传,上图先: 步骤很多,切莫惊慌,我们可以把上面的步骤归纳如下: 1-2:创建实例: 现在假设spring就是个容器,而配置文件中配置的bean属性才是我们真正需要的东西.创建实例就是说,我把配置文件中的bean信息取出来化作一个真正的bean并放到容器中. 3-4:注入依赖关系:

深入剖析Spring(三)——Bean的生命周期

对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下: 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化. 对于ApplicationContext容器,当容器启动结束后,便实例化所有的bean. 容器通

Spring中Bean的生命周期方法

Bean的生命周期方法 src\dayday\Car.java package dayday; import com.sun.org.apache.xpath.internal.SourceTree; import javax.sound.midi.Soundbank; /** * Created by I am master on 2016/11/28. */public class Car { private String name; public void setName(String n

Spring4.0学习笔记(5) —— 管理bean的生命周期

Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法创建Bean的实例 2.为Bean的属性设置值和对其他Bean的引用 3.调用Bean的初始化方法 4.Bean可以使用了 5.当容器关闭时,调用Bean的销毁方法 bean文件 package com.spring.cycle; public class Car { public Car(){ S

Spring Bean的生命周期

Bean的初始化过程已经被Spring完全包装起来了,无法人工干预. Spring预留了两个回调方法的入口 回调方法:定义出来完成一定的功能,提供给回调者/服务器/上层容器调用的方法,叫做回调方法. Bean类 public class Bean1 { public Bean1() { //System.out.println("bean1...构造方法"); } public void show(){ System.out.println("bean1...方法"

IOC容器中Bean的生命周期方法

一Spring IOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务. 二.Spring IOC容器对Bean的生命周期进行管理的过程: -通过构造器或工厂方法创建Bean的实例 -为Bean的属性设置值和对其他的Bean的引用 -调用Bean的初始化方法 -Bean可以用了 -当容器关闭是吗,调用Bean的销毁方法 三.在bean的声明里设置init-method和destroy-method属性.为Bean指定初始化和销毁方法.

Spring Bean的生命周期(非常详细)

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 转载请注明地址 http://www.cnblogs.com/zrtqsk/p/3735273.html,谢谢. 一.生命周期流程图: Spri