Java spring beanpostprocessor不';组件扫描不工作?

Java spring beanpostprocessor不';组件扫描不工作?,java,spring,Java,Spring,我有很多cookiecuter Springbean,不想用xml显式地定义每一个。所以我走了元件扫描路线,这让我可以做到这一点。这很好,但我刚刚意识到使用组件扫描技术加载的bean不会调用MyBeanPostProcessor。MyBeanPostProcessor只是尝试在这些bean上执行一些setter注入。下面的配置仅显示了我尝试的这种方法,但它不起作用。还有什么其他的方法可以在这些豆子上进行塞特注射吗 我正在使用Spring 2.5.5 谢谢, 本 加载应用程序上下文后,检查您注释的

我有很多cookiecuter Springbean,不想用xml显式地定义每一个。所以我走了元件扫描路线,这让我可以做到这一点。这很好,但我刚刚意识到使用组件扫描技术加载的bean不会调用MyBeanPostProcessor。MyBeanPostProcessor只是尝试在这些bean上执行一些setter注入。下面的配置仅显示了我尝试的这种方法,但它不起作用。还有什么其他的方法可以在这些豆子上进行塞特注射吗

我正在使用Spring 2.5.5

谢谢, 本


加载应用程序上下文后,检查您注释的bean是否可用


由于您关闭了“annotation config”,我怀疑它忽略了您的注释。

这是我的测试用例,它似乎可以工作(Spring 2.5.6)。为了简洁起见,我曾考虑排除一些文件,但我决定不这样做

Start.java(入口点)

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>
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.springframework.context.support.ClassPathXmlApplicationContext@c1b531: display name [org.springframework.context.support.ClassPathXmlApplicationContext@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.springframework.context.support.ClassPathXmlApplicationContext@c1b531]: org.springframework.beans.factory.support.DefaultListableBeanFactory@121f1d 2009-aug-26 15:44:02 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@121f1d: defining beans [customBean,beanProcessor]; root of factory hierarchy instantiating component before customBean after customBean 2009年8月26日15:44:02 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息:刷新org.springframework.context.support。ClassPathXmlApplicationContext@c1b531:显示名称[org.springframework.context.support]。ClassPathXmlApplicationContext@c1b531]; 启动日期[Wed Aug 26 15:44:02 CEST 2009];上下文层次结构的根 2009年8月26日15:44:02 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息:从类路径资源[se/waxwing/test/Context.XML]加载XMLBean定义 2009年8月26日15:44:02 org.springframework.context.support.AbstractApplicationContext获得FreshBeanFactory 信息:应用程序上下文的Bean工厂[org.springframework.context.support]。ClassPathXmlApplicationContext@c1b531]:org.springframework.beans.factory.support。DefaultListableBeanFactory@121f1d 2009年8月26日15:44:02 org.springframework.beans.factory.support.DefaultListableBeanFactory预实例化单例 信息:在org.springframework.beans.factory.support中预实例化单例。DefaultListableBeanFactory@121f1d:定义bean[customBean,beanProcessor];工厂层次结构的根 实例化组件 在customBean之前 在customBean之后
因此,正如您所看到的,
customBean
bean是由我的类型过滤器找到的,作为bean添加的,当
applicationContext.getBean(“customBean”)出现时
被调用一个新对象被实例化,然后它被传递给我的post bean处理器。

如果您尝试显式地添加一个bean定义而不是使用类路径扫描,会发生什么?你能确认后处理器在这种情况下工作吗?是的,我确实确认beanpostprocessor在那种情况下工作。你在寻找beanpostprocessor的替代品吗?或者,您的主要目标是让组件扫描在使用或不使用BeanPostProcessor的情况下工作?替代方案会很好,尽管我不确定是否有。我的要求是:-自动加载bean,需要显式定义它们-执行一些简单的setter注入“使用组件扫描技术加载的bean不需要调用MyBeanPostProcessor。”我真的不知道该怎么说。使用组件扫描技术定义的bean不会传递给MyBeanPostProcessor。MyBeanPostProcessor只是尝试执行一些setter注入。MyBeanPostProcessor适用于我在xml中显式定义的bean。即使我关闭了annotation config并使用自定义类型过滤器。我认为你最好的选择是尝试后退几步:尝试隔离问题。我看到你有自己的范围解析器-这可能是罪魁祸首(不是说它应该引起问题-但这是一种可能性)。是的,我已经验证了bean是可用的。我写了我自己的过滤器,这就是为什么我关闭了注释配置。我是个白痴!在我下载了Spring2.5.6并试用了它之后(它仍然是坏的),我注意到我没有调用applicationContext.getBean(“customBean”)!所以它实际上一直在为我工作——只是我确认它坏了的方式!感谢您提交代码并确认其有效。我想给你赏金,但我不知道怎么给。没有复选框或任何东西-根据这句话:我猜你运气不好?没问题,它让我玩自定义范围解析程序和类型过滤器,这是一件好事。我猜我在那笔赏金上运气不好——无法与体制抗衡。:)
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;
    }

}
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.springframework.context.support.ClassPathXmlApplicationContext@c1b531: display name [org.springframework.context.support.ClassPathXmlApplicationContext@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.springframework.context.support.ClassPathXmlApplicationContext@c1b531]: org.springframework.beans.factory.support.DefaultListableBeanFactory@121f1d 2009-aug-26 15:44:02 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@121f1d: defining beans [customBean,beanProcessor]; root of factory hierarchy instantiating component before customBean after customBean