Spring方法使用类似于LocalValidatorFactoryBean的基于工厂模式的自定义注释

时间:2014-04-10 16:50:28

标签: java spring

将注释定义为

@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"/>的工作原理类似。

请帮助......谢谢

1 个答案:

答案 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对象和类,你可以访问字段和它们的注释,所以基本上你可以做任何你想做的事。