其他分享
首页 > 其他分享> > 使用注解动态初始化类

使用注解动态初始化类

作者:互联网

使用注解动态初始化类

两个方案

方案一

   // 实例化这个类
    Object obj = ApplicationContextHelper.instantiateBean(serviceName, c);
    // 获得这个类的所有方法
    Method[] methods = c.getMethods();

    // 循环查找想要的方法
    for (Method method : methods) {
        // 对于未使用注解method进行过滤
        XXXAnation res = method.getAnnotation(XXXAnation.class);
        if (res == null || res.xxxMethod() == null) {
            break;
        }
        。。。

    }

方案二


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface XXXAnation {

    ChannelEnums[] channel();

    /**
     * 该扩展点的业务类型
     */
    BizParamEnums biz();

    /**
     * 用于回归还是监控
     * @return
     */
    UsageEnums usage();

}



public class MyClassFactory implements BeanFactoryAware, BeanPostProcessor {



public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //虽然不会出现,但是还是校验一下
        if (bean == null) {
            return bean;
        }
        Class<?> clazz = bean.getClass();
        if (Proxy.isProxyClass(clazz) || clazz.getPackage() == null) {
            //代理类不做处理
            return bean;
        }
        String packageName = clazz.getPackage().getName();
        //SPI的实现类必须位于指定的包路径下
        String defaultPackage="com.xxx.rules";
        if (StringUtils.isEmpty(packageName) || !packageName.startsWith(defaultPackage)) {
            return bean;
        }
        //判断类上面是否有注解
        XXXAnation srule = clazz.getAnnotation(XXXAnation.class);
        //如果没有SPI注解,那么不关心,直接返回
        if (srule == null) {
            return bean;
        }
        //判断该类是否实现了基础的SPI接口
        if (!(bean instanceof RuleModel)) {
            return bean;
        }
        //到这一步说明已经满足相应SPI条件了
        //解析注解里面的配置
        UsageEnums usage = srule.usage();

        if (usage == null || "测试".equals(usage.name())) {
            return bean;
        }

        if (serviceMap.get(usage) == null) {
            serviceMap.put(usage, new ArrayList<RuleModelService>());
        }

        List<XxxService> ruleModels = serviceMap.get(usage);
        ruleModels.add((RuleModelService) bean);
        return bean;
}

}

标签:初始化,null,return,XXXAnation,clazz,bean,usage,注解,动态
来源: https://blog.csdn.net/kittyboy0001/article/details/122186596