博客
关于我
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
你可能感兴趣的文章
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>