博客
关于我
spring的生命周期
阅读量:192 次
发布时间:2019-02-28

本文共 5763 字,大约阅读时间需要 19 分钟。

一 生命周期步骤
bean被载入到容器中时,他的生命周期就开始了:
1、容器寻找bean的定义信息并实例化。
2、使用依赖注入,spring按bean定义信息配置bean的所有属性。
3、若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递bean的ID。
4、若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
5、若BeanPostProcessor(bean后置处理器)和bean关联,则它们的postProcessBeforeInitialization()方法被调用。 
6、如果你实现InitializingBean 接口,则会调用 afterPropertiesSet()方法。
7、若bean指定了ini-method方法,它将被调用。
8、最后,若有BeanPostProcessor和bean关联,则它们的postProcessAfterInitialization()方法被调用。
9、使用我们的bean。
11、容器关闭。
12、可以通过实现DisposableBean接口来调用方法destory() 。
13、可以在<bean destory-method=”fun1”/> 调用定制的销毁方法。
我们实际开发中往往没有用的这么的过程。
二 生命周期图
1 针对ApplicationContext
2 针对BeanFactory
通过BeanFactory来获取bean对象,bean的生命周期和Applicationcontext是不一样的,bean是工厂中创建的生命周期会简单一些。
三 代码示例
1 PersonService
package com.hsp.beanlife;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.factory.BeanNameAware;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;public class PersonService implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean {        private String name;        private Integer age;        public Integer getAge() {                return age;        }        public void setAge(Integer age) {                this.age = age;        }        public String getName() {                return name;        }                public PersonService(String abc){                System.out.println("PersonService 函数");        }                public PersonService(){                System.out.println("PersonService 函数");        }        public void setName(String name) {                System.out.println("setName(String name) 函数");                this.name = name;        }                public void sayHi(){                System.out.println("hi "+ name);        }        //该方法可以给arg0表示正在被实例化得bean id        public void setBeanName(String arg0) {                // TODO Auto-generated method stub                System.out.println("setBeanName 被调用 值"+arg0);                        }        //该方法可以传递beanFactroy        public void setBeanFactory(BeanFactory arg0) throws BeansException {                // TODO Auto-generated method stub                System.out.println("setBeanFactory "+arg0);        }        //该方法传递ApplicationContext        public void setApplicationContext(ApplicationContext arg0)                        throws BeansException {                // TODO Auto-generated method stub                System.out.println("setApplicationContext"+arg0);                        }        public void init(){                System.out.println("我自己的init方法");        }                //             public void afterPropertiesSet() throws Exception {                // TODO Auto-generated method stub                System.out.println("afterPropertiesSet()");        }        //定制我们的销毁方法        @PreDestroy        public  void mydestory(){                System.out.println("释放各种资源");        }        @Override        public void destroy() throws Exception {                // TODO Auto-generated method stub                System.out.println("关闭各种资源");        }}
2 MyBeanPostProcessor
package com.hsp.beanlife;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {    public Object postProcessAfterInitialization(Object arg0, String arg1)            throws BeansException {        // TODO Auto-generated method stub        System.out.println("postProcessAfterInitialization 函数被调用");                return arg0;    }    public Object postProcessBeforeInitialization(Object arg0, String arg1)            throws BeansException {        // TODO Auto-generated method stub        System.out.println("postProcessBeforeInitialization 函数被调用");        System.out.println(arg0+" 被创建的时间是"+new java.util.Date());        return arg0;    }}
3 beans.xml
xiaoming
4 App1
package com.hsp.beanlife;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.core.io.ClassPathResource;public class App1 {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        ApplicationContext ac=new ClassPathXmlApplicationContext("com/hsp/beanlife/beans.xml");                PersonService ps1 = (PersonService) ac.getBean("personService");        ps1.sayHi();            }}
四 运行结果
PersonService 函数
setName(String name) 函数
setBeanName 被调用 值personService
setBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory@c573aba: defining beans [personService,myBeanPostProcessor]; root of factory hierarchy
setApplicationContextorg.springframework.context.support.ClassPathXmlApplicationContext@532cc66f: display name [org.springframework.context.support.ClassPathXmlApplicationContext@532cc66f]; startup date [Fri Oct 27 22:28:31 CST 2017]; root of context hierarchy
postProcessBeforeInitialization 函数被调用
com.hsp.beanlife.PersonService@39c9eaf8 被创建的时间是Fri Oct 27 22:28:32 CST 2017
afterPropertiesSet()
我自己的init方法
postProcessAfterInitialization 函数被调用
hi xiaoming
你可能感兴趣的文章
NetBeans之JSP开发环境的搭建...
查看>>
NetBeans之改变难看的JSP脚本标签的背景色...
查看>>
netbeans生成的maven工程没有web.xml文件 如何新建
查看>>
netcat的端口转发功能的实现
查看>>
NetCore 上传,断点续传,可支持流上传
查看>>
Netcraft报告: let's encrypt和Comodo发布成千上万的网络钓鱼证书
查看>>
Netem功能
查看>>
netfilter应用场景
查看>>
Netflix:当你按下“播放”的时候发生了什么?
查看>>
Netflix推荐系统:从评分预测到消费者法则
查看>>
netframework 4.0内置处理JSON对象
查看>>
Netgear WN604 downloadFile.php 信息泄露漏洞复现(CVE-2024-6646)
查看>>
Netgear wndr3700v2 路由器刷OpenWrt打造全能服务器(十一)备份
查看>>
netlink2.6.32内核实现源码
查看>>
netmiko 自动判断设备类型python_Python netmiko模块的使用
查看>>
NetMizer 日志管理系统 多处前台RCE漏洞复现
查看>>
NetMizer-日志管理系统 dologin.php SQL注入漏洞复现(XVE-2024-37672)
查看>>
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
netron工具简单使用
查看>>
NetScaler MPX Gateway Configuration
查看>>