1

与えられたクラス:

public ClassA {
    @Autowired
    @SomeAnnotation("foo")
    private ClassB bar;
}

@Component
@Scope(prototype)
public ClassB {
    private String someString;
}

値を「foo」に設定できるように、構築時に注入されるインスタンスにClassBアクセスできるBeanプロセッサ(ポストコンストラクト...)を作成したいと思います。@SomeAnnotationClassBsomeString

私はこれがあまりIoCではないことを知っており、実行できないと推測しています。

4

1 に答える 1

1

@PostConstructofを使用して、次のようなことができる場合がありますClassA

@PostConstruct
public void postConstruct(){
  SomeAnnoation someAnnotation =  this.getClass().getField("bar").getAnnotation(SomeAnnotation.class);
  bar.someString(someAnnotation.value());
}

更新: - BeanPostProcessor を使用した一般的なソリューション:

public class SomeAnnotationFieldInitalizer implements BeanPostProcessor{

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        Field[] fields = bean.getClass().getFields();
        if (fields!=null){
            for (Field field:fields){
                SomeAnnotation someAnnotation = field.getAnnotation(SomeAnnotation.class);
                if (someAnnotation!=null){
                    try {
                        ReflectionUtils.makeAccessible(field);
                        field.set(bean, someAnnotation.value());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return bean;
    }
}
于 2012-10-19T12:18:53.873 に答える