使用注解动态初始化类
作者:互联网
使用注解动态初始化类
两个方案
方案一
// 实例化这个类
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