栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

从SpringMVC迁移到Springboot的方法步骤

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从SpringMVC迁移到Springboot的方法步骤

在将SpringMVC项目转移到Springboot上的过程中,主要做了以下的事情

  1. Profile配置
  2. 全局变量从properties文件读入
  3. 数据源与Mybatis配置
  4. 日志文件配置
  5. WebConfig配置(包括原有的web.xml和spring-mvc.xml)
  6. 去掉多余的bean注入

本篇文章除了介绍做了些什么和怎么做之外,会多很多多余的废话,关于对原理的一些探讨,知其然也要知其所以然。

Profile配置

在传统的Spring项目中,多个profile的配置方式首先是在pom.xml文件中写入多个profile,再通过启动项目前先执行一个maven文件来预加载选定的profile环境。加载完之后,执行项目的时候,会根据已加载的Environment,来决定去将哪个.properties文件load到全局变量中。

而在Springboot中对多个profile的管理就非常简单了。

可以在jar包用命令行运行时选择profile

java -jar example.jar --spring.profiles.active=test

或者在application.properties这个全局配置中配置

在application.properties中添加spring.profiles.active=test

以上两种方法均可启动“test"这个profile,前者在执行上的优先级要高于后者。

(顺便一提,在Springboot里面,这两种方式本质上都是用“外部化配置”的方式,来对Environment进行编辑和替换)

另外,每个独立的profiles的配置方式为以"application-xxx.properties"格式,针对每个不同环境,例如:

  1. application-pro.properties 表示预演环境
  2. application-dev.properties 表示开发环境
  3. application-test.properties 表示测试环境

当我们需要测试是否正常载入了profile的时候,可以在对应的.properties文件中写入

server.port=9080

在启动的时候就可以看到,是否已经启动了这个端口。

在这里可以顺便提一下Springboot加载配置文件的顺序

  1. home目录下的devtools全局设置属性( ~/.spring-boot-devtools.properties ,如果devtools激活)。
  2. 测试用例上的@TestPropertySource注解。
  3. 测试用例上的@SpringBootTest#properties注解。
  4. 命令行参数
  5. 来自 SPRING_APPLICATION_JSON 的属性(环境变量或系统属性中内嵌的内联JSON)。
  6. ServletConfig 初始化参数。
  7. ServletContext 初始化参数。
  8. 来自于 java:comp/env 的JNDI属性。
  9. Java系统属性(System.getProperties())。
  10. 操作系统环境变量。
  11. RandomValuePropertySource,只包含 random.* 中的属性。
  12. 没有打进jar包的Profile-specific应用属性( application-{profile}.properties 和YAML变量)。
  13. 打进jar包中的Profile-specific应用属性( application-{profile}.properties 和YAML变量)。
  14. 没有打进jar包的应用配置( application.properties 和YAML变量)。
  15. 打进jar包中的应用配置( application.properties 和YAML变量)。
  16. @Configuration 类上的 @PropertySource 注解。
  17. 默认属性(使用 SpringApplication.setDefaultProperties 指定)。

全局变量从properties文件读入

在上一面一小节写了针对不同环境的properties配置,这里会写关于如果将这些属性写入到全局变量中,方便后面其他地方直接调用。


public class Global {

 public static String examplePath;

 @Value("${example_path}")
  public void setExamplePath(String example) {
    Global.examplePath = examplePath;
  }
}

通过这样子,我们便将.properties文件中的

example_path=http://localhost:9090

这个属性读到了全局变量中。

数据源与Mybatis配置

在传统的Spring项目中,用Mybatis连接数据库

  1. 首先要创建一个名为datasource的bean
  2. 然后将这个datasource装配到SqlSessionFactory中
  3. 最后再将SqlSessionFactory装配到MapperScannerConfigurer中

这一切都是在xml配置文件中配置的,比较繁琐。在Springboot中会尽量去避免这样子的xml配置。
Mybatis现在已经为Springboot提供了支持,我们只需要添加MyBatis-Spring-Boot-Starter这个依赖,它就会为我们去做好以下的事情:

  1. 自动检测已有的datasource
  2. 创建一个SqlSessionFactoryBean的实例SqlSessionFactory,并将datasource装配进去
  3. 创建一个SqlSessionTemplate的实例,并将SqlSessionFactory装配进去
  4. 自动扫描你的mapper,将它们连接到SqlSessionTemplate,并将它们注册到Spring的上下文,以便将它们注入到其他的bean中。

所以,在Springboot的Mybatis配置中,我们需要去做以下几件事情:

在application-{profile}.properties中填入数据库信息,例如:

spring.datasource.url=jdbc:oracle:thin:@//localhost:1234/example
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.maxActive=10
spring.datasource.maxIdle=5
spring.datasource.maxWait=-1

通过这种方式,我们便在Spring上下文中注册了datasource这个bean。

创建一个MybatisConfig文件,用java的方式取代xml:


@Configuration
@EnableTransactionManagement
@MapperScan("com.example.db.dao")
public class MybatisConfig {

  @Autowired
  private DataSource dataSource;

  @Bean(name = "sqlSessionFactory")
  public SqlSessionFactory sqlSessionFactoryBean() {
    SqlSessionFactoryBean sqlsession = new SqlSessionFactoryBean();
    sqlsession.setDataSource(dataSource);
    try {
      //添加XML目录
      ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
      sqlsession.setMapperLocations(resolver.getResources("classpath:mapping
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void configureMessageConverters(List> converters) {
    converters.add(marshallingHttpMessageConverter());
  }

  public MarshallingHttpMessageConverter marshallingHttpMessageConverter(){
    MarshallingHttpMessageConverter marshallingHttpMessageConverter = new MarshallingHttpMessageConverter();
    List mediaTypes = new ArrayList();
    mediaTypes.add(MediaType.TEXT_XML);
    mediaTypes.add(MediaType.APPLICATION_XML);
    XStreamMarshaller xStreamMarshaller=new XStreamMarshaller();
    marshallingHttpMessageConverter.setSupportedMediaTypes(mediaTypes);
    marshallingHttpMessageConverter.setMarshaller(xStreamMarshaller);
    marshallingHttpMessageConverter.setUnmarshaller(xStreamMarshaller);
    return marshallingHttpMessageConverter;
  }
  //配置文件上传
  @Bean(name = {"multipartResolver"})
  public MultipartResolver multipartResolver(){
    CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver();
    commonsMultipartResolver.setDefaultEncoding("utf-8");
    commonsMultipartResolver.setMaxUploadSize(10485760000L);
    commonsMultipartResolver.setMaxInMemorySize(40960);
    return commonsMultipartResolver;
  }
  //异常处理
  @Bean
  public ExceptionHandler exceptionResolver(){
    ExceptionHandler exceptionHandler = new ExceptionHandler();
    return exceptionHandler;
  }
  //拦截器
  @Override
  public void addInterceptors(InterceptorRegistry registry){
    registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");
    super.addInterceptors(registry);
  }
}

我写的这个示例文件里面做了几件事情:

  1. 引入一个XML的Http消息转换器
  2. 引入multipartResolver
  3. 引入自定义的异常处理器
  4. 引入自定义拦截器

去掉多余的bean注入

这个算是一个题外话,但也是我实际遇到的问题之一。

在实际运行的Springboot项目的时候,我发现了一些在传统Spring项目中没有报错的问题,就是多余的bean注入。

在传统Spring项目中,这是没有报错的,但是在Springboot项目中就报错了。我猜测是因为要注入bean的类方法名取的比较精简的时候,与Springboot本身自动配置的一些bean重复了,就会报错。

所以,把有些不需要注入的bean去掉吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/142185.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号