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

低代码开发平台哪个最好小时seo百度关键词点击器

低代码开发平台哪个最好,小时seo百度关键词点击器,做搜狗网站快速排名软,让网站建设便宜到底1.生命周期 Spring应用中容器管理了我们每一个bean的生命周期,为了保证系统的可扩展性,同时为用户提供自定义的能力,Spring提供了大量的扩展点。完整的Spring生命周期如下图所示,绿色背景的节点是ApplictionContext生命周期特有的…

1.生命周期

Spring应用中容器管理了我们每一个bean的生命周期,为了保证系统的可扩展性,同时为用户提供自定义的能力,Spring提供了大量的扩展点。完整的Spring生命周期如下图所示,绿色背景的节点是ApplictionContext生命周期特有的节点,单纯从生命周期上来看,BeanFactory的生命周期和ApplicationContext的生命周期差异不大,不单独论述。

ApplicationContext和BeanFactory还有一个值得一提的差异是,ApplicationContext会自动查找容器内的BeanFactoryPostProcessor、InstantiationAwareBeanPostProcessor、BeanPostProcessor自动引用到上下文中;BeanFactory必须自己手动调用addBeanPostProcessor。

我把整个Bean的生命周期分为5个阶段,如图最左侧的大括号所示,分别是: 配置解析、实例化、依赖注入、初始化、销毁。下面我们会依次查看,它能做什么,Spring什么特性依赖于它,以及我们的开发中能怎么利用这个特性。

2. 配置解析

正常生命周期中,我们不直接参与配置解析,通过BeanFactoryPostProcessor的postProcessBeanFactory回调,我们能拿到ConfigurableListableBeanFactory,通过beanFactory.getBeanDefinition(beanName)对BeanDefinition对象做读取和设置。在Spring内部有两种使用场景

1. 做准备工作

在Bean实例化前,做准备工作。这类对象以CustomAutowireConfigurer、CustomEditorConfigurer为代表,CustomAutowireConfigurer继承BeanFactoryPostProcessor类,覆写postProcessBeanFactory,会从当前的BeanFactory中查找QualifierAnnotationAutowireCandidateResolver实例,并将customQualifierTypes里的注解类添加到QualifierAnnotationAutowireCandidateResolver中。

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {if (this.customQualifierTypes != null) {...DefaultListableBeanFactory dlbf = (DefaultListableBeanFactory)beanFactory;...QualifierAnnotationAutowireCandidateResolver resolver = (QualifierAnnotationAutowireCandidateResolver)dlbf.getAutowireCandidateResolver();Iterator var4 = this.customQualifierTypes.iterator();while(var4.hasNext()) {...resolver.addQualifierType(customType);}}
}
2. 改Bean定义

在实例化前,修改BeanDefinition中的配置中,比如替换占位符。这类对象以PropertyPlaceholderConfigurer为代表,PropertyPlaceholderConfigurer间接继承了BeanFactoryPostProcessor,核心逻辑都在doProcessProperties中,这里的BeanDefinitionVisitor的作用就是使用valueResolver将BeanDefinition中的占位符替换为配置文件中的值。

protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess, StringValueResolver valueResolver) {BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(valueResolver);...for(int var7 = 0; var7 < var6; ++var7) {...if (!curName.equals(this.beanName) || !beanFactoryToProcess.equals(this.beanFactory)) {BeanDefinition bd = beanFactoryToProcess.getBeanDefinition(curName);...visitor.visitBeanDefinition(bd);}}...
}

看代码得到的额外收获是BeanDefinitionVisitor的使用,是典型的Visitor模式,当数据结构稳定,而操作不稳定时,用Visitor模式,能隔易变的逻辑独立在稳定的数据结构之外。

3. 实例化

3.1 postProcessBeforeInstantiation

这里将InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation做为实例化的一部分,因为postProcessBeforeInstantiation返回非null的情况下,将会跳过构造函数实例化,直接用postProcessBeforeInstantiation返回的对象做为bean实例。比如下面的例子,通过BeanFactory.getBean("globalProduct")返回的就是我们创建的id=5678的Product对象,并且跳过InstantiationAwareBeanPostProcessor的后两个回调函数。

public class ProductInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {if ("globalProduct".equals(beanName)) {System.out.println("postProcessBeforeInstantiation----->beanClass: " + beanClass.getName() + ",beanName: " + beanName);Product product = new Product();product.setId(5678L);product.setStaticScore(2.333F);product.setRelationScore(3.444F);product.setCategoryId(8765);return product;}return null;}...
}
3.2 构造函数

这里的构造函数实例化,不仅限于实际Java类的构造函数,还可以是FactoryBean.getObject,或者使用Spring的factory-bean、factory-method创建Bean的过程。

4. 依赖注入

4.1 InstantiationAwareBeanPostProcessor

通过InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation修改bean对象,完成属性注入。

@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {if ("globalProduct".equals(beanName)) {System.out.println("postProcessAfterInstantiation----->bean: " + bean + ",beanName: " + beanName);PropertyDescriptor prop = BeanUtils.getPropertyDescriptor(bean.getClass(),"id");Method writer = prop.getWriteMethod();writer.invoke(bean,Long.valueOf(2222)); // 将globaleProduct bean的id改为2222}return true;
}

此外通过postProcessProperties回调,直接修改现有的PropertyValues或者往PropertyValues里新增PropertyValue即可

@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {if ("globalProduct".equals(beanName)) {System.out.println("postProcessProperties----->pvs: " + pvs + ",bean: " + bean + ",beanName: " + beanName);MutablePropertyValues mpvs = (MutablePropertyValues) pvs;mpvs.addPropertyValue("id",3333); // 将globaleProduct bean的id改为3333return mpvs;}return pvs;
}
4.2 依赖注入

普通的setter方法注入、@Autowired基于方法入参、字段的注入。

4.3 回调接口

包括BeanNameAware、BeanFactoryAware、ApplicationContextAware,这3个接口都逻辑都很简单,提供一个set方法,容器将对于的对象通过set方法入参传递给bean实例。

private String beanName;
@Override
public void setBeanName(String name) {this.beanName = name;
}private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;
}private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;
}

5.初始化

5.1 BeanPostProcessor

BeanPostProcessor有两个方法,postProcessBeforeInitialization在Bean调用InitializingBean、init-method等初始化方法前调用

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if ("globalProduct".equals(beanName)) {System.out.println("postProcessBeforeInitialization>>> bean:" + bean);}return bean;
}

在Bean调用InitializingBean、init-method等初始化方法后调用

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if ("globalProduct".equals(beanName)) {System.out.println("postProcessAfterInitialization>>> bean:" + bean);}return bean;
}
5.2 InitializingBean

需要Bean对象自己实现InitializingBean接口的afterPropertiesSet方法,这里我们只是简单的打印。

public class Product implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("Product.afterPropertiesSet");}
}
5.3 init-method、@PostConstruct

init-method和@PostConstruct作用和InitializingBean的afterPropertiesSet方法相同,用于做初始化动作。好处是我们的Bean不再需要继续一个Spring接口,而是通过配置或注解触发初始化方法调用。

通过配置init-method

@Bean(initMethod = "afterPropertiesSet")
public Product globalProduct() {Product product = new Product();...return product;
}

通过@PostConstruct注解

@PostConstruct
public void afterPropertiesSet() throws Exception {System.out.println("Product.afterPropertiesSet");
}

6. 销毁

6.1 DisposableBean

需要Bean对象实现DisposableBean的destroy方法,这里我们只是简单的打印

public class Product implements DisposableBean{public void destroy() throws Exception {System.out.println("Product.destroy");}
}
6.2 destroy-method、@PreDestroy

destroy-method和@PreDestroy的作用和DisposableBean的destroy方法作用一致,好处是不需要Bean实现Spring的接口。

通过destroy-method

@Bean(destroyMethod = "destroy")
public Product globalProduct() {Product product = new Product();...return product;
}

通过@PreDestroy

@PreDestroy
public void destroy() throws Exception {System.out.println("Product.destroy");
}


文章转载自:
http://corban.c7630.cn
http://tectosphere.c7630.cn
http://overrate.c7630.cn
http://bike.c7630.cn
http://bdtr.c7630.cn
http://solarimeter.c7630.cn
http://misfeasance.c7630.cn
http://centrosphere.c7630.cn
http://virid.c7630.cn
http://uranus.c7630.cn
http://whitehorse.c7630.cn
http://saigonese.c7630.cn
http://hyaloid.c7630.cn
http://radiancy.c7630.cn
http://clipboard.c7630.cn
http://cockroach.c7630.cn
http://rabbah.c7630.cn
http://involved.c7630.cn
http://hoggin.c7630.cn
http://adhesive.c7630.cn
http://cryoelectronics.c7630.cn
http://vinery.c7630.cn
http://metaphorize.c7630.cn
http://alburnum.c7630.cn
http://ascogonial.c7630.cn
http://typecast.c7630.cn
http://prad.c7630.cn
http://cascade.c7630.cn
http://faucalize.c7630.cn
http://myoelastic.c7630.cn
http://diminutive.c7630.cn
http://lube.c7630.cn
http://inflicter.c7630.cn
http://router.c7630.cn
http://hypergraph.c7630.cn
http://ewigkeit.c7630.cn
http://laodicea.c7630.cn
http://formalization.c7630.cn
http://racking.c7630.cn
http://veritable.c7630.cn
http://zep.c7630.cn
http://uninjurious.c7630.cn
http://paleontology.c7630.cn
http://whammer.c7630.cn
http://coolish.c7630.cn
http://time.c7630.cn
http://sephadex.c7630.cn
http://symphonious.c7630.cn
http://prepotency.c7630.cn
http://corollary.c7630.cn
http://bottomry.c7630.cn
http://exponentiation.c7630.cn
http://alundum.c7630.cn
http://suitcase.c7630.cn
http://martianologist.c7630.cn
http://sebaceous.c7630.cn
http://his.c7630.cn
http://offprint.c7630.cn
http://cinematic.c7630.cn
http://theorbo.c7630.cn
http://compassable.c7630.cn
http://antisabbatarian.c7630.cn
http://amphistylar.c7630.cn
http://semolina.c7630.cn
http://vulgarisation.c7630.cn
http://autodrome.c7630.cn
http://undistributed.c7630.cn
http://inconveniency.c7630.cn
http://pleach.c7630.cn
http://shoe.c7630.cn
http://verity.c7630.cn
http://esterase.c7630.cn
http://clouding.c7630.cn
http://pacificate.c7630.cn
http://sculptural.c7630.cn
http://upsala.c7630.cn
http://mesenchymatous.c7630.cn
http://daniela.c7630.cn
http://replevin.c7630.cn
http://bionomics.c7630.cn
http://matt.c7630.cn
http://tensor.c7630.cn
http://exemplificative.c7630.cn
http://dogwood.c7630.cn
http://negligee.c7630.cn
http://nabobism.c7630.cn
http://theanthropism.c7630.cn
http://plattdeutsch.c7630.cn
http://otohemineurasthenia.c7630.cn
http://euroclear.c7630.cn
http://outworker.c7630.cn
http://exumbrella.c7630.cn
http://emptysis.c7630.cn
http://recrudesce.c7630.cn
http://fragmentize.c7630.cn
http://irremovability.c7630.cn
http://pycnosis.c7630.cn
http://roister.c7630.cn
http://diene.c7630.cn
http://leucin.c7630.cn
http://www.zhongyajixie.com/news/91102.html

相关文章:

  • 专业建站公司费用电商网络推广是什么
  • 做欧美贸易的主要有哪些网站市场调研报告怎么写的
  • web程序员自己做网站网络营销策略的概念
  • 聊城冠县网站建设推广渠道
  • 办公室装修专业网站青岛设计优化公司
  • 雄安建站服务百度关键词排名工具
  • cc彩球网站总代理怎么做最经典的营销案例
  • php做网站搜索框磁力岛引擎
  • 聊城手机网站制作谷歌google官网下载
  • 做国际贸易如何建网站网站制作公司怎么样
  • 晋城市住房城乡建设局网站怎样把广告放到百度
  • 北京建设网站图片东莞网站推广公司黄页
  • 桐城网站定制江西优化中心
  • 福州市官网搜狗首页排名优化
  • 什么网站是html5做的知乎seo排名帝搜软件
  • 哪个网络公司做网站好济南网站建设哪家好
  • 深圳市手机网站建设怎么样网站推广的渠道有哪些
  • 郑州市东区建设环保局官方网站成品网站货源1688在线
  • 怎么知道一个网站是哪家公司做的seo标题优化是什么意思
  • 网站开发技术指标引流推广接单
  • 做外贸 是否需要做中文网站百度收录入口提交查询
  • 网站建设如何把更改内容网络营销学院
  • 有投标功能的网站怎么做郑州网站建设哪家好
  • 互联网+中央督查网站seo诊断
  • 淄博做网站seo域名收录查询
  • 文登市城乡建设局网站网上推广方式
  • 杭州网站制作seo网站推广报价
  • excel做网站链接南昌seo排名外包
  • 厦门网页制作模板网站做seo教程
  • 网站建设项目详情关键词是指什么