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

西安做网站优化公司报价软文推广的优点

西安做网站优化公司报价,软文推广的优点,甘肃建设体网站首页,典型的b2b网站有文章目录 前言1. 声明注解2. 使用 Spring 的工厂拓展3. 收集策略4. 完整的代码后记 前言 需求: 用key找到对应的方法实现。使用注解的形式增量开发。 MyComponent public class Sample1 {MyMethod(key "key1")public String test2() {return "She…

文章目录

    • 前言
    • 1. 声明注解
    • 2. 使用 Spring 的工厂拓展
    • 3. 收集策略
    • 4. 完整的代码
    • 后记

前言

需求:
用key找到对应的方法实现。使用注解的形式增量开发。

@MyComponent
public class Sample1 {@MyMethod(key = "key1")public String test2() {return "Shenzhen";}
}

任意时刻都能通过key来进行依赖查找

    @Testpublic void test() {Assert.notNull(myBeanFactory.getMethod("key1"), "key1对应的方法不能为空");}

实现思路:

  1. 声明自己的类注解,并要求被 Spring 收集
  2. 声明自己的方法注解,确保可以通过反射获取
  3. 借 Spring 的能力,容器启动收集bean完成后,把bean列表交给自己,用于自己的收集策略。

1. 声明注解

  • 类注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 继承Spring的注解,确保类能被Spring扫描
@Component
public @interface MyComponent {@AliasFor(annotation = Component.class)String value() default "";
}
  • 方法注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyMethod {// 用于依赖查找的keyString key();
}

2. 使用 Spring 的工厂拓展

找到我们用注解标记的类、方法,Spring 收集完bean之后提供了拓展点供我们遍历这些bean。

  • BeanFactoryPostProcessor 接口
  • 其中 ConfigurableListableBeanFactory beanFactory 提供了容器
@Component
public class MyBeanFactory implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 找到所有注解标记的beanMap<String, Object> beanMap = beanFactory.getBeansWithAnnotation(MyComponent.class);beanMap.forEach((beanName, bean) -> {// 收集bean中用注解标记的方法 (方法先省略)// collectMethod(bean);});}
}

3. 收集策略

  • 收集策略可以很简单,这里就用一个Map收集
  • 用Spring的AnnotationUtils.findAnnotation(method, MyMethod.class) 命中标识的方法
  • 如果命中,则拿到注解中的key,收集key和Method的映射关系
    // 自己的容器private static final Map<String, Method> METHOD_MAP = new HashMap<>();public  Method getMethod(String key) {return METHOD_MAP.get(key);}private void collectMethod(Object bean) {Method[] methods = bean.getClass().getDeclaredMethods();Arrays.stream(methods)// 过滤: 只要MyMethod标识的方法 .filter(method -> Objects.nonNull(getAnnotation(method)))// 收集: 通过MyMethod的注解key,绑定依赖关系,放到自己的容器.forEach(method -> METHOD_MAP.putIfAbsent(getAnnotation(method).key(), method));}private static MyMethod getAnnotation(Method method) {return AnnotationUtils.findAnnotation(method, MyMethod.class);}

4. 完整的代码

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Component
public class MyBeanFactory implements BeanFactoryPostProcessor {private static final ConcurrentHashMap<String, Method> METHOD_MAP = new ConcurrentHashMap<>();@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 从Spring容器中获取所有MyControllerMap<String, Object> beanMap = beanFactory.getBeansWithAnnotation(MyComponent.class);beanMap.forEach((beanName, bean) -> {// 收集bean里面的所有可用方法collectMethod(bean);});}private void collectMethod(Object bean) {Method[] methods = bean.getClass().getDeclaredMethods();Arrays.stream(methods)// 过滤: 只要MyMethod标识的方法 .filter(method -> Objects.nonNull(getAnnotation(method)))// 收集: 通过MyMethod的注解key,绑定依赖关系,放到自己的容器.forEach(method -> METHOD_MAP.putIfAbsent(getAnnotation(method).key(), method));}private static MyMethod getAnnotation(Method method) {return AnnotationUtils.findAnnotation(method, MyMethod.class);}public  Method getMethod(String key) {return METHOD_MAP.get(key);}
}

后记

记录下用到的 Spring 的 api 和工具

  • 一个核心的接口方法获取bean容器
    BeanFactoryPostProcessor#postProcessBeanFactory

  • 获取指定注解修饰的类
    ConfigurableListableBeanFactory#getBeansWithAnnotation

  • 获取方法上的注解内容
    AnnotationUtils#findAnnotation

http://www.dt0577.cn/news/36178.html

相关文章:

  • 用ps设计网站做多大的友情链接工具
  • 怎么做网站广告百度卖货平台
  • 微网站建设方向seo准
  • 爱生活辽宁移动app谷歌排名网站优化
  • 帮人做淘宝网站骗钱沧州百度推广公司
  • 网站建设公司兴田德润i优惠吗google 浏览器
  • 做网站后端的全部步骤今日国内新闻10则
  • 携程网站建设进度及实施过程知乎推广
  • 商务服饰网站建设重庆网络推广外包
  • 动态网站开发的架构宁德市房价
  • 兰州做网站es5188做微商怎么找客源加人
  • 设计网站的结构时2022最火营销方案
  • 江西省网站开发详细描述如何进行搜索引擎的优化
  • 企业如何推广网站企业网站排名优化
  • 网站开发搜索功能推广策划方案模板
  • python自学网站免费菜鸟教程宁波seo公司推荐
  • 大方做网站互联网外包公司有哪些
  • 网站改版 目的百度竞价项目
  • 较成功营销网站的例子2023年百度小说风云榜
  • 网站要咋做磁力搜索
  • 小程序原生开发google seo教程
  • ps和vscode做网站国际新闻稿件
  • 专业网站制作团队专业网站制作团队凡科建站教程
  • 网页制作工具的选择与网站整体网络没有关系咸阳网站建设公司
  • 怎么创造免费网站舆情网站
  • 网站做宣传的免费渠道有那种单页站好做seo吗
  • 浙江省台州市做网站多少钱b2b自动发布信息软件
  • 企业网站建设报价宁波优化系统
  • 创意礼物网站建设与管理宁波seo优化公司排名
  • 外贸英语 网站东莞seo优化排名