2009-07-13 8 views
3

私は多くのクッキーカッターの豆を持っており、明示的にそれぞれをxmlで定義したくありません。そこで、私はこれをやり遂げることができるコンポーネントスキャニングルートに行きました。これはいいですが、コンポーネントスキャン技術を使って読み込まれたBeanに対してMyBeanPostProcessorが呼び出されていないことに気付きました。 MyBeanPostProcessorは、単にこれらのBeanに対していくつかのセッター注入を試みます。以下の設定は私が試したこのアプローチを示していますが、うまくいきません。どのようにこれらの豆のセッター注入を行うための他のアイデア?spring beanpostprocessorはコンポーネントスキャンで機能しませんか?

アプリケーションコンテキストを使用して、注釈を付けてきた豆が利用可能であることを確認をロードした後、私は春2.5.5

おかげで、 ベン

<context:component-scan base-package="us.benanderson" 
     use-default-filters="false" 
     annotation-config="false" 
     scope-resolver="us.benanderson.MyScopeResolver" 
     name-generator="us.benanderson.MyBeanNameGenerator"> 
    <context:include-filter type="custom" expression="us.benanderson.MyTypeFilter" /> 
</context:component-scan> 
<bean class="us.benanderson.MyBeanPostProcessor"> 
    <property name="order" value="500" /> 
</bean> 
+0

クラスパススキャンを使用する代わりに明示的にBean定義を追加しようとするとどうなりますか?ポストプロセッサがその場合に動作することを確認できますか? – skaffman

+0

はい、私はbeanpostprocessorがその場合に動作することを確認しました – andersonbd1

+0

注射のためのBeanPostProcessorの代替案を探していますか?または、BeanPostProcessorの有無にかかわらずコンポーネントスキャンを実行することの主な目標は何ですか? –

答えて

5

これは私のテストケースです。動作するようです(Spring 2.5.6)。簡潔にするためにいくつかのファイルを除外することを考えましたが、私はそれに反対しました。

Start.java(エントリー・ポイント)

package se.waxwing.test; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class Start { 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("se/waxwing/test/Context.xml"); 
     context.getBean("customBean"); 
    } 
} 

のcontext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 


    <context:component-scan base-package="se.waxwing.test" 
     use-default-filters="false" 
     annotation-config="false" 
     scope-resolver="se.waxwing.test.MyScopeResolver"> 
     <context:include-filter type="custom" expression="se.waxwing.test.MyTypeFilter" /> 
    </context:component-scan> 

    <bean id="beanProcessor" class="se.waxwing.test.MyBeanPostProcessor" /> 

</beans> 

CustomBean.java(これは私が見つけたい - MyTypeFilterを参照してください)

package se.waxwing.test; 

public class CustomBean { 

    public CustomBean() { 
     System.err.println("instantiating component"); 
    } 
} 

MyBeanPostProcessor.java

package se.waxwing.test; 

import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.config.BeanPostProcessor; 

public class MyBeanPostProcessor implements BeanPostProcessor { 

    public MyBeanPostProcessor() { 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     System.err.println("after " + beanName); 
     return bean; 
    } 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     System.err.println("before " + beanName); 
     return bean; 
    } 
} 

MyScopeResolver.java

package se.waxwing.test; 

import org.springframework.beans.factory.config.BeanDefinition; 
import org.springframework.context.annotation.ScopeMetadata; 
import org.springframework.context.annotation.ScopeMetadataResolver; 
import org.springframework.context.annotation.ScopedProxyMode; 

public class MyScopeResolver implements ScopeMetadataResolver { 

    @Override 
    public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) { 
     ScopeMetadata result = new ScopeMetadata(); 
     result.setScopedProxyMode(ScopedProxyMode.NO); 
     result.setScopeName("prototype"); 
     return result; 
    } 

} 

MyTypeFilter.java

package se.waxwing.test; 

import java.io.IOException; 

import org.springframework.core.type.classreading.MetadataReader; 
import org.springframework.core.type.classreading.MetadataReaderFactory; 
import org.springframework.core.type.filter.TypeFilter; 

public class MyTypeFilter implements TypeFilter { 

    @Override 
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { 
     return metadataReader.getClassMetadata().getClassName().equals(CustomBean.class.getCanonicalName()); 
    } 
} 

これは以下の出力生成:あなたが見ることができるよう、customBean Beanがで見つかった、だから、

 
2009-aug-26 15:44:02 org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing org[email protected]c1b531: display name [org[email protected]c1b531]; startup date [Wed Aug 26 15:44:02 CEST 2009]; root of context hierarchy 
2009-aug-26 15:44:02 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [se/waxwing/test/Context.xml] 
2009-aug-26 15:44:02 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory 
INFO: Bean factory for application context [org[email protected]c1b531]: org.s[email protected]121f1d 
2009-aug-26 15:44:02 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]121f1d: defining beans [customBean,beanProcessor]; root of factory hierarchy 
instantiating component 
before customBean 
after customBean 

を私の型フィルターは、beanとして追加され、applicationContext.getBean("customBean")と呼ばれたときに新しいオブジェクトinstan私のポストビーンプロセッサーに渡されました。

+0

私はばかです!私がspring 2.5.6をダウンロードして試してみたところ、まだ壊れていました。私はapplicationContext.getBean( "customBean")を呼び出さなかったという事実に気付きました!だから実際に私のために働いていた - それが壊れていることを確認する私の方法!コードを送信して、動作していることを確認していただきありがとうございます。私はあなたに恩恵を与えたいと思っていますが、私はどのように知りません。チェックボックスや何もありません。これに応じて: http://meta.stackexchange.com/questions/13421/cant-accept-answer-for-bountied-question-on-serverfault 私はあなたが運が去ったと思います? – andersonbd1

+0

問題はありませんが、カスタムスコープリゾルバとタイプフィルタで遊ぶことができました。これは良いことです。私はその賞金に恵まれていないと思う - システムと戦うことはできない。 :) – waxwing

-1

を使用しています。

「annotation-config」を無効にしているため、注釈を無視していると思われます。

+0

はい、私は豆が利用可能であることを確認しました。私は独自のフィルタを書いたので、annotation-configを無効にしたのです。 – andersonbd1

関連する問題