java – 使用BeanFactoryPostProcessor创建bean
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用BeanFactoryPostProcessor创建bean,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3064字,纯文字阅读大概需要5分钟。
内容图文
![java – 使用BeanFactoryPostProcessor创建bean](/upload/InfoBanner/zyjiaocheng/817/e9c3ee60acf149b28c071893db5d10e2.jpg)
Spring BeanFactoryPostProcessor问题
我想创建一个Spring BeanFactoryPostProcessor,它将bean添加到当前的ApplicationContext中.
我在spring-ws-config.xml中有很多Web服务定义,我想尽可能地减少.
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,所以我写了这个:
@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?
解决方法:
问题是BeanFactoryPostProcessor不能用于实例,#getBeansWithAnnotation()返回实例,因此,不建议使用相关的Javadoc:
BeanFactoryPostProcessor可以与bean定义交互并修改bean定义,但绝不能与bean实例交互.这样做可能会导致bean过早实例化,违反容器并导致意外的副作用.如果需要bean实例交互,请考虑实现BeanPostProcessor.
所以我的解决方案是:
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory bf)
throws BeansException {
String[] beans = bf.getBeanDefinitionNames();
for (String s : beans) {
Class<?> beanType = bf.getType(s);
WebService ws = AnnotationUtils.findAnnotation(beanType,
WebService.class);
if (ws != null) {
String name = getName(s);
DefaultWsdl11Definition newWS = createWebService(name,
ws.xsds());
bf.registerSingleton(name, newWS);
}
}
}
内容总结
以上是互联网集市为您收集整理的java – 使用BeanFactoryPostProcessor创建bean全部内容,希望文章能够帮你解决java – 使用BeanFactoryPostProcessor创建bean所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。