www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

从SpringMVC到Springboot迁移手续

2019-10-05 20:32 来源:未知

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

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

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

一、Profile配置

//Spring3.0.1包

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

二、全局变量从properties文件读入

org.springframework.web-3.0.1 系列

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"格式,针对每个不同环境,例如:

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

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

server.port=9080

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

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

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

三、数据源与Mybatis配置

//公共包

全局变量从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

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

四、日志文件配置

slf4j-api-1.5.6.jar slf4j-log4j12-1.5.6.jar log4j-1.2.13.jar

数据源与Mybatis配置

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

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

这一切都是在xml配置文件中配置的,比较繁琐。在Springboot中会尽量去避免这样子的xml配置。

Mybatis现在已经为Springboot提供了支持,我们只需要添加MyBatis-Spring-Boot-Starter这个依赖,它就会为我们去做好以下的事情:

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

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

  1. 在application-{profile}.properties中填入数据库信息,例如:
spring.datasource.url=jdbc:oracle:thin:@//localhost:1234/examplespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriverspring.datasource.maxActive=10spring.datasource.maxIdle=5spring.datasource.maxWait=-1

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

  1. 创建一个MybatisConfig文件,用java的方式取代xml:
/** * Created by WuTaoyu on 2017/12/7. */@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/*.xml")); return sqlsession.getObject(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException; } } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); } @Bean(name = "exampleSequence") public OracleSequenceMaxValueIncrementer exampleSequenceBean(){ OracleSequenceMaxValueIncrementer exampleSequence = new OracleSequenceMaxValueIncrementer(); exampleSequence.setIncrementerName("EXAMPLE_SEQ"); exampleSequence.setDataSource(dataSource); return exampleSequence; }}

@MapperScan是扫描这个包下面的mapper。

另外这里mapper.xml的位置,是在resource文件夹下面建了一个mapping文件夹,放在下面。

这里的作用跟XML比较类似,是将传统的xml表达方式用.java文件来描述出来,本质上还是将datasource一步步注入。

由于示例用的是oracle数据库,所以最后一个exampleSequence是示范如何添加序列。

  1. 对所有mapper的interface注解@Mapper

例如:

@Mapperpublic interface UserMapper { ...}

五、WebConfig配置(包括原有的web.xml和spring-mvc.xml)

commons-logging-1.1.1.jar asm-3.1.jar cglib-2.2.jar

日志文件配置

Logback支持用properties的方式外部化配置,但是对于比较细的配置来说,还是要沿用xml配置。

为了让xml文件从.properties文件读取一些路径之类可能需要经常修改的静态配置,需要在logback-spring.xml中配置

 <property resource="application.properties" /> <property name="log.root.level" value="${log.root.level}" /> <property name="log.path" value="${log.path}" /> <property name="log.moduleName" value="${log.module}" />

这样子就可以将application.properties文件中的

log.path=/home/logs/examplelog.root.level=INFOlog.module=example

读入到logback-spring.xml中,然后再去调用。

六、去掉多余的bean注入

//mybatis与Spring的整合所需的包

WebConfig配置

WebConfig的主要作用是替代web.xml和spring-mvc.xml进行一些基础配置。

  1. 关于web.xml

传统的Spring项目都有配置一个web.xml文件,这个文件的作用是:当我们把war包放入应用容器中运行时,容器会根据web.xml去加载filter、servlet、error-page、welcome-file-list、listener、context-param、resource-ref等配置。

包括ContextLoaderListener这个监听器,就是在这里加载进去,用于在启动容器的时候,自动装配ApplicationContext的配置信息。

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

这个ApplicationContext是Spring IOC的核心(继承自BeanFactory),所有单例的Bean会在这个时候就被实例化。

以及,SpringMVC中很重要的一个DispatcherServlet也是在这里加载进去,并制定根据哪个xml文件来配置DispatcherServlet。

<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <!--<async-supported>true</async-supported>--></servlet>
  1. 关于spring-mvc.xml

spring-mvc.xml是SpringMVC的配置文件,在这里可以配置我们引入的、需要定制化的bean,例如ViewResolver、multipartResolver、HTTP消息转换器、自定义的拦截器等等。

以上都与Springboot无关,主要是为了知其然也知其所以然,如果不感兴趣的可以不看。

再讲回Springboot的配置。Springboot有一个说法叫“约定优于配置”,就是尽量用约定的方式,而不是特地去针对性地配置(需要特殊配置的时候再去配置)。

引入spring-boot-starter-web这个“开箱即用”的依赖之后,spring-boot-starter-web下包含了一个spring-boot-autoconfigure

有了这个依赖之后,就可以使用@EnableAutoCongiguration注解。这个注解就会根据引入的依赖来猜测你需要的Spring配置并帮你配置好。因为已经引入了spring-boot-starter-web的话,这个注解就会将web相关的配置配置好。

另外,@SpringBootApplication这个注解中已经包含了@EnableAutoCongiguration注解。所以只要在启动类ExampleServerApplication上注解@SpringBootApplication就可以自动把web配置给配置好了。

当然,我们可能还有一些特殊的配置,这时候就可以创建一个WebConfig去定制

/** * Created by WuTaoyu on 2017/12/8. */@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(marshallingHttpMessageConverter; } public MarshallingHttpMessageConverter marshallingHttpMessageConverter(){ MarshallingHttpMessageConverter marshallingHttpMessageConverter = new MarshallingHttpMessageConverter(); List<MediaType> mediaTypes = new ArrayList<MediaType>(); 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; commonsMultipartResolver.setMaxUploadSize(10485760000L); commonsMultipartResolver.setMaxInMemorySize; 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; }}

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

  • 引入一个XML的Http消息转换器
  • 引入multipartResolver
  • 引入自定义的异常处理器
  • 引入自定义拦截器

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

mybatis-3.0.5.jar

去掉多余的bean注入

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

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

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

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

一、Profile配置

aopalliance-1.0.jar

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

mybatis-spring-1.0.1.jar

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

mybatis-generator-core-1.3.1.jar(mybatis代码生成器包)

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

//jdbc driven

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

mysql-connector-java-3.1.6-bin.jar

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

//JSR验证-Hibernate validate 4.1

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

hibernate-validator-4.1.0.Final.jar

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

validation-api-1.0.0.GA.jar

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

//Spring Json 支持包

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

jackson-all-1.8.1.jar

application-pro.properties 表示预演环境

  1. web.xml配置

application-dev.properties 表示开发环境

Servlet配置

application-test.properties 表示测试环境

org.springframework.web.servlet.DispatcherServlet

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

init-param配置servlet初始化文件.

server.port=9080

以及servlet-mapping配置.

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

应用路径配置

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

webAppRootKey

home目录下的devtools全局设置属性( ~/.spring-boot-devtools.properties ,如果devtools激活)。

Log4j配置

测试用例上的@TestPropertySource注解。

Log4jConfigLocation

测试用例上的@SpringBootTest#properties注解。

Log4jRefreshInterval

命令行参数

Spring上下文配置

来自 SPRING_APPLICATION_JSON 的属性(环境变量或系统属性中内嵌的内联JSON)。

contextConfigLocation

ServletConfig 初始化参数。

Spring字符集过滤器配置

ServletContext 初始化参数。

org.springframework.web.filter.CharacterEncodingFilter

来自于 java:comp/env 的JNDI属性。

Spring监听器配置

Java系统属性(System.getProperties())。

org.springframework.web.context.ContextLoaderListener

操作系统环境变量。

log4j监听器配置

RandomValuePropertySource,只包含 random.* 中的属性。

org.springframework.web.util.Log4jConfigListener

没有打进jar包的Profile-specific应用属性( application-{profile}.properties 和YAML变量)。

  1. spring mvc - servlet.xml配置

打进jar包中的Profile-specific应用属性( application-{profile}.properties 和YAML变量)。

启动mvc注解驱动

没有打进jar包的应用配置( application.properties 和YAML变量)。

<mvc:annotation-driven/>

打进jar包中的应用配置( application.properties 和YAML变量)。

组件scanner主要是自动去注入指定包里的对象

@Configuration 类上的 @PropertySource 注解。

<context:component-scan

默认属性(使用 SpringApplication.setDefaultProperties 指定)。

base-package="com.los.mvc.controller"/>

二、全局变量从properties文件读入

ViewResolver & View 映射关系

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

InternalResourceViewResolver 基于resource对jsp/jstl的支持

/**

* 全局变量

*/

public class Global {

public static String examplePath;

@Value("${example_path}")

  public void setExamplePath(String example) {

    Global.examplePath = examplePath;

  }

}

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

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

<property name="prefix" value="/WEB-INF/views/"/>

example_path=

<property name="suffix" value=".jsp"/>

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

<!-- InternalResourceViewResolver viewClass默认值就是JstlView -->

三、数据源与Mybatis配置

<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>

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

</bean>

首先要创建一个名为datasource的bean

自定义拦截器配置

然后将这个datasource装配到SqlSessionFactory中

<mvc:interceptors>

最后再将SqlSessionFactory装配到MapperScannerConfigurer中

<mvc:interceptor>

这一切都是在xml配置文件中配置的,比较繁琐。在Springboot中会尽量去避免这样子的xml配置。

<mvc:mapping path="/json*"/>

Mybatis现在已经为Springboot提供了支持,我们只需要添加MyBatis-Spring-Boot-Starter这个依赖,它就会为我们去做好以下的事情:

<bean class="com.los.mvc.interceptor.MyInterceptor"></bean>

自动检测已有的datasource

</mvc:interceptor>

创建一个SqlSessionFactoryBean的实例SqlSessionFactory,并将datasource装配进去

</mvc:interceptors>

创建一个SqlSessionTemplate的实例,并将SqlSessionFactory装配进去

国际化配置

自动扫描你的mapper,将它们连接到SqlSessionTemplate,并将它们注册到Spring的上下文,以便将它们注入到其他的bean中。

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

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

<property name="basename" value="message"></property>

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

</bean>

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

  1. Spring上下文 -- applicationContext.xml 配置

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

支持注解

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

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>

/**

* Created by caijuzhou on 2018/1/24.

*/

@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/*.xml"));

      return sqlsession.getObject();

    } catch (Exception e) {

      e.printStackTrace();

      throw new RuntimeException(e);

    }

  }

  @Bean

  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {

    return new SqlSessionTemplate(sqlSessionFactory);

  }

  @Bean

  public PlatformTransactionManager annotationDrivenTransactionManager() {

    return new DataSourceTransactionManager(dataSource);

  }

  @Bean(name = "exampleSequence")

  public OracleSequenceMaxValueIncrementer exampleSequenceBean(){

    OracleSequenceMaxValueIncrementer exampleSequence = new OracleSequenceMaxValueIncrementer();

    exampleSequence.setIncrementerName("EXAMPLE_SEQ");

    exampleSequence.setDataSource(dataSource);

    return exampleSequence;

  }

}

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>

@MapperScan是扫描这个包下面的mapper。

<import resource="service.xml"/>

另外这里mapper.xml的位置,是在resource文件夹下面建了一个mapping文件夹,放在下面。

<import resource="dao.xml"/>

这里的作用跟XML比较类似,是将传统的xml表达方式用.java文件来描述出来,本质上还是将datasource一步步注入。

<import resource="orm.xml"/>

由于示例用的是oracle数据库,所以最后一个exampleSequence是示范如何添加序列。

service.xml dao.xml 配置@service 和 @Repository

对所有mapper的interface注解@Mapper

  1. Mybatis3.0.5-Spring 整合 -- orm.xml

例如:

@Mapper

public interface UserMapper {

...

}

DataSource配置

四、日志文件配置

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

Logback支持用properties的方式外部化配置,但是对于比较细的配置来说,还是要沿用xml配置。

<property name="driverClassName" value="com.mysql.jdbc.Driver"/>

为了让xml文件从.properties文件读取一些路径之类可能需要经常修改的静态配置,需要在logback-spring.xml中配置

<property name="url" value="jdbc:mysql://localhost:3306/mvc"/>

<property resource="application.properties" />

  <property name="log.root.level" value="${log.root.level}" />

  <property name="log.path" value="${log.path}" />

  <property name="log.moduleName" value="${log.module}" />

<property name="username" value="root" />

这样子就可以将application.properties文件中的

<property name="password" value="root" />

log.path=/home/logs/example

log.root.level=INFO

log.module=example

</bean>

读入到logback-spring.xml中,然后再去调用。

注册事务管理器(Mybatis将事务转交给Spring来管理)

五、WebConfig配置

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

WebConfig的主要作用是替代web.xml和spring-mvc.xml进行一些基础配置。

<property name="dataSource" ref="dataSource" />

1、关于web.xml

</bean>

传统的Spring项目都有配置一个web.xml文件,这个文件的作用是:当我们把war包放入应用容器(例如tomcat)中运行时,容器会根据web.xml去加载filter(过滤器)、servlet、error-page、welcome-file-list、listener(监听器)、context-param(上下文参数)、resource-ref(资源配置)等配置。

SqlSessionFactory配置(Mybatis核心是sqlSessionFactory来获取orm处理对象, dataSource, mapperLocations配置mybaits自动生成的xml文件.就是注入映射关系.)

包括ContextLoaderListener这个监听器,就是在这里加载进去,用于在启动容器的时候,自动装配ApplicationContext的配置信息。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<property name="dataSource" ref="dataSource" />

这个ApplicationContext是Spring IOC的核心(继承自BeanFactory),所有单例的Bean会在这个时候就被实例化。

<property name="mapperLocations" value="classpath:/com/los/mvc/mapper/*.xml" />

以及,SpringMVC中很重要的一个DispatcherServlet也是在这里加载进去,并制定根据哪个xml文件来配置DispatcherServlet。

</bean>

<servlet>

    <servlet-name>SpringMVC</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>classpath:spring-mvc.xml</param-value>

    </init-param>

    <load-on-startup>1</load-on-startup>

    <!--<async-supported>true</async-supported>-->

</servlet>

MapperScanner配置.自动去搜索mapper里的对象,并注入.

2、关于spring-mvc.xml

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

spring-mvc.xml是SpringMVC的配置文件,在这里可以配置我们引入的、需要定制化的bean,例如ViewResolver、multipartResolver、HTTP消息转换器、自定义的拦截器等等。

<property name="basePackage" value="com.los.mvc.dao" />

以上都与Springboot无关,主要是为了知其然也知其所以然,如果不感兴趣的可以不看。

</bean>

再讲回Springboot的配置。Springboot有一个说法叫“约定优于配置”,就是尽量用约定的方式,而不是特地去针对性地配置(需要特殊配置的时候再去配置)。

启动Spring注解事务

引入spring-boot-starter-web这个“开箱即用”的依赖之后,spring-boot-starter-web下包含了一个spring-boot-autoconfigure。

<tx:annotation-driven/>

有了这个依赖之后,就可以使用@EnableAutoCongiguration注解。这个注解就会根据引入的依赖来猜测你需要的Spring配置并帮你配置好。因为已经引入了spring-boot-starter-web的话,这个注解就会将web相关的配置配置好。

  1. mybatis自动生成器配置 -- generatorConfig.xml

另外,@SpringBootApplication这个注解中已经包含了@EnableAutoCongiguration注解。所以只要在启动类ExampleServerApplication上注解@SpringBootApplication就可以自动把web配置给配置好了。

sqlMapGenerator sqlMpper.xml生成器

当然,我们可能还有一些特殊的配置,这时候就可以创建一个WebConfig去定制

javaClientGenerator ModelDao生成器

/**

* Created by caijuzhou on 2018/1/24.

*/

@Configuration

public class WebConfig extends WebMvcConfigurerAdapter {

  @Override

  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    converters.add(marshallingHttpMessageConverter());

  }

  public MarshallingHttpMessageConverter marshallingHttpMessageConverter(){

    MarshallingHttpMessageConverter marshallingHttpMessageConverter = new MarshallingHttpMessageConverter();

    List<MediaType> mediaTypes = new ArrayList<MediaType>();

    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);

  }

}

javaModelGenerator Model生成器

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

com.los.util.MBG.java 运行会自动生成mybatis代码.然后再配置orm.xml

引入一个XML的Http消息转换器

  1. Controller层配置

引入multipartResolver

类注解

引入自定义的异常处理器

@Controller

引入自定义拦截器

@RequestMapping("/json")为访问该层的路径.

六、去掉多余的bean注入

方法注解

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

@RequestMapping(method = RequestMethod.GET) 只有get方法才能访问.

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

@ResponseBody 自动将返回的封装成json,方法返回值必须是map<String,?>类型.

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

@RequestMapping(value="/doLogin") value=”doLogin”为访问该方法的handler mapping

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

return "login/login";会通过ViewResolver找到对应的view

以上就是本文的全部内容,希望对大家的学习有所帮助。

return "redirect:/user/toRegister.html";为spring-mvc的重定向.

@InitBinder()为绑定器,可以为request传来的数据进行数据类型转换.

数据自动验证

方法中参数需要有后面的两个(@Valid User user,BindingResult result).@Valid的支持标准是JSR,Hibernate Validate 4是对该标准比较好的实现.需要在Model类中配置验证的注解.判断验证是否正确通过result.hasErrors()或者result.hasFieldErrors()来判断,通过result.getAllErrors()或者result.getFieldErrors()来获取Errors然后遍历Errors获取相关想要的信息,例如Error.getDeafaultMessage(),这个是获取错误信息.具体的错误验证机制还地在Model类中配置.

属性注解

@Autowired 会为该属性自动注入bean,默认方式是byType.也可以用@Resource这个注解默认是byName.

  1. Service层配置.(业务层)

类注解

@Service 为@Component的子注解,分工更明细.

@Transactional 可以为该业务类声明一个全类的事务.也可以将事务写在方法上.根据不同的需要.

方法注解

@Transactional(readOnly = true)

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 类的事务声明,可以设置隔离级别和传播属性,以及要回滚的异常名或者异常类,不需要回滚的异常名或者异常类.异常通常抛出给controller层来处理

属性注解

@Autowired @Resource

  1. Repository层配置.(持久层DaoImpl)

类注解

@Repository 为@Component的子注解,意为持久层,分工更明细.一般不在这层处理事务.

10.Entry层配置(Model层)

类注解

@Entry

验证注解,常用的有:

@NotEmpty

@NotNull

@Size(min=2,max=10,message=”xx必须在{min}和{max}之间”)

@Email

@DecimalMax

@AssertFalse @AssertTrue

@Null

@Valid

@URL(protocol=,host=, port=,regexp=, flags=)

一般情况下属性或者方法可以放多个约束注解,hibernate validate会以随机的顺序去验证这些约束.所以多个注解约束会有可能同一个属性返回多个message.所以有时候需要只返回一条message,则需要使用验证组Groups来达成.组别序列可以把一系列的组别按照一定的顺序排列在一起,然后逐个验证,只要有一个组别验证失败,就不继续验证剩余的组别。

@GroupSequence({User.class,GroupB.class,GroupC.class})验证组的顺序,约束里不指定group的为默认的User.class组.

约束组放在类前,User.class为默认的约束组,GroupB,GroupC为空的接口.写在User外同个java文件下.

@NotEmpty(message="密码不能为空")

@Size(min=4,max=20,message="密码长度必须在{min}-{max}范围内",groups = GroupB.class)

如果@NotEmpty验证失败了,就不会继续验证@Size

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于www.2527.com,转载请注明出处:从SpringMVC到Springboot迁移手续