1

给定一个类:

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

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

我想编写一些 bean 处理器(构造后...),它可以在ClassB构造时访问正在注入@SomeAnnotation的实例,以便我可以将值设置为“foo”。ClassBsomeString

我知道这不是非常 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 回答