2009-07-13 132 views
3

我有許多餅乾彈簧豆,不想明確定義每一個在XML中。所以我去了組件掃描路線,讓我這樣做。這很好,但我只是意識到MyBeanPostProcessor並沒有被使用組件掃描技術加載的bean調用。 MyBeanPostProcessor只是試圖對這些bean做一些setter注入。下面的配置只是顯示了我嘗試過的這種方法,這是行不通的。任何其他的想法如何做這些豆二傳手注射?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 2009-07-13 19:40:14

+0

是的,我確認beanpostprocessor在這種情況下工作 – andersonbd1 2009-07-13 23:26:20

+0

您是否在尋找用於注入的BeanPostProcessor的替代方法?或者,您的主要目標是使用或不使用BeanPostProcessor來進行組件掃描? – 2009-08-19 19:35:41

回答

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()); 
    } 
} 

這將產生以下的輸出:

 
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 

所以,你可以看到,customBean豆被發現我的類型過濾器,添加爲一個bean,並且當applicationContext.getBean("customBean")被稱爲一個新對象是instan然後將它傳遞給我的發佈bean處理器。

-1

應用程序上下文後加載的支票,你已經詮釋了豆可用。

我懷疑你關掉了「annotation-config」,它忽略了你的註釋。