2009-07-13 131 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”,它忽略了你的注释。