4.spriing:Bean的生命周期/工厂方法配置Bean/FactoryBean
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的更多相关文章
- Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- Bean XML 配置(2)- Bean作用域与生命周期回调方法配置
系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...
- spring深入学习(二)-----bean的生命周期、IOC容器bean装配
bean的生命周期 1.实例化Bean对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBea ...
- spring4-2-bean配置-9-通过工厂方法配置bean
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjwAAAFICAIAAADbNrOHAAAgAElEQVR4nO2dy7W0uhGFOxWn4JEXAS
- Spring初学之通过工厂方法配置Bean
工厂方法配置bean分为两种,一种是实例工厂方法,另一种是静态工厂方法. 先来看看实体bean: Car.java: package spring.beans.factory; public clas ...
- 11.Spring通过工厂方法配置Bean
通过工厂方法配置Bean暴扣静态工厂方法和实例工厂方法. 1.静态工厂方法 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,而不去关心创建 ...
- Spring4学习回顾之路07- 通过工厂方法配置Bean
一:通过静态工厂配置Bean 建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Des ...
- 工厂方法配置bean
1:静态工厂方法配置bean 1):对象 package com.spring.helloworld; public class Car { private String name; private ...
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...
随机推荐
- SpringBoot和SpringCloud区别
SpringBoot专注于快速方便的开发单个个体微服务. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来, 为各个服 ...
- 如何去除vue项目中的 # — vue路由的History模式
前言 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头. 添加 mode: 'history' 之后将使用 HTML5 his ...
- Android 文件的可读可写
文件流形式的保存,获取: 设立文件的私有,可读,可写,公开: 效果图: /data/data中文件夹: 新建一个项目测试文件: 得到data/data,查看文件的特性:
- 【Machine Learning】决策树之ID3算法 (2)
决策树之ID3算法 Content 1.ID3概念 2.信息熵 3.信息增益 Information Gain 4. ID3 bias 5. Python算法实现(待定) 一.ID3概念 ID3算法最 ...
- 十八、移动端rem布局
使用rem布局,首先要知道自己是根据UI给的视效图的多少基准的,这里是以750px为基准,代码如下: //rem布局,此处根据750px来设置,放大100倍 (function(doc, win) { ...
- Quick Easy FTP Server FTP工具文件传输使用
1 工具配置 2 linux 下ftp命令上传和下载文件到FTP_DIR目录 1 ftp 172.16.18.292 输入用户名3 输入密码 4 ls或dir 查看目录及文件 lcd进入本地目录 ...
- HighChart利用servlet导出中文PNG图片乱码问题解决
最近用到HighChart作图,在图片导出时,出现了图片中中文乱码的问题,在网络上找了很多资料,但都没有解决,最后才发现了最容易被忽略的问题.具体见下. 由于之前有同事使用过HighChart,所以毫 ...
- python读写不同编码txt文件
以后整理规范 import os import codecs filenames=os.listdir(os.getcwd()) out=file("name.txt",& ...
- 用WCAT进行IIS压力测试
用WCAT进行IIS压力测试 分类: javascript专辑 IT信息化 2008-10-13 16:56 5754人阅读 评论(1) 收藏 举报 iis测试服务器microsoft脚本网络 如何建 ...
- 四、CentOS 安装mariadb——Linux学习笔记
A)安装及配置 下载mariadb: yum -y install mariadb-server mariadb 开启mariadb服务: systemctl start mariadb.servic ...