2012-10-19 52 views
1

給出一個類:我可以在bean的實例訪問註解被注入

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

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

我想寫一些豆處理器(後構建...),可以在ClassB施工時間能訪問@SomeAnnotationClassB正在注入的實體,以便我可以將someString的值設置爲「foo」。

我知道這不是IoC,我會猜測它無法完成。

回答

1

您也許能夠做這樣的事與@PostConstructClassA的:

@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; 
    } 
} 
+0

所以我會實現這個方法在所有我想成爲'ClassA'類的類上。我在尋找一個通用的解決方案,例如可以在Spring上下文中註冊的BeanPostProcessor。 – Tnem

+0

好吧,這是一個很好的想法,你實際上可以將相同的代碼移動到豆後期處理器,它應該仍然有效,我已經添加了一個更新的答案。 –

相關問題