Spring BeanFactoryPostProcessor 问题
我想创建一个将 bean 添加到当前 ApplicationContext 的 Spring BeanFactoryPostProcessor。
我有很多 Web 服务定义,spring-ws-config.xml
我想尽可能地减少。
XML 配置
配置如下:
<bean id="menu"
class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"
lazy-init="true">
<property name="schemaCollection">
<bean
class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
<property name="inline" value="true" />
<property name="xsds">
<list>
<value>classpath:xsd.xsd</value>
</list>
</property>
</bean>
</property>
<property name="portTypeName" value="portType" />
<property name="serviceName" value="serviceName" />
<property name="locationUri" value="/endpoints" />
</bean>
Java 配置
因此,我使用以下 bean 定义创建了一个 @Configuration 类:
@Bean
@Lazy
public DefaultWsdl11Definition webService() throws IOException {
logger.info("Creating Web Service");
DefaultWsdl11Definition toRet = new DefaultWsdl11Definition();
toRet.setPortTypeName("portType");
toRet.setServiceName("serviceName");
CommonsXsdSchemaCollection collection = new CommonsXsdSchemaCollection();
collection.setInline(true);
collection.setXsds(new Resource[] { new ClassPathResource("path1") });
collection.afterPropertiesSet();
toRet.setSchemaCollection(collection);
toRet.setLocationUri("/endpoints");
return toRet;
}
这好多了!但是我想减少更多,所以我想创建一个名为@WebServiceDefinition的注释,并添加一个BeanFactoryPostProcessor来自动创建bean,所以我写了这个:
BeanFactory后处理器
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory bf)
throws BeansException {
Map<String, Object> beans = bf.getBeansWithAnnotation(WebService.class);
for (Entry<String, Object> entry : beans.entrySet()) {
Object bean = entry.getValue();
WebService ws = bean.getClass().getAnnotation(WebService.class);
String name = getName(entry.getKey());
DefaultWsdl11Definition newWS = createWebService(name, ws.xsds());
bf.registerSingleton(name, newWS);
}
}
但是,这不起作用!,我写了一个简单的测试,你可以看到它here
我看到 IOC 不适用于带有注释的类,这是因为方法: BeanFactory#getBeansWithAnnotation 不初始化它,将其标记为已创建,并且不注入任何东西。
解决方法
我做了一个解决方法:按名称获取所有bean,获取对应的类并使用#bf.getBeansOfType(Class),(此方法不初始化它!)。
我的问题:
- 这是一个有效的解决方法?
- 如何使用#getBeansWithAnnotation() 方法而不初始化bean?