将注释定义为
@Documented
@Target({ ANNOTATION_TYPE })
@Retention(RUNTIME)
public @interface Transform {
Class<? extends Transformer<?, ?>>[] transformBy();
}
public interface Transformer<A extends Annotation, T> {
/**
* <p>Implement the transform logic according to the way you want
*
* @param value
* @return
*/
public Object doTransform(T value);
}
现在,当我想使用变换器时,它可以创建像
这样的注释@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Transform(transformBy=CommandRuleConstraintTransformer.class)
public @interface CommandStateTransformer {
String message() default "Command Transformation.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
并且转换注释中transformed by
中定义的实现类将执行如下逻辑:
public class CommandRuleConstraintTransformer implements Transformer<CommandStateTransformer, Object>{
@Override
public Object doTransform(Object target) {
try {
// Fire rules
commandStatelessKSession.execute(Arrays.asList(new Object[]{target}));
}catch (Exception e) {
LOG.error("[EXCEPTION]- Transforming command state {}",e.toString());
}
return target;
}
}
我的问题是,我将如何指导spring,扫描和管理工厂bean,并且在需要时可以轻松地调用这样:
@Autowired
private TransformerFactory transformerFactory;
transformerFactory.doTransform(someargs);
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
的工作原理类似。
请帮助......谢谢
答案 0 :(得分:0)
这样做的一种方法(我不确定最简单)是:您可以将自己的CommonAnnotationBeanPostProcessor实现添加到Spring配置中。就像那样
@Bean
public CommonAnnotationBeanPostProcessor commonAnnotationBeanPostProcessor() {
return new MyBeanPostProcessor();
}
然后覆盖其中一个可用的公共方法,如
public class MyBeanPostProcessor extends CommonAnnotationBeanPostProcessor {
@Override
public PropertyValues postProcessPropertyValues(PropertyValues pvs,
PropertyDescriptor[] pds, Object bean, String beanName)
throws BeansException {
// TODO
return super.postProcessPropertyValues(pvs, pds, bean, beanName);
}
}
然后每当spring执行自动装配魔法时,你的方法就会被调用。拥有bean对象和类,你可以访问字段和它们的注释,所以基本上你可以做任何你想做的事。