Spring之BeanFactory及Bean生命周期
1、spring通过BeanFactory灵活配置、管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理;
2、BeanFactory有个ApplicationContext子接口,该接口比BeanFactory增强了更多的功能,该接口的实例有时被称为Spring的上下文,在通常的J2EE应用中,都应该考虑ApplicationContext接口,只有在J2EE应用非常关注内存的情况下,才考虑使用BeanFactory
3、Spring以bean方式管理组件,J2EE的全部组件都被当做bean来管理,Spring中的组件可以是Java对象或者Java组件;
4、在Spring整个应用中,各层的对象都处在Spring的管理下,这些对象以Bean的方式存在,Spring负责创建bean,并且管理其生命周期,bean在Spring容器中运行,无需感受Spring容器的存在,一样可以运行,接受Spring的依赖注入,包括bean的属性注入,合作者注入,依赖关系注入等
注:Spring上下文(ApplicationContext)是产生bean的工厂,bean是工厂产生的实例,产生bean的实例时,需要知道bean的实现类,bean实例的使用者(即调用程序)面向的是接口,无需关心bean实例的实现类,Spring工厂(ApplicationContext)负责维护bean实例的实例化,使用者无需关心实例化。
BeanFactory接口:
BeanFactroy是一个Spring容器,用于创建,配置,管理bean,bean之间的依赖关系也有BeanFactory负责维护;
BeanFactory对bean的实例化过程,无须bean的调用者关心,调用者只需要通过getBean()方法获得指定bean的引用;
创建BeanFactory的实例时,必须提供bean的详细配置信息,bean的详细信息通过XML文件描述,创建BeanFactory实例时,需要提供XML文件作为参数
Bean生命周期:
下图描述了 Bean 的生命周期。它是由 IoC 容器控制。IoC 容器定义 Bean 操作的规则,即 Bean 的定义(BeanDefinition)。Bean 的定义包含了 BeanFactory 在创建 Bean 实例时需要的所有信息。BeanFactory 首先通过构造函数创建一个 Bean 实例,之后它会执行 Bean 实例的一系列之前初始化动作,初始化结束 Bean 将进入准备就绪(ready)状态,这时应用程序就可以获取这些 Bean 实例了。最后,当你销毁单例(Singleton)Bean 时,它会调用相应的销毁方法,结束 Bean 实例的生命周期。
原理图:
详细步骤:
1、实例化(当程序加载applicationContext.xml文件),把bean(前提是scope=singleton)实例化到内存。
2、调用该Bean的setXxx()方法,设置属性。
3、如果实现了bean名字关注接口(BeanNameAware),则可以通过setBeanName获取id号。
4、如果实现了bean工厂关注接口(BeanFactoryAware),则可以获取BeanFactory。
5、如果实现了ApplicationContextAware接口,则可以获得ApplicationContext。
6、如果bean和一个后置处理器关联,则会自动去调用postProcessBeforeInitialization()方法。
7、如果实现InitializingBean接口,则会调用afterPropertiesSet方法。
8、如果配置<bean init-method=”init” /> 则可以在bean自定义初始化方法。
9、如果bean和一个后置处理器关联,则会自动去调用postProcessAfterInitialization()方法。
10、使用bean。
11、容器关闭。
12、可以通过实现DisposableBean接口来调用destory()方法。
13、可以在<bean destory-method=”fun1”/> 调用自定义的销毁方法。
Spring配置文件:
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 在容器文件中配置bean(service/dao/domain/action/数据源) -->
<bean id="personService" init-method="init" destroy-method="myDestory" class="com.pc.beanlife.PersonService">
<!-- 这里注入属性,前提是有setName才能成功 -->
<property name="name" value="zs" />
</bean>
<!-- 配置后置处理器(类似filter) -->
<bean id="myBeanPostProcesseor" class="com.pc.beanlife.MyBeanPostProcesseor" />
</beans>
Bean类文件:
public class PersonService implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{
private String name;
public PersonService() {
System.out.println("无参构造方法被调用");
}
public PersonService(String name) {
System.out.println("有参构造方法被调用");
}
public void printOk(){
System.out.println(name + " is Ok");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("调用set方法设置属性");
this.name = name;
}
// 该方法可以给name表示正被实例化的Bean的id
@Override
public void setBeanName(String name) {
// TODO Auto-generated method stub
System.out.println("setBeanName 被调用,值是" + name);
}
// 该方法可以传递beanFactory
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
System.out.println("setBeanFactory " + beanFactory);
}
// 该方法可以设置上下文
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("setApplicationContext " + applicationContext);
}
// 该方法可以在InitializingBean使用
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
System.out.println("afterPropertiesSet");
}
// 自定义的初始化方法
public void init() {
System.out.println("调用自定义的初始化方法");
}
// 可以在这关闭数据连接,socket,文件流,释放资源等等。。。
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
System.out.println("调用destroy()");
}
// 自定义我们的销毁方法
public void myDestory() {
System.out.println("调用自定义的销毁方法");
}
}
后置处理器文件:
public class MyBeanPostProcesseor implements BeanPostProcessor {
// 后置处理之后的过滤
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessBeforeInitialization方法被调用");
return bean;
}
// 后置处理之前的过滤
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessAfterInitialization方法被调用");
return bean;
}
}
测试类:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 通过ApplicationContext加载Bean
System.out.println("------------在ApplicationContext中Bean的生命周期------------");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/pc/beanlife/beans.xml");
// 获取Bean
PersonService personService = (PersonService) applicationContext.getBean("personService");
personService.printOk();
// 通过BeanFactory加载Bean
System.out.println("------------在BeanFactory中Bean的生命周期------------");
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("com/pc/beanlife/beans.xml"));
PersonService personService2 = (PersonService) beanFactory.getBean("personService");
personService2.printOk();
}
日志文件:
------------在ApplicationContext中Bean的生命周期------------
无参构造方法被调用
调用set方法设置属性
setBeanName 被调用,值是personService
setBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory@1f8b81e3: defining beans [personService,myBeanPostProcesseor]; root of factory hierarchy
setApplicationContext org.springframework.context.support.ClassPathXmlApplicationContext@771c8a71: display name [org.springframework.context.support.ClassPathXmlApplicationContext@771c8a71]; startup date [Sat Feb 20 11:34:05 CST 2016]; root of context hierarchy
postProcessBeforeInitialization方法被调用
afterPropertiesSet
调用自定义的初始化方法
postProcessAfterInitialization方法被调用
zs is Ok
------------在BeanFactory中Bean的生命周期------------
无参构造方法被调用
调用set方法设置属性
setBeanName 被调用,值是personService
setBeanFactory org.springframework.beans.factory.xml.XmlBeanFactory@6c4fc156: defining beans [personService,myBeanPostProcesseor]; root of factory hierarchy
afterPropertiesSet
调用自定义的初始化方法
Spring之BeanFactory及Bean生命周期的更多相关文章
- beanFactory 设计模式 Bean 生命周期的胡言乱语,哈哈
写在前面的话 适用读者:有一定经验的,本文不适合初学者,因为可能不能理解我在说什么 文章思路:不会一开始就像别的博客文章那样,Bean 的生命周期,源码解读(给你贴一大堆的源码).个人觉得应该由问题驱 ...
- Spring源码系列 — Bean生命周期
前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...
- beanFactory 设计模式 Bean 生命周期
写在前面的话 适用读者:有一定经验的,本文不适合初学者,因为可能不能理解我在说什么 文章思路:不会一开始就像别的博客文章那样,Bean 的生命周期,源码解读(给你贴一大堆的源码).个人觉得应该由问题驱 ...
- 好记性不如烂笔头85-spring3学习(6)-BeanFactory 于bean生命周期
假设BeanFactory为了产生.管理Bean, 一个Bean从成立到毁灭.它会经过几个阶段运行. 据我所知,一般bean包括在生命周期:设定,初始化,使用阶段,四个核心阶段销毁. 1.@Bean的 ...
- Spring源码 21 Bean生命周期
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- Spring源码之Bean生命周期
https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...
- 【不懂】spring bean生命周期
完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...
- Bean生命周期及BeanFactory
1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...
- Spring Bean 生命周期2
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...
随机推荐
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
系列目录 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方案,原始我们是用js来控制的,现在不需要了. 我们只要创建简单的资源文件,通过MVC的路由设置就可以轻松的进 ...
- 批量Shink所有日志或数据文件
近期,因磁盘空间问题,当执行常规性维护如碎片整理等后会报磁盘空间不足警告,因条件又无法及时添加磁盘空间,这时候不得不对LOG文件做收缩,如果遇到库比较多的实例上,一个一个来却是比较麻烦,可通过如下SQ ...
- URI编码解码和base64
概述 对于uri的编解码,在js中有3对函数,分别是escape/unescape,encodeURI/decodeURI,encodeURIComponent/decodeURIComponent. ...
- Java豆瓣电影爬虫——使用Word2Vec分析电影短评数据
在上篇实现了电影详情和短评数据的抓取.到目前为止,已经抓了2000多部电影电视以及20000多的短评数据. 数据本身没有规律和价值,需要通过分析提炼成知识才有意义.抱着试试玩的想法,准备做一个有关情感 ...
- C# 文件下载之断点续传
注意,本文所说的断点续传特指 HTTP 协议中的断点续传.本文主要聊聊思路和关键代码,更多细节请参考本文附带的 demo. 工作原理 HTTP 协议中定义了一些请求/响应头,通过组合使用这些头信息.我 ...
- 以下C#程序的输出结果是( )。
以下程序的输出结果是( ). using System; namespace HoverTreeTikuConsole { class Program { static void Main(strin ...
- Autofac 组件、服务、自动装配 《第二篇》
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- 【C#】给无窗口的进程发送消息
注:本文适用.net2.0+的winform程序 一个winform程序,我希望它不能多开(但是如何防多开不是本文要讲的),那么在用户启动第二个实例的时候,作为第二个实例来说,大概可以有这么几种做法: ...
- .net 刷新页面防止表单二次提交
1.页面上按钮是服务器控件,现在刷新页面要防止按钮事件重复执行 原网址:http://blog.csdn.net/high_mount/article/details/51066056
- jQuery图片延迟加载
这里延迟加载的意思是,拖动滚动条时,在图片出现在浏览器显示区域后才加载显示.在这之前全部图片都由一张图片代替.节省流量,减轻服务器负担. 效果展示 http://hovertree.com/texia ...