Hier ist mein Testfall, der scheint zu funktionieren (Frühling 2.5.6). Ich habe darüber nachgedacht, einige Dateien aus Platzgründen auszublenden, aber ich habe mich dagegen entschieden.
Start.java (Einstiegspunkt)
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 (dies ist die möchte ich finden - siehe 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());
}
}
Dies erzeugt die folgende Ausgabe:
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
So, wie Sie gefunden sehen können, wurde die customBean
Bean Mein Typ Filter, als Bean hinzugefügt, und wenn applicationContext.getBean("customBean")
aufgerufen wurde, wurde ein neues Objekt instan tiated und dann wurde es an meinen Post-Bean-Prozessor übergeben.
Was passiert, wenn Sie versuchen, eine Bean-Definition explizit hinzuzufügen, statt die Klassenpfadprüfung zu verwenden? Können Sie bestätigen, dass der Postprozessor in diesem Fall funktioniert? – skaffman
Ja, ich habe bestätigt, dass der Beanpostprozessor in diesem Fall funktioniert – andersonbd1
suchen Sie nach Alternativen zum BeanPostProcessor für die Injektion? Oder ist Ihr primäres Ziel, den Component-Scan mit oder ohne BeanPostProcessor arbeiten zu lassen? –