1.Bean的生命周期

scope:singleton/prototype

1)spring容器管理singleton作用的生命周期,spring能够精确知道Bean合适创建,何时初始化完成,以及何时被销毁

2)spring容器管理prototype作用的生命周期,spring只负责创建,容器实例化之后就交给客户端进行管理,spring容器不会再

  跟踪其生命周期。

可以借鉴servlet的生命周期“实例化--初始化--接受请求--销毁”

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

Car.java

public class Car {
private String brand;public void init() {
System.out.println("init");
}public void destroy() {
System.out.println("destroy");
}

     public void setBrand(String brand) {
      System.out.println("setBrand");
      this.brand = brand;
    }

  //....
}

applicationContext.xml

<bean id="car" class="com.MrChengs8.TheLifeCycle.Car" init-method="init" 
destroy-method="destroy">
<property name="brand" value="Aodi"></property>
</bean>

测试:

        Car car = (Car) ctx.getBean("car");
System.out.println(car); //关闭IOc容器
//ClassPathXmlApplicationContext
//子接口里面有关闭IOC容器的方法
ctx.close();
setBrand
init
Car [brand=Aodi]
destroy

先调用构造函数和设置属性,然后再init()

Bean的后置处理器:

创建Bean后置处理器:
Bean后置处理器允许在调用初始化的时候对前后的Bean进行额外的处理
Bean的后置处理器对IOC容器里的所有的Bean实例逐一处理,而非单一的实例,

其典型的应用是:检查Bean属性的正确性或者根据特定的标准去修改bean

对Bean后置处理器而言,更需要实现的是Interface BeanPostProcessor接口,在初始化方法被调用的前后,
Spring将把每个Bean的实例分别传递给接口以下的两个方法
->postProcessAfterInitialization(Object arg0, String arg1)
->postProcessBeforeInitialization(Object arg0, String arg1)

实现并提供两个方法的实现在类中
Object arg0, String arg1
arg0:bean的实例本身
arg1:IOC容器配置的bean的名字
在IOC容器会自动识别是一个后置处理器

TheLatterPostprocessor.java

public class TheLatterPostprocessor implements BeanPostProcessor{

    @Override
public Object postProcessAfterInitialization(Object bean, String arg1) throws BeansException {
System.out.println("postProcessAfterInitialization__After__::" + arg1 + "---" + bean);
Car car = new Car();
car.setBrand("BBBBB");
return car;
} @Override
public Object postProcessBeforeInitialization(Object bean, String arg1) throws BeansException {
System.out.println("postProcessBeforeInitialization__Before__::" + arg1 + "---" + bean);
return bean;
} }

applicationContext.xml

<!--配置Bean的后置处理器 -->
<bean class="com.MrChengs8.TheLifeCycle.TheLatterPostprocessor"></bean>
setBrand
postProcessBeforeInitialization__Before__::car---Car [brand=Aodi]
init
postProcessAfterInitialization__After__::car---Car [brand=Aodi]
setBrand
Car [brand=BBBBB]
destroy

2.工厂方法配置Bean

1).实例工厂实例化

实例工厂方法:将对象创建的过程封装到另外一个对象实例方法里,当客户需要请求对象时,只需要简单的调用该实例方法发,不必关心创建的细节
要声明通过实例工厂方法创建Bean:
->在bean的factory-method属性里指定拥有该方法的Bean
->在factory-method属性里指定该工厂方法的名称
->使用 construtor元素为工厂方法传递参数

Car.java

public class Car {
private String brand;
private double price;public Car(String brand, double price) {
super();
this.brand = brand;
this.price = price;
}
  //.....
}

InstanceFactoryMethod.java

public class InstanceFactoryMethod {

    private Map<String, Car> cars = null;

    public InstanceFactoryMethod(){
cars = new HashMap<String, Car>();
cars.put("aodi", new Car("aodi", ));
cars.put("ford", new Car("ford",));
} public Car getCar(String name){
return cars.get(name);
}
}

applicationContext.xml

<!-- 配置工厂的实例 -->
<bean id="car1" class="com.MrChengs9.FactoryMethod.InstanceFactoryMethod" ></bean>
<!-- 通过实例工厂方法来配置bean -->
<bean id="car2" factory-bean="car1" factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean>

测试

        Car car2 = (Car) ctx.getBean("car2");
System.out.println(car2);
Car [brand=ford, price=20000.0]

2).静态工厂方法

利用静态工厂方法可以把bean注入到IOC容器中。在XML文件中配置bean时,要指定class的属性为工厂的类;factory-method属性指定工厂类中
工厂方法,用于创建bean;constrctor-arg用于给工厂方法传递参数

StaticFactoryMethod.java

public class StaticFactoryMethod {
private static Map<String, Car> cars = new HashMap<String, Car>(); static{
cars.put("audi", new Car("audi", ));
cars.put("ford", new Car("ford", ));
} public static Car getCars(String name){
return cars.get(name);
}
}

applicationContext.xml

<!-- 静态工厂方法来配置Bean实例,不是配置静态工厂方法实例,而是去配置Bean实例 -->
<!--
Class属性指向静态工厂方法的全类名
factory-method:指向静态工厂的名字
constructor-arg:工厂需要传入canshu,则使用此元素
-->
<bean id="car" class="com.MrChengs9.FactoryMethod.StaticFactoryMethod"
factory-method="getCars">
<constructor-arg value="audi"></constructor-arg>
</bean>
        Car car1 = (Car) ctx.getBean("car");
System.out.println(car1);
Car [brand=audi, price=1234.0]

3.FactoryBean

FactoryBean是一个接口,要用的话就要实现它。他有三个方法:

  getObject()  //返回bean对象

  getObjectType()  //返回bean的类型

   isSingleton()   //是否单例

CarFactoryBean.java

public class CarFactoryBean implements FactoryBean<Car>{

    private String brand;
public void setBrand(String brand) {
this.brand = brand;
}
//返回bean的对象
@Override
public Car getObject() throws Exception {
// TODO Auto-generated method stub
return new Car(brand,100000);
}
//返回bean的类型
@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Car.class;
}
//返回bean是不是单实例的
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return false;
}
}

Car.java

public class Car {
private String brand;
private double price;public Car(String brand, double price) {
super();
this.brand = brand;
this.price = price;
}
  //......
}

applicationContext.xml

    通过FactoryBean来配置Bean的实例
class:指向FactoryBean的全类名
property:配置FactoryBean的属性
但是实际返回的是FactoryBean的getObject()方法
<bean id="car" class="com.MrChengsa.FactoryBean.CarFactoryBean">
<property name="brand" value="BMW"></property>
</bean>
        Car car = (Car) ctx.getBean("car");
System.out.println(car);
Car [brand=BMW, price=100000.0]

 但实际返回实例确是 FactoryBean 的 getObject() 方法返回的实例!

4.spriing:Bean的生命周期/工厂方法配置Bean/FactoryBean的更多相关文章

  1. Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  2. Bean XML 配置(2)- Bean作用域与生命周期回调方法配置

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  3. spring深入学习(二)-----bean的生命周期、IOC容器bean装配

    bean的生命周期 1.实例化Bean对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBea ...

  4. spring4-2-bean配置-9-通过工厂方法配置bean

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjwAAAFICAIAAADbNrOHAAAgAElEQVR4nO2dy7W0uhGFOxWn4JEXAS

  5. Spring初学之通过工厂方法配置Bean

    工厂方法配置bean分为两种,一种是实例工厂方法,另一种是静态工厂方法. 先来看看实体bean: Car.java: package spring.beans.factory; public clas ...

  6. 11.Spring通过工厂方法配置Bean

    通过工厂方法配置Bean暴扣静态工厂方法和实例工厂方法. 1.静态工厂方法 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,而不去关心创建 ...

  7. Spring4学习回顾之路07- 通过工厂方法配置Bean

    一:通过静态工厂配置Bean 建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Des ...

  8. 工厂方法配置bean

    1:静态工厂方法配置bean 1):对象 package com.spring.helloworld; public class Car { private String name; private ...

  9. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...

随机推荐

  1. HTML5坦克大战(韩顺平版本)

    HTML5坦克大战(韩顺平版本) 2017-3-22 22:46:22 by SemiconductorKING 去年暑假学习了一下HTML5实现简单的坦克大战,觉得对JavaScript初学者来说, ...

  2. 告别Flash——那些年我们追过的FusionCharts

    随着FusionCharts最终放弃Flash这块蛋糕,不.或者已经不能叫做蛋糕了,现在Flash图表控件就只剩下AnyChart这一个独苗了,到底Flash还能走多远?这是Flash的末路吗? 众说 ...

  3. asp.net core2.0 连接mysql和mssql

    转自:https://www.jianshu.com/p/15a557ac43d9 1.连接mysql 第一步,新建asp.net core项目   新建项目 本例程作简单演示两种数据库的连接,为简便 ...

  4. Javaee的Dao层的抽取

    有时候我们在实现不同功能的时候回看到很多的Dao层的增加.修改.删除.查找都很相似,修改我们将他们提取BaseDao 一.提取前 1. 提取前的LinkDao层: public interface L ...

  5. springboot+mybatis+thymeleaf+docker构建的个人站点开源项目(集成了个人主页、个人作品、个人博客)

    前言 My Site 主要功能有:个人首页.个人作品.个人博客为一体的站点,网站的文章和作品均由markdown进行编写,可以满足你的基本需求.如果觉得这个项目不错,请为它点赞支持. 项目架构 JDK ...

  6. Java 带缓冲的字节流和字符流

    输入流就是文件从硬盘到内存的中间媒介,那么输出流就是文件从内存到硬盘的中间媒介.首先来看看FileOutputStream的继承了哪些类, java.lang.Object java.io.Outpu ...

  7. poj 1141 Brackets Sequence ( 区间dp+输出方案 )

    http://blog.csdn.net/cc_again/article/details/10169643 http://blog.csdn.net/lijiecsu/article/details ...

  8. MySQL查询(未完结)

    MySql查询 单表查询: 查询所有字段 SELECT * FROM 表名; '*' 代表所有字段 查询指定字段 SELECT 字段名1, 字段名2 FROM 表名; 按照指定条件查询记录 1. 查询 ...

  9. 用css3+js写了一个钟表

    有一天看到css3旋转这个属性,突发奇想的写了一个钟表(没做浏览器兼容),来一起看看是怎么写的吧! 先给个成品图,最终结果是个样子的(动态的). 首先,思考了一下页面的布局,大致需要4层div,最底层 ...

  10. mysql创建用户授权

    服务器上好多库,为了不让某用户误操作别人的数据库,给他单独建个用户并授权. insert into mysql.user(Host,User,Password, ssl_cipher, x509_is ...