西部数码网站建设助手wordpress主页空白

当前位置: 首页 > news >正文

西部数码网站建设助手,wordpress主页空白,太原互联网公司有哪些,温州建设网站公司目录 一#xff1a;Bean的生命周期

  1. 什么是Bean的生命周期
  2. Bean的生命周期之5步
  3. Bean生命周期之7步
  4. Bean生命周期之10步
  5. Bean的scop#xff08;作用域#xff09;不同#xff0c;管理方式不同
  6. 自己new的对象如何让Spring管理 一#xff1a;Bean的…目录 一Bean的生命周期 1. 什么是Bean的生命周期 2. Bean的生命周期之5步 3. Bean生命周期之7步 4. Bean生命周期之10步 5. Bean的scop作用域不同管理方式不同 6. 自己new的对象如何让Spring管理 一Bean的生命周期 1. 什么是Bean的生命周期 1Spring其实就是一个管理Bean对象的工厂它负责对象的创建对象的销毁等。 2所谓的生命周期就是对象从创建开始到最终销毁的整个过程。 3为什么要知道Bean的生命周期 其实生命周期的本质是在哪个时间节点上调用了哪个类的哪个方法我们需要充分的了解在这个生命线上都有哪些特殊的时间节点只有我们知道了特殊的时间节点都在哪到时我们才可以确定代码写到哪。我们可能需要在某个特殊的时间点上执行一段特定的代码这段代码就可以放到这个节点上当生命线走到这里的时候自然会被调用。 4下面我会按照由浅入深按照5步、7步、10步法讲解Bean的生命周期 2. Bean的生命周期之5步 1Bean生命周期的管理可以参考Spring的源码AbstractAutowireCapableBeanFactory类的doCreateBean()方法。 2Bean生命周期可以粗略的划分为五大步 第一步实例化Bean第二步Bean属性赋值第三步初始化Bean第四步使用Bean第五步销毁Bean编写测试程序 定义一个Bean Bean的生命周期按照粗略的五步的话 第一步实例化Bean调用无参数构造方法 第二步给Bean属性赋值调用set方法 第三步初始化Bean会调用Bean的init方法。注意这个init方法需要自己写 第四步使用Bean 第五步销毁Bean会调用Bean的destroy方法。注意这个destroy方法需要自己写 package com.bjpowernode.spring.bean;public class User {private String username;public void setUsername(String username) {System.out.println(第二步给对象的属性赋值);this.username username;}public User() {System.out.println(第一步实例化Bean无参数构造方法执行了);}// 初始化Bean需要自己写自己配方法名随意public void initBean(){System.out.println(第三步初始化Bean);}// 销毁Bean需要自己写自己配方法名随意public void destroyBean(){System.out.println(第五步销毁Bean);}Overridepublic String toString() {return User{ username username \ };} }spring.xml配置 需要在bean标签中调用init-method和destroy-method属性手动指定初始化方法和销毁方法 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean iduser classcom.bjpowernode.spring.bean.Userinit-methodinitBean destroy-methoddestroyBean!–给属性赋值–property nameusername value张三//bean /beans 测试程序 ①需要手动关闭Spring容器调用close方法这样Spring容器才会销毁Bean才会去调用我们定义的destroyBean方法 ② 注意只有ApplicationContext的实现类ClassPathXmlApplicationContext有close方法ApplicationContext没有所以需要强制类型转换然后调用close方法 package com.bjpowernode.spring.test;import com.bjpowernode.spring.bean.User; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanLifecycleTest {Testpublic void testBeanLifeCycleFive(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);User user applicationContext.getBean(user, User.class);System.out.println(第四步使用Beanuser);// 需要手动关闭Spring容器ClassPathXmlApplicationContext context (ClassPathXmlApplicationContext) applicationContext;context.close();} }执行结果从这里我们也可看出执行的顺序 总结要点 第一只有正常关闭spring容器(调用close方法)bean的销毁方法才会被调用。 第二ClassPathXmlApplicationContext类才有close()方法。 第三配置文件中的init-method指定初始化方法destroy-method指定销毁方法。 3. Bean生命周期之7步 1在以上的5步中第3步是初始化Bean如果你还想在初始化前和初始化后添加代码可以加入“Bean后处理器”需要编写一个类实现BeanPostproccessor接口并重写里面的befor和after方法。 2Bean生命周期可以细化为七大步 第一步实例化Bean第二步Bean属性赋值第三步执行“Bean后处理器”的before方法第四步初始化Bean第五步执行“Bean后处理器”的after方法第六步使用Bean第七步销毁Bean编写一个类实现BeanPostProcessor类并且重写before和after方法 注意方法中有两个参数 ①第一个参数是创建的Bean对象 ②第二个参数是Bean的名字 package com.bjpowernode.spring.test;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;public class LogBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(Bean后处理器的before方法执行即将开始初始化);return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(Bean后处理器的after方法执行已完成初始化);return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);} }在spring.xml文件中配置“Bean后处理器” ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean iduser classcom.bjpowernode.spring.bean.Userinit-methodinitBean destroy-methoddestroyBean!–给属性赋值–property nameusername value张三//bean!–配置Bean后处理器。这个后处理器将作用于当前配置文件中所有的bean。–bean classcom.bjpowernode.spring.bean.LogBeanPostProcessor/ /beans 执行测试程序 一定要注意在spring.xml文件中配置的Bean后处理器将作用于当前配置文件中所有的Bean 4. Bean生命周期之10步 Bean生命周期十步比七步添加的那三步在哪里 1在“Bean后处理器”before方法之前干了什么事儿检查Bean是否实现了Aware相关的接口如果实现了接口则调用这些接口中的方法调用这些方法的目的是为了给你传递一些数据让你更加方便使用。 2在“Bean后处理器”before方法之后干了什么事儿检查Bean是否实现了InitializingBean接口如果实现了则调用接口中的方法。 3使用Bean之后或者说销毁Bean之前干了什么事儿检查Bean是否实现了DisposableBean接口如果实现了则调用接口中的方法。 总结添加的这三个点位的特点都是在检查你这个Bean是否实现了某些特定的接口如果实现了这些接口则Spring容器会调用这个接口中的方法 Aware相关的接口包括BeanNameAware、BeanClassLoaderAware、BeanFactoryAware ①当Bean实现了BeanNameAwareSpring会将Bean的名字传递给Bean。 ②当Bean实现了BeanClassLoaderAwareSpring会将加载该Bean的类加载器传递给Bean。 ③当Bean实现了BeanFactoryAwareSpring会将Bean工厂对象传递给Bean。 测试以上10步可以让User类实现5个接口并实现所有方法 ①BeanNameAware ②BeanClassLoaderAware ③BeanFactoryAware ④InitializingBean ⑤DisposableBean User类 package com.bjpowernode.spring.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.*;public class User implementsBeanNameAware, BeanClassLoaderAware, BeanFactoryAware,InitializingBean, DisposableBean{private String username;public void setUsername(String username) {System.out.println(第二步给对象的属性赋值);this.username username;}public User() {System.out.println(第一步实例化Bean无参数构造方法执行了);}// 初始化Bean需要自己写自己配方法名随意public void initBean(){System.out.println(第四步初始化Bean);}// 销毁Bean需要自己写自己配方法名随意public void destroyBean(){System.out.println(第七步销毁Bean);}Overridepublic String toString() {return User{ username username \ };}Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println(类加载器 classLoader);}Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println(Bean工厂 beanFactory);}Overridepublic void setBeanName(String name) {System.out.println(Bean的名字 name);}Overridepublic void destroy() throws Exception {System.out.println(DisposableBean destroy方法执行了);}Overridepublic void afterPropertiesSet() throws Exception {System.out.println(InitializingBean afterPropertiesSet方法执行了);} }执行结果 总结 ①InitializingBean的方法早于init-method的执行。 ②DisposableBean的方法早于destroy-method的执行。 5. Bean的scop作用域不同管理方式不同 Spring 根据Bean的作用域来选择管理方式 1对于singleton单例作用域的BeanSpring 能够精确地知道该Bean何时被创建何时初始化完成以及何时被销毁。 2而对于 prototype多例/原型 作用域的 BeanSpring 只负责创建当容器创建了 Bean 的实例后Bean 的实例就交给客户端代码管理Spring 容器将不再跟踪其生命周期。 把spring.xml配置文件当中scop属性的singleton改成property 再次执行测试程序 实际上只有前8步了对于后两步的检查Bean是否实现了DisposableBean接口 和 销毁Bean就不管了 6. 自己new的对象如何让Spring管理 有些时候可能会遇到这样的需求某个java对象是我们自己手动new的然后我们希望这个对象被Spring容器管理怎么实现呢 Student类 package com.bjpowernode.spring.bean;public class Student { }进行测试 第一步创建DefaultListableBeanFactory对象 第二步注册Bean调用这个对象的registerSingleton方法把自己创建的对象传进去并起一个名字 第三步根据名字调用getBean方法从Spring容器当中获取Bean对象 package com.bjpowernode.spring.test;import com.bjpowernode.spring.bean.Student; import com.bjpowernode.spring.bean.User; import org.junit.Test; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanLifecycleTest {Testpublic void testBeanRegister(){// 自己new的对象没有被Spring管理Student student new Student();System.out.println(student);// 创建DefaultListableBeanFactory对象DefaultListableBeanFactory factory new DefaultListableBeanFactory();// 调用registerSingleton方法注册Beanfactory.registerSingleton(studentBean,student);// 从Spring容器当中取出BeanStudent studentBean factory.getBean(studentBean, Student.class);System.out.println(studentBean);} }执行结果 获取到的是同一个Bean对象说明确实是把我们创建的对象放到Spring容器当中进行管理