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

网站建设服务代理商/网络营销的好处

网站建设服务代理商,网络营销的好处,兰州市建设局网站,郑州网站建设最独特时隔一年多,在掌握了Spring、SpringBoot、SpringCloud之后 我再次回头,重新学习Spring框架 Bean的生命周期学习: 在传统的XML配置中,可以这样自定义初始化和销毁方法: init-method"" destroy-method"&q…

时隔一年多,在掌握了Spring、SpringBoot、SpringCloud之后

我再次回头,重新学习Spring框架

 

Bean的生命周期学习:

在传统的XML配置中,可以这样自定义初始化和销毁方法:

init-method="" destroy-method=""

 

注解方式的简单使用:

@Configuration
public class LifeCircleConfig {@Bean(initMethod = "init",destroyMethod = "destroy")public Car car(){return new Car();}
}
public class Car {public Car(){System.out.println("Construct Car!");}public void init(){System.out.println("Car init!");}public void destroy(){System.out.println("Car destroy!");}
}
public class LifeCircleTest {private static AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(LifeCircleConfig.class);@Testpublic void test(){applicationContext.close();}
}

注意:要有close方法,否则不会打印Car销毁方法

 

打印如下:

Construct Car!
Car init!
Car destroy!

 

这里默认的是单实例Bean

如果是多实例的话,按照以上的测试代码是不会打印的,因为多实例情况下,在获取Bean的情况下才会创建对象

而且在多例情况下,只会调用初始化和构造方法,不会调用销毁方法

以上测试代码只完成了初始化IOC容器,所以什么都不打印

 

实现Spring中接口方式:这时候不需要在@Bean中进行配置

public class Car implements InitializingBean, DisposableBean {public Car() {System.out.println("Construct Car!");}public void afterPropertiesSet() throws Exception {System.out.println("Car init!");}public void destroy() {System.out.println("Car destroy!");}}

 

使用Java原生注解:

public class Car {public Car() {System.out.println("Construct Car!");}@PostConstructpublic void init() {System.out.println("Car init!");}@PreDestroypublic void destroy() {System.out.println("Car destroy!");}}

 

使用Spring中Bean的后置处理器:

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {/*** 初始化前调用*/public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessBeforeInitialization " + bean + " " + beanName);return bean;}/*** 初始化后调用*/public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessAfterInitialization " + bean + " " + beanName);return bean;}
}
@Configuration
@ComponentScan("org.dreamtech.bean")
public class LifeCircleConfig {@Beanpublic Car car(){return new Car();}
}

 

测试后部分打印如下:

Construct Car!
postProcessBeforeInitialization org.dreamtech.bean.Car@2d9d4f9d car
postProcessAfterInitialization org.dreamtech.bean.Car@2d9d4f9d car

 

BeanPostProcessor原理:

查看这一段源码:

initializeBean(beanName, exposedObject, mbd)方法中:

        Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}

在invokeInitMethods初始化方法之前

调用了applyBeanPostProcessorsBeforeInitialization,也就是调用了所有PostProcessor的Before方法

在invokeInitMethods初始化方法之后

调用了applyBeanPostProcessorsAfterInitialization,也就是调用了所有PostProcessor的After方法

 

进入applyBeanPostProcessorsBeforeInitialization方法查看源码:

遍历所有的Processor,一旦返回null,就会跳出循环

    @Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {result = beanProcessor.postProcessBeforeInitialization(result, beanName);if (result == null) {return result;}}return result;}

 

在initializeBean方法之前,调用的是populateBean方法

作用:给属性赋值

        // Initialize the bean instance.Object exposedObject = bean;try {populateBean(beanName, mbd, instanceWrapper);if (exposedObject != null) {exposedObject = initializeBean(beanName, exposedObject, mbd);}}

 

所以:BeanPostProcessor是在Bean赋值之后,初始化的过程前后执行的

 

BeanPostProcessor在Spring底层的使用:

获取IOC容器的接口:

public interface ApplicationContextAware extends Aware {void setApplicationContext(ApplicationContext var1) throws BeansException;
}

而它就是基于BeanPostProcessor的,代码过长就不截取了

class ApplicationContextAwareProcessor implements BeanPostProcessor

 

或者是参数校验:也使用到了BeanPostProcessor

public class BeanValidationPostProcessor implements BeanPostProcessor, InitializingBean

部分代码如下:

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (!this.afterInitialization) {this.doValidate(bean);}return bean;}public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (this.afterInitialization) {this.doValidate(bean);}return bean;}

 

转载于:https://www.cnblogs.com/xuyiqing/p/11307820.html

http://www.lbrq.cn/news/930889.html

相关文章:

  • 注册网站域名的入口是/上首页的seo关键词优化
  • 做网站熊掌号/拓客app下载
  • 张家港做外贸网站/外链怎么发
  • asp网站相册/手机网站关键词seo
  • 工信部网站备案时间/关键词林俊杰在线听免费
  • wordpress登录页/西安seo公司
  • 为什么搜索不到刚做的网站/优化方案丛书官网
  • 做专业维修网站/产品经理培训哪个机构好
  • 泉州做网站/百度账号登陆入口
  • 网站制作器软件下载/最新的疫情情况
  • ppt做的模板下载网站有哪些内容/蜜雪冰城推广软文
  • 济南做网站找大标/全网搜索
  • 人力资源网站建设/许昌网络推广公司
  • 二级域名做城市分网站/广东seo推广方案
  • wordpress板块大小/上海百度推广优化排名
  • 有关做美食的网站/湖南长沙关键词推广电话
  • 建设网站的企业有哪些/soso搜搜
  • 网站类产品怎么做竞品分析/优化课程体系
  • 做彩票网站犯法/香港疫情最新情况
  • 做网站要注册商标第几类/搜索引擎优化有哪些要点
  • 电子商务的网站建设要求步骤/app拉新渠道商
  • 电影网站如何建设/百度seo和sem
  • 什么网站有教做衣服视频的/临沂森拓网络科技有限公司
  • 城阳做网站公司/收录优美图片app
  • 培训视频网站/中国十大电商公司排名
  • 东庄水利建设公司网站/网络推广方案
  • 做香港台湾网站流量/谷歌商店安卓版下载
  • 网站开发的报价/百度快速收录3元一条
  • 建设网站 买了域名还要什么/b站推广引流最佳方法
  • 泉州网站建设价格/网络营销专业学什么课程
  • gRPC性能陷阱:低延迟网络下的客户端瓶颈揭秘
  • Ubuntu卡在启动画面:显卡驱动与密码重置
  • 最新!Polkadot 更新 2025 路线图
  • RAG vs 微调
  • XML Schema 指示器:全面解析与深度应用
  • 数据结构第1问:什么是数据结构?