我将现有的基于Spring 3.1的Web应用程序转换为Spring Boot 1.2.5 . 我最初将旧的应用程序升级到Spring 4.1.7 .
旧应用程序在 web.xml
中使用init参数 contextConfigLocation
导入了许多xml bean配置文件 . 在新的Spring启动应用程序中,这些xml是在主类中使用 @ImportResource
导入的 .
当我启动我的应用程序时,我可以看到基于xml的bean是使用自动连接的字段 null
创建的 . 当我调试bean创建部分时,看起来 AutowiredAnnotationBeanPostProcessor
尚未添加到beanfactory中 . 但是xml包含 <context:annotation-config />
,它假设添加 AutowiredAnnotationBeanPostProcessor
. 在创建基于xml的bean之后立即添加此post处理器 .
许多bean依赖项是xml定义bean中的自动装配bean .
示例xml配置:
<context:annotation-config/>
<context:component-scan base-package="x.y.z"/>
<bean id="discoveredResourceClasses" factory-bean="resourceManager" factory-method="getResourceClasses">
<constructor-arg>
<list>
<value>x.y.z.resources</value>
</list>
</constructor-arg>
</bean>
Factotry Bean类,用于创建'discoveredResourceClasses'bean:
@Service
public class ResourceManager implements Serializable{
@Autowired
protected IExtensionManager extensionManager;
public List<Class<? extends Resource>> getResourceClasses(String ... packageNames)
{
return extensionManager.getExtensions(packageName, includeEverything, Resource.class);
}
}
自动 beans :
@Service
public class ExtensionManager implements IExtensionManager {
public <T> List<T> getExtensions(String packageName, Map<String, String> filter, Class<T> clazz) {
//busoinesslogic .
}
}
Spring引导类:
@ImportResource("classpath*:xad-config-all.xml")
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在 resourceManager
bean创建时,字段 extensionManager
将显示为 null
. 所以factory-method(getResourceClasses)抛出 NullPointerException
.
1 回答
当Spring没有开始构建应用程序上下文时,您需要在开始时提供xml配置文件的路径 . 在注册了许多PostProcessor之后,在此过程的中间处理@ImportResource注释 .
您需要使用SpringApplicationBuilder.sources方法提供xml配置的路径 .