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

广州市网站公司网站推广计划书怎么做

广州市网站,公司网站推广计划书怎么做,南阳网(网站).,做一个网站的预算目录 Spring后处理器 Bean工厂后处理器-BeanFactoryPostProcessor 修改beanDefinition对象 添加beanDefiniton对象 方法一 方法二 自定义Component Spring后处理器 Spring后处理器是Spring对外开放的重要拓展点#xff08;让我们可以用添加自己的逻辑#xff09;…目录 Spring后处理器 Bean工厂后处理器-BeanFactoryPostProcessor 修改beanDefinition对象 添加beanDefiniton对象 方法一 方法二 自定义Component Spring后处理器 Spring后处理器是Spring对外开放的重要拓展点让我们可以用添加自己的逻辑允许我们介入到Bean的整个实例化流程中来以达到动态注册BeanDefinition向BeanDefitionMap中添加BeanDefition对象的过程动态修改BeanDefition以及动态修改Bean的作用。Spring主要有两种后处理器 BeanFactoryPostprocessorBean工厂后处理器执行时机在BeanDefinitionMap填充完毕Bean实例化之前执行BeanPostProcessorBean后处理器执行时机一般在Bean实例化后填充到单例池singletonObjects之前执行 Bean工厂后处理器-BeanFactoryPostProcessor BeanFactoryPostProcessor是一个接口规范实现该接口的类只要交由Spring容器管理即在配置文件中注册该类称为Bean对象的话那么Spring就会回调该接口的方法用于对BeanDefition注册和修改功能BeanFactoryPostProcessor定义如下 // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //package org.springframework.beans.factory.config;import org.springframework.beans.BeansException;FunctionalInterface public interface BeanFactoryPostProcessor {void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; }修改beanDefinition对象 创建一个实现类修改beanDefinition对象 package com.example.PostProcessor;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println(beanDefinitionMap填充完毕后会回调该方法);// todo 修改Map集合中的BeanDefinition对象BeanDefinition userService beanFactory.getBeanDefinition(userService);userService.setBeanClassName(com.example.DAO.Impl.UserDAOImpl);} }测试类 package com.example.Test;import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestApplicationContext {public static void main(String[] args) {ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(application.xml);System.out.println(context.getBean(userService));} }运行结果如下 显然bean对应的类被改变了  添加beanDefiniton对象 方法一 创建一个类添加beanDefiniton对象 package com.example.PostProcessor;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition;public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// todo 向Map集合中添加一个BeanDefinition对象即在配置文件中没有注册// 创建一个新的beanDefinition对象BeanDefinition beanDefinition new RootBeanDefinition();// 设置bean对应的类beanDefinition.setBeanClassName(com.example.DAO.Impl.UserDAOImpl);DefaultListableBeanFactory listableBeanFactory (DefaultListableBeanFactory) beanFactory;// 添加该beanDefinition对象listableBeanFactory.registerBeanDefinition(UserDAO, beanDefinition);} }在配置文件中没有配置UserDAO了 测试类 package com.example.Test;import com.example.DAO.Impl.UserDAOImpl; import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestApplicationContext {public static void main(String[] args) {ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(application.xml);System.out.println(context.getBean(UserDAOImpl.class));} }运行结果 beanDefinition对象成功添加 方法二 Spring提供了一个BeanFactoryPostProcessor的子接口BeanDefinitionRegistryPostProcessor专门用于注册BeanDefinition操作 // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //package org.springframework.beans.factory.support;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor;public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException; }创建一个类实现后处理器BeanFactoryPostProcessor的子接口BeanDefinitionRegistryPostProcessor记得将该类注册到Spring容器中 package com.example.PostProcessor;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition;public class MyBeanFactoryPostProcessor02 implements BeanDefinitionRegistryPostProcessor {Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// 注册beanDefinitionBeanDefinition beanDefinition new RootBeanDefinition();beanDefinition.setBeanClassName(com.example.DAO.Impl.UserDAOImpl);registry.registerBeanDefinition(UserDAO, beanDefinition);}Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {} }实现添加beanDefiniton就会简单很多 测试类 package com.example.Test;import com.example.DAO.Impl.UserDAOImpl; import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestApplicationContext {public static void main(String[] args) {ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(application.xml);System.out.println(context.getBean(UserDAOImpl.class));} }运行结果如下 完整流程图  自定义Component 案例 使用Spring的BeanFactoryPostProcessor扩展点完成自定义注解扫描要求 自定义MyComponent注解使用在类上使用资料中提供好的包扫描工具BaseClassScanUtils完成指定包的类扫描 工具类链接如下https://hkm-web.oss-cn-beijing.aliyuncs.com/Utils自定义BeanFactoryPostProcessor完成注解MyComponent的解析解析最终被Spring管理具体代码如下 注解类 package com.example.Anno;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.TYPE) // 设该注解的使用范围 Retention(RetentionPolicy.RUNTIME) // 设置该注解运行期间可见 public interface MyComponent {String value(); //用于设置注解的值 }工具类 package com.example.Utils;import com.example.Anno.MyComponent; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.util.ClassUtils;import java.util.HashMap; import java.util.Map;public class BaseClassScanUtils {//设置资源规则private static final String RESOURCE_PATTERN /**/*.class;public static MapString, Class scanMyComponentAnnotation(String basePackage) {//创建容器存储使用了指定注解的Bean字节码对象MapString, Class annotationClassMap new HashMapString, Class();//spring工具类可以获取指定路径下的全部类ResourcePatternResolver resourcePatternResolver new PathMatchingResourcePatternResolver();try {String pattern ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX ClassUtils.convertClassNameToResourcePath(basePackage) RESOURCE_PATTERN;Resource[] resources resourcePatternResolver.getResources(pattern);//MetadataReader 的工厂类MetadataReaderFactory refractory new CachingMetadataReaderFactory(resourcePatternResolver);for (Resource resource : resources) {//用于读取类信息MetadataReader reader refractory.getMetadataReader(resource);//扫描到的classString classname reader.getClassMetadata().getClassName();Class? clazz Class.forName(classname);//判断是否属于指定的注解类型if(clazz.isAnnotationPresent(MyComponent.class)){//获得注解对象MyComponent annotation clazz.getAnnotation(MyComponent.class);//获得属value属性值String beanName annotation.value();//判断是否为if(beanName!null!beanName.equals()){//存储到Map中去annotationClassMap.put(beanName,clazz);continue;}//如果没有为,那就把当前类的类名作为beanNameannotationClassMap.put(clazz.getSimpleName(),clazz);}}} catch (Exception exception) {}return annotationClassMap;}public static void main(String[] args) {MapString, Class stringClassMap scanMyComponentAnnotation(com.itheima);System.out.println(stringClassMap);} }使用注解来注册为Bean对象的类 package com.example.Beans;import com.example.Anno.MyComponent;MyComponent(otherBean) public class otherBeans { }在配置文件中没有配置该类作为bean对象 后工厂处理器类该类要交给Spring容器管理 package com.example.PostProcessor;import com.example.Utils.BaseClassScanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.beans.factory.support.RootBeanDefinition;import java.util.Map;public class MyComponentBeanFactoryProcessor implements BeanDefinitionRegistryPostProcessor {Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// 通过工具去扫描指定包及其子包下的所有类收集使用MyComponent注解的类放在Map集合中MapString, Class MyComponentAnnotationMap BaseClassScanUtils.scanMyComponentAnnotation(com.example);// 遍历Map组装BeanDefinition进行注册MyComponentAnnotationMap.forEach((beanName,clazz)-{// 获取beanClassNameString beanClassName clazz.getName();// 创建beanDefinitionBeanDefinition beanDefinition new RootBeanDefinition();beanDefinition.setBeanClassName(beanClassName);// 注册registry.registerBeanDefinition(beanName,beanDefinition);});}Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {} }通过后工厂处理器类来将标记了自己创建的MyComponent注解的类创建为beanDefinition对象后添加到beanDefinitionMap集合中。 测试类 package com.example.Test;import com.example.Beans.otherBeans; import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestApplicationContext {public static void main(String[] args) {ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(application.xml);System.out.println(context.getBean(otherBeans.class));} }运行结果   运行成功~ 使用注解注册bean的原理 最主要是通过Bean工厂后处理器进行实现的通过工具类获取到添加了注解的类的集合后在后处理器中对扫描结果进行遍历然后生成对对应的beanDefinition对象后注册到beanDefinitonMap集合后即可。
http://www.tj-hxxt.cn/news/132752.html

相关文章:

  • 网站制作小工具学网站建设app
  • 做公司网站有什么猫腻王府井网上商城官网
  • 快照打开是网站网站南乐网站建设公司
  • 网站建设公司中深圳做棋牌网站建设哪家服务好
  • 外贸网站 备案色盲能治好吗
  • 公司网站要什么做青岛网站设计品牌企业
  • 网站封装成app可以做热更新织梦cms网站更新
  • 免费发布信息网站大全注册300元免费开发小程序
  • 做男装比较好的网站有哪些专门做杂志的网站有哪些
  • 广东省网站备案系统软件技术包括哪些
  • 良精企业网站管理系统源码 后台不能编辑产品镇江网站建设多少钱
  • 百度官方网站下载安装做网站需要备案几次
  • 电厂建设审批进度网站河南英文网站建设公司
  • 连云港东海网站建设广州 互联网公司 网站首页
  • 网站开发的搭建框架是什么意思WordPress文档批量发布接口
  • 东莞企业网站哪家强景观设计师做交通分析常用网站
  • 网站优化步骤wordpress头像代码
  • 机械东莞网站建设电子商务网站建设及维护
  • 免费做印章的网站网站建设售后服务内容
  • 网站管家百度入口的链接
  • 做PPT参考图片网站 知乎安阳网站设计哪家好
  • 手机主题制作软件厦门百度seo点击软件
  • 上海比较好的网站制作公司100个游戏代码
  • 做网站用什么平台成都网站建设 Vr
  • 福海网站制作电影网站推广
  • 如何优化好一个网站自己做网站导航页
  • 南宁北京网站建设做一个网站价格
  • 网站建设的需求方案怎么写做网站tt0546
  • 提供服务好的网站制作建一个团购网站需要多少钱
  • 西安网站开发公司哪家强互联网大会官网