SpringBoot 项目以jar 包方式获取ApplicationContext 和SpringBoot项目以war 包方式获取ApplicationContext
问题场景:今天遇到ApplicationContext 获取Bean 对象总是为null 的问题,我在本地启动SpringBoot 项目正常访问,但是将SpringBoot 项目打包成war 包部署到Tomcat的服务器获取Bean对象总是提示为null。
项目结构关系:springboot-provider 为服务提供者(采用war 包方式部署在tomcat中)
springboot-consumer为服务消费者(采用jar 包方式启动) 备注:两者的服务调用是通过alibaba dubobo 协议实现
springboot-import 为xml 转实体对象工具jar,其中有两个类对象,需要依赖后台接口服务(查询字典数据)
springboot-provider 程序入口(未修改之前)
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* 系统服务提供者
*
* @author zzg
*
*/
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("com.digipower.ucas.mapper")
public class Provider extends SpringBootServletInitializer {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(Provider.class, args);
SpringContextUtil.setApplicationContext(applicationContext);
System.out.println("============= SpringBoot gcxt-system-provider Service Start Success =============");
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(Provider.class);
}
}
springboot-provider 程序入口(修改后)
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* 系统服务提供者
*
* @author zzg
*
*/
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("com.digipower.ucas.mapper")
public class Provider extends SpringBootServletInitializer {
// springboot 本地启动初始化applicationContext
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(Provider.class, args);
SpringContextUtil.setApplicationContext(applicationContext);
System.out.println("============= SpringBoot gcxt-system-provider Service Start Success =============");
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(Provider.class);
}
// tomcat方式启动初始化applicationContext
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
SpringContextUtil
.setApplicationContext(WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext));
}
}
springboot-import 转换工具类使用@Configuration 注解标签初始化化相关Bean
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import ****.field.DataDictFieldProcess;
import ****..field.PersonCategoryFieldProcess;
/**
* 电子包接收配置
* @author zzg
*
*/
@Configuration
@ComponentScan({"***.impexp.field"}) //集成第三方jar 包推荐使用
public class ReceiveConfig {
@Autowired
private SysDataDictService sysDataDictService;
@Bean("PersonCategory")
public PersonCategoryFieldProcess personCategory(){
return new PersonCategoryFieldProcess();
}
@Bean("DataDict")
public DataDictFieldProcess dataDict(){
return new DataDictFieldProcess(sysDataDictService);
}
}
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。