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

咸阳营销型网站建设wordpress shop主题

咸阳营销型网站建设,wordpress shop主题,北京企业建站公司,建个什么网站吗文章目录 1、策略模式2、聚合策略类实现方式一3、聚合策略类实现方式二4、对比5、补充:ApplicationContextAware接口 1、策略模式 近期工作中,需要处理4.x和5.x两个版本的数据,所以自然想到的是策略模式,写一个抽象类&#xff0c…

文章目录

  • 1、策略模式
  • 2、聚合策略类实现方式一
  • 3、聚合策略类实现方式二
  • 4、对比
  • 5、补充:ApplicationContextAware接口

1、策略模式

近期工作中,需要处理4.x和5.x两个版本的数据,所以自然想到的是策略模式,写一个抽象类,然后两个版本分别实现抽象类,以后也好扩展。

public interface ClusterMetaDataProcessor {void processData();}
public class Version4ClusterMetaDataProcessor implements ClusterMetaDataProcessor {@Overridevoid processData() {//...}
}
public class Version5ClusterMetaDataProcessor implements ClusterMetaDataProcessor {@Overridevoid processData() {//...}
}

然后写个聚合策略类,或者叫环境类,给调用者统一使用,此时有两种实现方式,如下

2、聚合策略类实现方式一

使用ApplicationContextAware接口获取实现类的Bean对象:

@Component
public class MetaDataProcessorFactory implements ApplicationContextAware {private final Map<String, ClusterMetaDataProcessor> PROCESSOR_MAP = new ConcurrentHashMap<>();public ClusterMetaDataProcessor getProcessor(String version) {ClusterMetaDataProcessor processor = PROCESSOR_MAP.get(version);if (processor == null) {throw new RuntimeException("Unknown version: " + version);}return processor;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {PROCESSOR_MAP.put("4.x", applicationContext.getBean(Version4ClusterMetaDataProcessor.class));PROCESSOR_MAP.put("5.x", applicationContext.getBean(Version5ClusterMetaDataProcessor.class));}}

3、聚合策略类实现方式二

这种方式,实现的核心是自动装配,当 Spring 处理 @Bean 方法的参数时,若参数类型为 List<T>,容器会自动扫描所有​类型是 T 或其子类的Bean,所有符合条件的 Bean 会被收集到 List 中,注入顺序与 Bean 的定义顺序一致​(可通过 @Order 注解或配置文件调整),以后要新增6.x的处理器逻辑,只需新增实现 ClusterMetaDataProcessor 的 Bean,无需修改现有的代码,符合开闭原则


@Configuration
public class MetaDataProcessorFactory {@Bean(name = "clusterMetaDataProcessorMap")public Map<String, ClusterMetaDataProcessor> clusterMetaDataProcessorMap(List<ClusterMetaDataProcessor> processorList) {Map<String, ClusterMetaDataProcessor> processorMap = new HashMap<>();for (ClusterMetaDataProcessor processor : processorList) {if (processorMap.put(processor.getVersion(), processor) != null) {throw new IllegalStateException("Duplicate key for cluster metadata processor: " + processor.getVersion());}}return processorMap;}}

在Service层代码中注入这个Map,使用@Qualifier指定前面定义时起的Bean的名字即可:

@Service
public class ServiceA {private final Map<String, ClusterMetaDataProcessor> clusterMetaDataProcessorMap;public ServiceA(@Qualifier("clusterMetaDataProcessorMap") Map<String, ClusterMetaDataProcessor> clusterMetaDataProcessorMap) {this.clusterMetaDataProcessorMap = clusterMetaDataProcessorMap;}
}

4、对比

特性​​@Bean + List<T>方案​手动注册方案(ApplicationContextAware)​​
​扩展性​支持动态新增处理器版本需手动修改代码注册新版本
​代码简洁性​ 更简洁,无需实现接口代码冗长,需手动管理版本号

5、补充:ApplicationContextAware接口

实现ApplicationContextAware接口,重写setApplicationContext方法,setApplicationContext方法的执行时机:

  • Spring 容器首先会根据配置(XML/注解)实例化 Bean 对象
  • 然后完成该 Bean 的属性注入(例如通过 @Autowired 或 XML 的 <property> 标签注入的其他 Bean)
  • 此时,如果该 Bean 实现了 ApplicationContextAware 接口,容器就会调用 setApplicationContext 方法
  • 最后再是@PostConstruct、自定义的 init-method等初始化Bean的操作

简单说就是:

1. 实例化 Bean 对象
2. 执行依赖注入(设置字段值)
3. 调用 `setApplicationContext` (如果 Bean 实现 ApplicationContextAware)
4. 执行初始化回调(如 @PostConstruct / init-method)
5. Bean 可用(被其他 Bean 引用)

举个例子:

@Component
public class MyBean implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {// 此时可以立即使用 context 获取其他 BeanMyService service = context.getBean(MyService.class);}
}

当 Spring 容器启动时,MyBean 会被实例化 → 注入依赖 → 调用 setApplicationContext → 最后执行初始化方法


文章转载自:

http://i0Bhc21t.ddtdy.cn
http://8DFlcdaA.ddtdy.cn
http://h3GdAiTq.ddtdy.cn
http://aNV6GnrE.ddtdy.cn
http://UAbnfBAZ.ddtdy.cn
http://FUP7EQ24.ddtdy.cn
http://JH9fDMvZ.ddtdy.cn
http://hGc56k4E.ddtdy.cn
http://9jkQH7Z3.ddtdy.cn
http://Vuc3Tdej.ddtdy.cn
http://fNsEWaLj.ddtdy.cn
http://QLINihpf.ddtdy.cn
http://Yin0dM24.ddtdy.cn
http://4bOjJOn7.ddtdy.cn
http://aDrQHJdE.ddtdy.cn
http://QkRIojIK.ddtdy.cn
http://2XUEqdUu.ddtdy.cn
http://zSFxr0J0.ddtdy.cn
http://rFy7lSAw.ddtdy.cn
http://Drb5cs1B.ddtdy.cn
http://TeOeIoAg.ddtdy.cn
http://6XYJv5T8.ddtdy.cn
http://nZKy8GzY.ddtdy.cn
http://6bNufu9Y.ddtdy.cn
http://nMhQesuz.ddtdy.cn
http://aJLsn402.ddtdy.cn
http://hLg8IFFO.ddtdy.cn
http://cr5vqoys.ddtdy.cn
http://fnSHmzZV.ddtdy.cn
http://qmPJhsI3.ddtdy.cn
http://www.dtcms.com/wzjs/694025.html

相关文章:

  • 网站租房做公寓微网站设计企业
  • 做网站界面用什么软件零基础学wordpress课件
  • 国际购物网站平台有哪些最美情侣视频免费观看完整版高清
  • 导航网站策划2020国内十大小说网站排名
  • 长沙做网站公司哪家网站建设的维护
  • 怎样做网站优化网站建设人员配置
  • 做网站的项目实施方案设备高端网站建设
  • 建设官方网站企业网站人人设计网官方网站
  • 南昌盗网站少优化公司做国外网站收款怎么收
  • 排名优化方案seo技术培训海南
  • 做单屏网站 高度是多少怎样建设网站呢
  • 交互做的好网站怎么用ppt做网站设计
  • 网站建设的目地三水网站建设哪家好
  • 学校网站建设要点全返利网站建设
  • wordpress文章图片粘贴固定大小汕头百度seo电话
  • 美创网站建设优势景观设计论文
  • 网站页面权重游戏开发需要学什么编程
  • 临沂做外贸网站的公司做网站里面内容编写
  • 国外设计网站及介绍广西建设职业技术学院贫困生网站
  • 广西新宇建设项目有限公司网站建站素材
  • 网站后台有些不显示做视频网站违法么
  • 甘肃省建设厅特种工查询网站网站建设asp编程
  • 网站建设知识点有哪些漏缺海口网站
  • 菏泽市城乡和建设局网站建设摩托车官网报价表
  • 哪些网站可以做兼职建购物网站需要些什么
  • 最常见企业网站有哪些html编辑器手机
  • 遵义在百度做个网站多少钱网络推广工作室 是干啥的
  • 南和网站建设公司太原网站建设金华网站建设开发
  • 罗湖建设网站怎样淘宝seo排名优化
  • 网站必须做301重定向吗旅游网站开发周期