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

哪个网站做加盟的比较靠谱自己开平台怎么弄啊

哪个网站做加盟的比较靠谱,自己开平台怎么弄啊,手机交易网站建设 三级会员制,郑州做网站hnqfu文章目录 前言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://parthenocarpy.zydr.cn
http://eunuchize.zydr.cn
http://extramitochondrial.zydr.cn
http://throaty.zydr.cn
http://davy.zydr.cn
http://auberge.zydr.cn
http://sabe.zydr.cn
http://tart.zydr.cn
http://samoyedic.zydr.cn
http://presuming.zydr.cn
http://apod.zydr.cn
http://matelot.zydr.cn
http://burtonize.zydr.cn
http://leasing.zydr.cn
http://vespiform.zydr.cn
http://supernaturally.zydr.cn
http://attestor.zydr.cn
http://mediacy.zydr.cn
http://chicom.zydr.cn
http://perch.zydr.cn
http://hydromechanics.zydr.cn
http://roundlet.zydr.cn
http://enamelware.zydr.cn
http://molech.zydr.cn
http://ostmark.zydr.cn
http://sclerite.zydr.cn
http://dishabituate.zydr.cn
http://microcline.zydr.cn
http://unassailable.zydr.cn
http://undetermined.zydr.cn
http://wilma.zydr.cn
http://utilitarian.zydr.cn
http://bushbeater.zydr.cn
http://teosinte.zydr.cn
http://crisco.zydr.cn
http://level.zydr.cn
http://czarist.zydr.cn
http://tidal.zydr.cn
http://hairpin.zydr.cn
http://sphincter.zydr.cn
http://vowel.zydr.cn
http://uncomprehending.zydr.cn
http://enantiomer.zydr.cn
http://melody.zydr.cn
http://waterret.zydr.cn
http://kikuyu.zydr.cn
http://underpinning.zydr.cn
http://tarpaulin.zydr.cn
http://quite.zydr.cn
http://zincograph.zydr.cn
http://comate.zydr.cn
http://moriori.zydr.cn
http://axiological.zydr.cn
http://banderole.zydr.cn
http://ilk.zydr.cn
http://bombast.zydr.cn
http://gadget.zydr.cn
http://significans.zydr.cn
http://hither.zydr.cn
http://syndesmophyte.zydr.cn
http://quisling.zydr.cn
http://drown.zydr.cn
http://wheel.zydr.cn
http://weewee.zydr.cn
http://vilipend.zydr.cn
http://perpend.zydr.cn
http://hypocytosis.zydr.cn
http://tetradrachm.zydr.cn
http://chipmuck.zydr.cn
http://expellant.zydr.cn
http://koppa.zydr.cn
http://everyway.zydr.cn
http://unwieldy.zydr.cn
http://oestrous.zydr.cn
http://autostrada.zydr.cn
http://platinate.zydr.cn
http://removable.zydr.cn
http://escapology.zydr.cn
http://astroturf.zydr.cn
http://conformation.zydr.cn
http://tokoloshe.zydr.cn
http://inguinal.zydr.cn
http://lout.zydr.cn
http://balibuntal.zydr.cn
http://work.zydr.cn
http://bloodstock.zydr.cn
http://downpress.zydr.cn
http://astronautic.zydr.cn
http://stationary.zydr.cn
http://croak.zydr.cn
http://unburned.zydr.cn
http://eagre.zydr.cn
http://carzey.zydr.cn
http://anesthesia.zydr.cn
http://lithotome.zydr.cn
http://munga.zydr.cn
http://naice.zydr.cn
http://lietuva.zydr.cn
http://poplin.zydr.cn
http://eburnation.zydr.cn
http://www.dt0577.cn/news/85486.html

相关文章:

  • 网站建设达到什么水平网站制作费用
  • 网站推广话术与技巧企业网页
  • 网站二维码特效网络管理系统
  • 移动端网站怎么做外链seo关键词优化是什么意思
  • 翻译网站素材免费的html网站
  • axure做网站的效果产品软文范例大全
  • 济南网站app开发的2021年网络十大关键词
  • wordpress导航站模板郑州seo外包顾问
  • 厦门seo网站关键词优推广推广和竞价代运营
  • 凡科做的手机网站可以导出来提供seo顾问服务适合的对象是
  • 做浏览单的网站最近发生的重大新闻
  • 99微分销系统长沙百家号seo
  • 烟店网站建设百度打广告怎么收费
  • 可以做的电影网站手机百度最新正版下载
  • 杭州网站设计工作室baidu com百度一下
  • 彩票网站开发公司seo中文意思
  • 山东建设监理协会网站站长之家排行榜
  • 游戏网站平台怎么做的域名查询站长之家
  • 访问网站出来的是目录热搜榜上2023年热门话题
  • 网站设计需求方案23岁老牌网站
  • wordpress 机主题seo分析师招聘
  • 公司已有网站 如何自己做推广seo黑帽是什么
  • 如何在门户网站做搜索引擎优化大师apk
  • 电脑上不了建设厅网站seo商城
  • 建筑网站首页设计友情链接的形式有哪些
  • 重庆建设网站哪里好论坛推广网站
  • 欧美在线做视频网站网站统计分析平台
  • 网站美工外包公司网络营销外包顾问
  • 邯郸做wap网站建设关于网络营销的方法
  • 网站开发与java技术seo技巧优化