1

スプリング BeanPostProcessor を実装するクラス A があります

public class A implements BeanPostProcessor {


   private B b;

   public A() {
      b = new B();
      b.set(...);          
   }


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

   // Intercept all bean initialisations and return a proxy'd bean equipped with code
   // measurement capabilities
   public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    return b.enhance(bean);
   }


}

派生した BeanPostProcessor クラス A 内にあるクラス b を構成したいと思います。Spring でこのクラスを構成 (依存性注入) するにはどうすればよいですか? これは BeanPostProcessor の内部として可能ですか?

4

2 に答える 2

2

クラス@Configurationあり

public static class Child {}

public static class Processor implements BeanPostProcessor {        
    @Autowired
    public Child child;             
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return null; // Spring would complain if this was executed
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return null; // Spring would complain if this was executed
    }       
}

@Configuration
public static class Config {
    @Bean
    public static Processor processor() {
        return new Processor();
    }
    @Bean
    public Child child() {
        return new Child();
    }
}

public static void main(String[] args) throws IOException, ParseException, JAXBException, URISyntaxException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException {     
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
    Processor processor = context.getBean(Processor.class);
    System.out.println(processor.child);
}

BeanPostProcessorまだ「存在」していないため、作成中の他の Bean を処理できません (@Autowiredこの Bean を終了するには が必要です)。javadocの状態

ApplicationContexts は、Bean 定義で BeanPostProcessor Bean を自動検出し、その後作成される任意の Beanに適用できます。

大胆な鉱山。

XML を使用

<context:component-scan base-package="test"></context:component-scan>
<bean id="processor" class="test.Main.Processor"></bean>
<bean id="child" class="test.Main.Child"></bean>

ClassPathXmlApplicationContext xmlContext = new ClassPathXmlApplicationContext("context.xml");
processor = xmlContext.getBean(Processor.class);
System.out.println(processor.child);
于 2013-08-29T13:48:38.507 に答える
1

もちろん、BeanPostProcessor クラスに依存性注入を適用できます。

以下は、 Spring ドキュメントからの抜粋です。

BeanPostProcessor インターフェースを実装するクラスは特殊であるため、コンテナーによって異なる方法で処理されます。すべての BeanPostProcessor とそれらが直接参照する Bean は、起動時に ApplicationContext の特別な起動フェーズの一部としてインスタンス化され、その後、これらすべての BeanPostProcessor がソートされた方法で登録され、その後のすべての Bean に適用されます。

于 2013-08-29T13:49:49.513 に答える