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

北京市城乡建设学校网站在线网站建设培训

北京市城乡建设学校网站,在线网站建设培训,北京信息维护公司,wordpress后台登录不上去一、Bean 的生命周期 Spring 其实就是一个管理 Bean 对象的工厂#xff0c;它负责对象的创建#xff0c;对象的销毁等 所谓的生命周期就是#xff1a;对象从创建开始到最终销毁的整个过程 什么时候创建 Bean 对象#xff1f;创建 Bean 对象的前后会调用什么方法#xf…一、Bean 的生命周期 Spring 其实就是一个管理 Bean 对象的工厂它负责对象的创建对象的销毁等 所谓的生命周期就是对象从创建开始到最终销毁的整个过程 什么时候创建 Bean 对象创建 Bean 对象的前后会调用什么方法Bean 对象什么时候销毁Bean 对象的销毁前后调用什么方法 为什么需要知道 Bean 的生命周期  其实生命周期的本质是在哪个时间节点上调用了哪个类的哪个方法 我们需要充分的了解在这个生命线上都有哪些特殊的时间节点 只有我们知道了特殊的时间节点都在哪到时我们才可以确定代码写到哪 我们可能需要在某个特殊的时间点上执行一段特定的代码这段代码就可以放到这个节点上当生命线走到这里的时候自然会被调用 二、Bean 生命周期之 5 步 Bean 生命周期的管理可以参考Spring的源码AbstractAutowireCapableBeanFactory 类的 doCreateBean() 方法 Bean 生命周期可以粗略的划分为五大步 第一步实例化Bean 第二步Bean属性赋值 第三步初始化Bean 第四步使用Bean 第五步销毁Bean package org.qiu.spring.bean;/*** Bean 的生命周期粗略的五步* 第一步实例化 Bean调用无参数构造方法* 第二步Bean 属性赋值调用 setter 方法* 第三步初始化 Bean调用 Bean 的 init 方法这个 init 方法需要自己写自己配* 第四步使用 Bean* 第五步销毁 Bean调用 Bean 的 destroy 方法这个 destroy 方法需要自己写自己配** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-10:45* since 1.0*/ public class User {private String name;public void setName(String name) {System.out.println(第二步给对象的属性赋值);this.name name;}public User() {System.out.println(第一步无参数构造方法执行);}public void initBean(){System.out.println(第三步初始化 Bean);}public void destroyBean(){System.out.println(第五步销毁 Bean);} } !-- 需要手动指定初始化方法和销毁方法 -- bean iduser classorg.qiu.spring.bean.User init-methodinitBean destroy-methoddestroyBeanproperty namename value张三/ /bean Test public void testBeanLifecycleFive(){ApplicationContext application new ClassPathXmlApplicationContext(spring.xml);User user application.getBean(user, User.class);System.out.println(第四步使用 Bean user);// 必须手动关闭 Spring 容器这样 Spring 容器才会销毁 BeanClassPathXmlApplicationContext context (ClassPathXmlApplicationContext) application;context.close(); } 运行结果  需要注意的 第一只有正常关闭 Spring 容器bean 的销毁方法才会被调用 第二ClassPathXmlApplicationContext 类才有 close() 方法 第三配置文件中的 init-method 指定初始化方法。destroy-method 指定销毁方法 三、Bean 生命周期之 7 步  在以上的5步中第3步是初始化 Bean如果你还想在初始化前和初始化后添加代码可以加入“Bean后处理器” 如果加上Bean后处理器的话Bean的生命周期就是7步了 编写一个类实现 BeanPostProcessor 类并且重写 before 和 after 方法   package org.qiu.spring.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;/*** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-11:11* since 1.0*/ public class LogBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(第三步Bean后处理器的before方法执行即将开始初始化);return bean;}/*** param bean 刚创建的 Bean 对象* param beanName Bean 的名字* return* throws BeansException*/Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(第五步Bean后处理器的after方法执行已完成初始化);return bean;} } !-- 配置 Bean 后处理器作用于整个配置文件中所有的 Bean -- bean classorg.qiu.spring.bean.LogBeanPostProcessor/ Test public void testBeanLifecycleFive(){ApplicationContext application new ClassPathXmlApplicationContext(spring.xml);User user application.getBean(user, User.class);System.out.println(第六步使用 Bean user);// 必须手动关闭 Spring 容器这样 Spring 容器才会销毁 BeanClassPathXmlApplicationContext context (ClassPathXmlApplicationContext) application;context.close(); } 运行结果 四、 Bean 生命周期之 7 步 如果根据源码跟踪可以划分更细粒度的步骤10步 上图中检查 Bean 是否实现了Aware 的相关接口是什么意思 Aware相关的接口包括BeanNameAware、BeanClassLoaderAware、BeanFactoryAware 当 Bean 实现了 BeanNameAwareSpring 会将 Bean的名字传递给 Bean 当 Bean 实现了 BeanClassLoaderAwareSpring 会将加载该 Bean的类加载器传递给 Bean 当 Bean 实现了 BeanFactoryAwareSpring 会将 Bean工厂对象传递给 Bean 测试以上10步可以让 User 类实现5个接口并实现所有方法 BeanNameAware BeanClassLoaderAware BeanFactoryAware InitializingBean DisposableBean package org.qiu.spring.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.*;/*** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-10:45* since 1.0*/ public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {private String name;public User() {System.out.println(第一步无参数构造方法执行);}public void setName(String name) {System.out.println(第二步给对象的属性赋值);this.name name;}public void initBean(){System.out.println(第六步初始化 Bean);}public void destroyBean(){System.out.println(第十步销毁 Bean);}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(第五步afterPropertiesSet执行);} } package org.qiu.spring.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;/*** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-11:11* since 1.0*/ public class LogBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(第四步Bean后处理器的before方法执行即将开始初始化);return bean;}/*** param bean 刚创建的 Bean 对象* param beanName Bean 的名字* return* throws BeansException*/Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(第七步Bean后处理器的after方法执行已完成初始化);return bean;} } Test public void testBeanLifecycleFive(){ApplicationContext application new ClassPathXmlApplicationContext(spring.xml);User user application.getBean(user, User.class);System.out.println(第八步使用 Bean user);// 必须手动关闭 Spring 容器这样 Spring 容器才会销毁 BeanClassPathXmlApplicationContext context (ClassPathXmlApplicationContext) application;context.close(); } 运行结果  通过测试可以看出来 InitializingBean 的方法早于 init-method 的执行 DisposableBean 的方法早于 destroy-method 的执行 对于 SpringBean 的生命周期掌握之前的7步即可 Bean 生命周期五步 1、实例化 Bean 2、给 Bean 的属性赋值 3、初始化 Bean 4、使用 Bean 5、销毁 Bean Bean 生命周期七步 1、实例化 Bean 2、给 Bean 的属性赋值 3、执行“Bean后处理器”的 before 方法 4、初始化 Bean 5、执行“Bean后处理器”的 after 方法 6、使用 Bean 7、销毁 Bean Bean 声明周期十步 1、实例化 Bean 2、给 Bean 的属性赋值 3、点位一 4、执行“Bean后处理器”的 before 方法 5、点位二 6、初始化 Bean 7、执行“Bean后处理器”的 after 方法 8、使用 Bean 9、点位三 10、销毁 Bean ​ ​ 点位1检查Bean是否实现了Aware相关的接口如果实现了接口则调用执行接口中的方法 点位2检查Bean是否实现了InitializingBean接口如果实现了则调用接口中的方法 点位3检查Bean是否实现了DisposableBean接口如果实现了则调用接口中的方法 的是为了给你专递一些数据让你更加方便使用 添加这三个点位的特点 都是在检查这个 Bean 是否实现了某些特定的接口如果实现了执行接口则 Spring 容器会调用这个接口中的方法 五、Bean 的作用域不同管理方式不同  Spring 根据 Bean 的作用域来选择管理方式 对于 singleton 作用域的 BeanSpring 能够精确地知道该 Bean 何时被创建何时初始化完成以及何时被销毁 而对于 prototype 作用域的 BeanSpring 只负责创建当容器创建了 Bean 的实例后Bean 的实例就交给客户端代码管理Spring 容器将不再跟踪其生命周期 把 User 类的 spring.xml 文件中的配置 scope 设置为 prototype !-- 需要手动指定初始化方法和销毁方法 -- bean iduser classorg.qiu.spring.bean.User init-methodinitBean destroy-methoddestroyBean scopeprototypeproperty namename value张三/ /bean 执行测试程序   通过测试一目了然只执行了前8步第9和10都没有执行   六、自己 new 的对象如何让 Spring 管理  有些时候可能会遇到这样的需求某个 java 对象是我们自己 new 的然后我们希望这个对象被 Spring 容器管理怎么实现   package org.qiu.spring.bean;/*** author 秋玄* version 1.0* email qiu_2022aliyun.com* project Spring* package org.qiu.spring.bean* date 2022-11-11-10:45* since 1.0*/ public class User(){ } Test public void testBeanRegister(){// 自己new的对象User user new User();System.out.println(user);// 创建 默认可列表BeanFactory 对象DefaultListableBeanFactory factory new DefaultListableBeanFactory();// 注册Beanfactory.registerSingleton(userBean, user);// 从spring容器中获取beanUser userBean factory.getBean(userBean, User.class);System.out.println(userBean); } 执行结果  一  叶  知  秋奥  妙  玄  心
http://www.w-s-a.com/news/404192/

相关文章:

  • 90设计手机站东营网站推广
  • 哪家购物网站建设好专门做水生植物销售网站
  • php医院网站开发兼职app开发网上app开发
  • 接任务做兼职的的网站衡阳手机网站设计
  • 徐州经济开发区网站佛山百度关键词seo外包
  • 肃宁网站建设有限责任公司法人承担什么责任
  • 珠海斗门建设局网站如何免费做网站
  • 自助外贸网站建设可直接打开网站的网页
  • 江苏城嘉建设工程有限公司网站潍坊网站定制公司
  • 四川省住房和城乡建设厅新网站宜昌建设厅网站
  • 建设网站一般流程建设开发网站
  • 设计外贸英文网站国家企业信息信用公信系统
  • 主题资源网站创建时 如何突出设计的特点阿里云是做网站的吗
  • 乌市建设工程质量监督站网站外资公司注册
  • 档案馆网站机房建设做游戏网站打鱼
  • 网站建设平台 创新模式搭建好ftp服务器 如何通过网站访问
  • 苏州集团网站制作设计网页制作软件ai
  • 网站建设新手教程视频教程手帐风格wordpress主题
  • 做投标网站条件网站更改指定字段
  • mvc5 网站开发之美做印刷网站公司
  • 医疗网站建设精英微信网站用什么制作的
  • 银川网站设计联系电话地推加人2元1个
  • 龙华网站 建设深圳信科北京知名的网站建设公司
  • 怎么做qq刷赞网站搜盘 资源网
  • 微网站怎么做的好名字吗陕西省医院网站建设管理
  • 泉州seo-泉州网站建设公司温州企业自助建站系统
  • 网站建设属于什么费网站建设网络推广
  • 德州网站开发人员网站怎么才能被百度收录
  • wordpress网站怎么加小游戏乐山网站制作公司
  • 企业购 网站建设做兼职有哪些网站