這是我的測試用例,似乎工作(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處理器。
如果嘗試顯式添加一個bean定義而不是使用類路徑掃描,會發生什麼?你能確認後置處理器在那種情況下工作嗎? – skaffman 2009-07-13 19:40:14
是的,我確認beanpostprocessor在這種情況下工作 – andersonbd1 2009-07-13 23:26:20
您是否在尋找用於注入的BeanPostProcessor的替代方法?或者,您的主要目標是使用或不使用BeanPostProcessor來進行組件掃描? – 2009-08-19 19:35:41