AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
~~~ <!-- Spring IOC 容器对 Bean 的生命周期进行管理的过程:(demo7) 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 的初始化方法 4.Bean 可以使用了 5.当容器关闭时, 调用 Bean 的销毁方法 在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法. 注意:需要调用close方法 需要使用ApplicationContext 子接口的方法,声明对象需要换成实现类。 --> ~~~ ~~~ //beans.xml <bean id="pet1" class="cn.li.lesson1.Pet" init-method="init" destroy-method="destroy"> <property name="name" value="老虎"></property> </bean> ~~~ ~~~ //pet类 package cn.li.lesson1; public class Pet { private String name; public Pet() { super(); System.out.println("空参构造器被调用"); } public String getName() { return name; } public void setName(String name) { System.out.println("set方法被调用"); this.name = name; } public void init(){ System.out.println("初始化方法"); } public void destroy(){ System.out.println("销毁方法"); } @Override public String toString() { return "Pet [name=" + name + "]"; } } ~~~ ~~~ //测试类: public class MainTest { public static void main(String[] args) { // TODO Auto-generated method stub ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("cn/li/lesson1/beans.xml"); Pet bean = (Pet) ac.getBean("pet1"); ac.close(); } } ~~~ ![](https://box.kancloud.cn/d586c670f400728b30c2476c523c597d_201x147.png) ~~~ 更加细粒度的定制bean的声明周期方法。 spring中提供了一个Bean后置处理器,允许在调用初始化方法前后对bean进行额外的处理。 Bean后置处理器对IOC容器里所有的Bean实例逐一处理. 作用:检测bean属性的正确性,或者根据特定的标准更改bean的属性值。 实现: 需要创建一个类 实现BeanPostProcessor接口,实现两个方法。在初始化方法被调用前后分别执行. 然后需要将当前类 注册到springIOC容器中。 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法 4.调用 Bean 的初始化方法 5.将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法 6.Bean 可以使用了 7.当容器关闭时, 调用 Bean 的销毁方法 ~~~ ~~~ //MyBeanPostProcessor类 package cn.li.lesson3; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { //调用init方法后进行处理和增强 @Override public Object postProcessAfterInitialization(Object obj, String id) throws BeansException { // TODO Auto-generated method stub System.out.println("我是bean后置处理器的方法。init之后执行"); if(id.equals("p1")){ Person p=new Person(); p.setName("小四"); return p; } return obj; } //调用init方法前进行处理和增强 @Override public Object postProcessBeforeInitialization(Object obj, String id) throws BeansException { // TODO Auto-generated method stub System.out.println("我是bean后置处理器的方法。init之前执行"); return obj; } } ~~~ ~~~ //beans.xml <bean id="person" class="cn.li.lesson3.Person" init-method="init" destroy-method="destroy"> <property name="name" value="赵铁柱"></property> </bean> ~~~ ~~~ //Person类 package cn.li.lesson3; public class Person { private String name; public Person() { super(); // TODO Auto-generated constructor stub System.out.println("person构造器"); } public String getName() { return name; } public void setName(String name) { this.name = name; System.out.println("set方法被调用"); } @Override public String toString() { return "Person [name=" + name + "]"; } public void init(){ System.out.println("bean初始化"); } public void destroy(){ System.out.println("销毁方法"); } } ~~~ ~~~ //测试类 public class MainTest { public static void main(String[] args) { // TODO Auto-generated method stub ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("cn/li/lesson3/beans.xml"); Person p = (Person) ac.getBean("person"); //System.out.println(p); ac.close(); } } ~~~ ![](https://box.kancloud.cn/6187c65e351374e076a0021a4a75a6a5_443x194.png)