SpringBoot
一, Spring 介绍
1.1,SpringBoot 简介
在您第 1 次接触和学习 Spring 框架的时候, 是否因为其繁杂的配置而退却了? 在你第 n 次使用 Spring 框架的时候, 是否觉得一堆反复黏贴的配置有一些厌烦? 那么您就不妨来试试使用 Spring Boot 来让你更易上手, 更简单快捷地构建 Spring 应用!
Spring Boot 让我们的 Spring 应用变的更轻量化. 比如: 你可以仅仅依靠一个 Java 类来运行一个 Spring 引用. 你也可以打包你的应用为 jar 并通过使用 java -jar 来运行你的 Spring Web 应用.
Spring Boot 的主要优点:
为所有 Spring 开发者更快的入门
开箱即用, 提供各种默认配置来简化项目配置
内嵌式容器简化 Web 项目
没有冗余代码生成和 xml 配置的要求
本章主要目标完成 Spring Boot 基础项目的构建, 并且实现一个简单的 Http 请求处理, 通过这个例子对 Spring Boot 有一个初步的了解, 并体验其结构简单, 开发快速的特性.
1.2, 系统要求:
Java1.8 及以上
Spring Framework 4.1.5 及以上
本文采用 Java 1.8.0_73,Spring Boot 1.3.2 调试通过.
二, 快速入门
2.1, 创建一个 Maven 工程
名为 "springboot-helloworld" 类型为 Jar 工程项目
2.2,pom 文件引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
<dependencies>
<!—SpringBoot web 组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
|
spring-boot-starter-parent 作用
在 pom.xml 中引入 spring-boot-start-parent,spring 官方的解释叫什么 stater poms, 它可以提供 dependency management, 也就是说依赖管理,引入以后在申明其它 dependency 的时候就不需要 version 了,后面可以看到。
spring-boot-starter-web 作用
springweb 核心组件
spring-boot-maven-plugin 作用
如果我们要直接 Main 启动 spring,那么以下 plugin 必须要添加,否则是无法启动的。如果使用 maven 的 spring-boot:run 的话是不需要此配置的。(我在测试的时候,如果不配置下面的 plugin 也是直接在 Main 中运行的。)
|
2.3, 编写 HelloWorld 服务
创建 package 命名为 com.itmayiedu.controller(根据实际情况修改)
创建 HelloController 类, 内容如下
@RestController
@EnableAutoConfiguration
publicclassHelloController {
@RequestMapping("/hello")
publicString index() {
return"Hello World";
}
publicstaticvoidmain(String[]args) {
SpringApplication.run(HelloController.class,args);
}
}
|
2.4,@RestController
在上加上 RestController 表示修饰该 Controller 所有的方法返回 JSON 格式, 直接可以编写
Restful 接口
2.5,@EnableAutoConfiguration
注解: 作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置这个注解告诉 Spring Boot 根据添加的 jar 依赖猜测你想如何配置 Spring. 由于 spring-boot-starter-Web 添加了 Tomcat 和 Spring MVC, 所以 auto-configuration 将假定你正在开发一个 Web 应用并相应地对 Spring 进行设置.
2.6 SpringApplication.run(HelloController.class, args);
标识为启动类
2.7,SpringBoot 启动方式 1
Springboot 默认端口号为 8080
@RestController
@EnableAutoConfiguration
publicclassHelloController {
@RequestMapping("/hello")
publicString index() {
return"Hello World";
}
publicstaticvoidmain(String[]args) {
SpringApplication.run(HelloController.class,args);
}
}
|
启动主程序, 打开浏览器访问 http://localhost:8080/index, 可以看到页面输出 Hello World
2.8,SpringBoot 启动方式 2
@ComponentScan(basePackages ="com.itmayiedu.controller")--- 控制器扫包范围
@ComponentScan(basePackages ="com.itmayiedu.controller")
@EnableAutoConfiguration
publicclassApp {
publicstaticvoidmain(String[]args) {
SpringApplication.run(App.class,args);
}
}
|
三, Web 开发
3.1, 静态资源访问
在我们开发 Web 应用的时候, 需要引用大量的 JS,CSS, 图片等静态资源.
默认配置
Spring Boot 默认提供静态资源目录位置需置于 classpath 下, 目录名需符合如下规则:
- /static
- /public
- /resources
- /META-INF/resources
举例: 我们可以在 src/main/resources / 目录下创建 static, 在该位置放置一个图片文件. 启动程序后, 尝试访问 http://localhost:8080/D.jpg. 如能显示图片, 配置成功.
3.2, 全局捕获异常
@ExceptionHandler 表示拦截异常
.@ControllerAdvice 是 controller 的一个辅助类, 最常用的就是作为全局异常处理的切面类
.@ControllerAdvice 可以指定扫描范围
.@ControllerAdvice 约定了几种可行的返回值, 如果是直接返回 model 类的话, 需要使用 @ResponseBody 进行 JSON 转换
o 返回 String, 表示跳到某个 view
o 返回 modelAndView
o 返回 model + @ResponseBody
@ControllerAdvice
publicclassGlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
publicMap<String, Object> exceptionHandler() {
Map<String, Object>map=newHashMap<String, Object>();
map.put("errorCode","101");
map.put("errorMsg","系統错误!");
returnmap;
}
}
|
3.3, 渲染 Web 页面
渲染 Web 页面
在之前的示例中, 我们都是通过 @RestController 来处理请求, 所以返回的内容为 JSON 对象. 那么如果需要渲染 HTML 页面的时候, 要如何实现呢?
模板引擎
在动态 HTML 实现上 Spring Boot 依然可以完美胜任, 并且提供了多种模板引擎的默认配置支持, 所以在推荐的模板引擎下, 我们可以很快的上手开发动态网站.
Spring Boot 提供了默认配置的模板引擎主要有以下几种:
- .Thymeleaf
- .FreeMarker
- .Velocity
- .Groovy
- .Mustache
Spring Boot 建议使用这些模板引擎, 避免使用 JSP, 若一定要使用 JSP 将无法实现 Spring Boot 的多种特性, 具体可见后文: 支持 JSP 的配置
当你使用上述模板引擎中的任何一个, 它们默认的模板配置路径为: src/main/resources/templates. 当然也可以修改这个路径, 具体如何修改, 可在后续各模板引擎的配置属性中查询并修改.
3.4,
使用 Freemarker 模板引擎渲染 Web 视图 http://blog.didispace.com/springbootweb/
3.4.1,pom 文件引入:
<!-- 引入 freeMarker 的依赖包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
|
3.4.2, 后台代码
在 src/main/resources / 创建一个 templates 文件夹, 后缀为 *.ftl
@RequestMapping("/index")
publicString index(Map<String, Object>map) {
map.put("name","美丽的天使...");
return"index";
}
|
3.4.3, 前台代码
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
</head>
<body>
${name}
</body>
</html>
|
3.4.4,Freemarker 其他用法
@RequestMapping("/freemarkerIndex")
publicString index(Map<String, Object>result) {
result.put("name","yushengjun");
result.put("sex","0");
List<String>listResult=newArrayList<String>();
listResult.add("zhangsan");
listResult.add("lisi");
listResult.add("itmayiedu");
result.put("listResult",listResult);
return"index";
}
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title> 首页 & lt;/title>
</head>
<body>
${name}
<#if sex=="1">
男
<#elseif sex=="2">
女
<#else>
其他
</#if>
<#list userlist as user>
${user}
</#list>
</body>
</html>
|
3.4.5,Freemarker 配置
新建 application.properties 文件
########################################################
###FREEMARKER (FreeMarkerAutoConfiguration)
########################################################
spring.freemarker.allow-request-override=false
spring.freemarker.cache=true
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
#spring.freemarker.prefix=
#spring.freemarker.request-context-attribute=
#spring.freemarker.settings.*=
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath:/templates/
#comma-separated list
#spring.freemarker.view-names= # whitelist of view names that can be resolved
|
3.5, 使用 JSP 渲染 Web 视图
3.5.1,pom 文件引入以下依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
<dependencies>
<!-- SpringBoot 核心组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
</dependencies>
|
3.5.2, 在 application.properties 创建以下配置
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
|
3.5.3, 后台代码
@Controller
publicclassIndexController {
@RequestMapping("/index")
publicString index() {
return"index";
}
}
|
注意: 创建 SpringBoot 整合 JSP, 一定要为 war 类型, 否则会找不到页面.
四, 数据访问
4.1,springboot 整合
使用 JdbcTemplate http://blog.didispace.com/springbootdata1/
4.1.1 pom 文件引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
|
4.1.2 application.properties 新增配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
|
4.1.3 UserService 类
@Service
publicclassUserServiceImplimplementsUserService {
@Autowired
privateJdbcTemplatejdbcTemplate;
publicvoidcreateUser(Stringname, Integerage) {
System.out.println("ssss");
jdbcTemplate.update("insert into users values(null,?,?);",name,age);
}
}
|
4.1.4 App 类
@ComponentScan(basePackages ="com.itmayiedu")
@EnableAutoConfiguration
publicclassApp {
publicstaticvoidmain(String[]args) {
SpringApplication.run(App.class,args);
}
}
|
注意: spring-boot-starter-parent 要在 1.5 以上
4.2,springboot 整合使用 http://blog.didispace.com/springbootdata1/ mybatis
4.2.1,pom 文件引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
|
4.2.2, 配置文件引入
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
|
4.2.3,Mapper 代码
publicinterfaceUserMapper {
@Select("SELECT * FROM USERS WHERE NAME = #{name}")
User findByName(@Param("name") Stringname);
@Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})")
intinsert(@Param("name") Stringname,@Param("age") Integerage);
}
|
4.2.4, 启动方式
@ComponentScan(basePackages ="com.itmayiedu")
@MapperScan(basePackages ="com.itmayiedu.mapper")
@SpringBootApplication
publicclassApp {
publicstaticvoidmain(String[]args) {
SpringApplication.run(App.class,args);
}
}
|
4.3,springboot 整合使用 http://blog.didispace.com/springbootdata1/ springjpa
4.3.1 pom 文件引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
|
4.3.2 创建 User 实体类
@Entity(name ="users")
publicclassUser {
@Id
@GeneratedValue
privateIntegerid;
@Column
privateStringname;
@Column
privateIntegerage;
// ..get/set 方法
}
|
4.3.3 创建 UserDao
publicinterfaceUserDaoextendsJpaRepository<User, Integer> {
}
|
4.3.4 创建 IndexController
@RestController
publicclassIndexController {
@Autowired
privateUserDaouserDao;
@RequestMapping("/index")
publicString index(Integerid) {
UserfindUser=userDao.findOne(id);
System.out.println(findUser.getName());
return"success";
}
}
|
4.3.5 启动项目
@ComponentScan(basePackages = {"com.itmayiedu"})
@EnableJpaRepositories(basePackages ="com.itmayiedu.dao")
@EnableAutoConfiguration
@EntityScan(basePackages ="com.itmayiedu.entity")
publicclassApp {
publicstaticvoidmain(String[]args) {
SpringApplication.run(App.class,args);
}
}
|
4.4,springboot 整合多数据源
同学们思考下, 你们在项目中有使用到多数据源吗?
4.4.1 配置文件中新增两个数据源
spring.datasource.test1.driverClassName =com.mysql.jdbc.Driver
spring.datasource.test1.url =jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username =root
spring.datasource.test1.password =root
spring.datasource.test2.driverClassName =com.mysql.jdbc.Driver
spring.datasource.test2.url =jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username =root
spring.datasource.test2.password =root
|
4.4.2 配置文件中新增两个数据源
@Configuration// 注册到 springboot 容器中
@MapperScan(basePackages ="com.itmayiedu.user1", sqlSessionFactoryRef ="test1SqlSessionFactory")
publicclassDataSource1Config {
/**
*
*@methodDesc: 功能描述:(配置 test1 数据库)
*@author: 余胜军
*@param:@return
*@createTime:2017 年 9 月 17 日下午 3:16:44
*@returnType:@return DataSource
*@copyright: 上海每特教育科技有限公司
*@QQ:644064779
*/
@Bean(name ="test1DataSource")
@Primary
@ConfigurationProperties(prefix ="spring.datasource.test1")
publicDataSource testDataSource() {
returnDataSourceBuilder.create().build();
}
/**
*
*@methodDesc: 功能描述:(test1 sql 会话工厂)
*@author: 余胜军
*@param:@param
* dataSource
*@param:@return
*@param:@throws
* Exception
*@createTime:2017 年 9 月 17 日下午 3:17:08
*@returnType:@param dataSource
*@returnType:@return
*@returnType:@throws Exception SqlSessionFactory
*@copyright: 上海每特教育科技有限公司
*@QQ:644064779
*/
@Bean(name ="test1SqlSessionFactory")
@Primary
publicSqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSourcedataSource)
throwsException {
SqlSessionFactoryBeanbean=newSqlSessionFactoryBean();
bean.setDataSource(dataSource);
// bean.setMapperLocations(
// new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
returnbean.getObject();
}
/**
*
*@methodDesc: 功能描述:(test1 事物管理)
*@author: 余胜军
*@param:@param
* dataSource
*@param:@return
*@param:@throws
* Exception
*@createTime:2017 年 9 月 17 日下午 3:17:08
*@returnType:@param dataSource
*@returnType:@return
*@returnType:@throws Exception SqlSessionFactory
*@copyright: 上海每特教育科技有限公司
*@QQ:644064779
*/
@Bean(name ="test1TransactionManager")
@Primary
publicDataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSourcedataSource) {
returnnewDataSourceTransactionManager(dataSource);
}
@Bean(name ="test1SqlSessionTemplate")
publicSqlSessionTemplate testSqlSessionTemplate(
@Qualifier("test1SqlSessionFactory") SqlSessionFactorysqlSessionFactory)throwsException {
returnnewSqlSessionTemplate(sqlSessionFactory);
}
}
|
4.4.2 创建分包 Mapper
publicinterfaceUser1Mapper {
@Insert("insert into users values(null,#{name},#{age});")
publicintaddUser(@Param("name") Stringname,@Param("age") Integerage);
}
|
4.4.3 启动项目
@ComponentScan(basePackages ="com.itmayiedu")
@EnableAutoConfiguration
publicclassApp {
publicstaticvoidmain(String[]args) {
SpringApplication.run(App.class,args);
}
}
|
No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: test1DataSource,test2DataSource
五, 事物管理
5.1.1springboot 整合事物管理
springboot 默认集成事物, 只主要在方法上加上 @Transactional 即可
5.1.2SpringBoot 分布式事物管理
使用 springboot+jta+atomikos 分布式事物管理
5.1.2.1 新增配置文件信息
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
|
5.1.2.2 新增配置文件信息
# Mysql 1
mysql.datasource.test.url =jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
mysql.datasource.test.username =root
mysql.datasource.test.password =root
mysql.datasource.test.minPoolSize =3
mysql.datasource.test.maxPoolSize =25
mysql.datasource.test.maxLifetime =20000
mysql.datasource.test.borrowConnectionTimeout =30
mysql.datasource.test.loginTimeout =30
mysql.datasource.test.maintenanceInterval =60
mysql.datasource.test.maxIdleTime =60
mysql.datasource.test.testQuery =select1
# Mysql 2
mysql.datasource.test2.url =jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
mysql.datasource.test2.username =root
mysql.datasource.test2.password =root
mysql.datasource.test2.minPoolSize =3
mysql.datasource.test2.maxPoolSize =25
mysql.datasource.test2.maxLifetime =20000
mysql.datasource.test2.borrowConnectionTimeout =30
mysql.datasource.test2.loginTimeout =30
mysql.datasource.test2.maintenanceInterval =60
mysql.datasource.test2.maxIdleTime =60
mysql.datasource.test2.testQuery =select1
|
5.1.2.3 读取配置文件信息
packagecom.itmayiedu.config;
importorg.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix ="mysql.datasource.test")
publicclassDBConfig1 {
privateStringurl;
privateStringusername;
privateStringpassword;
privateintminPoolSize;
privateintmaxPoolSize;
privateintmaxLifetime;
privateintborrowConnectionTimeout;
privateintloginTimeout;
privateintmaintenanceInterval;
privateintmaxIdleTime;
privateStringtestQuery;
}
packagecom.itmayiedu.config;
importorg.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix ="mysql.datasource.test1")
publicclassDBConfig2 {
privateStringurl;
privateStringusername;
privateStringpassword;
privateintminPoolSize;
privateintmaxPoolSize;
privateintmaxLifetime;
privateintborrowConnectionTimeout;
privateintloginTimeout;
privateintmaintenanceInterval;
privateintmaxIdleTime;
privateStringtestQuery;
}
|
5.1.2.4 创建多数据源
@Configuration
// basePackages 最好分开配置如果放在同一个文件夹可能会报错
@MapperScan(basePackages ="com.itmayiedu.test1", sqlSessionTemplateRef ="testSqlSessionTemplate")
publicclassTestMyBatisConfig1 {
// 配置数据源
@Primary
@Bean(name ="testDataSource")
publicDataSource testDataSource(DBConfig1testConfig)throwsSQLException {
MysqlXADataSourcemysqlXaDataSource=newMysqlXADataSource();
mysqlXaDataSource.setUrl(testConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(testConfig.getPassword());
mysqlXaDataSource.setUser(testConfig.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
AtomikosDataSourceBeanxaDataSource=newAtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("testDataSource");
xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
xaDataSource.setTestQuery(testConfig.getTestQuery());
returnxaDataSource;
}
@Primary
@Bean(name ="testSqlSessionFactory")
publicSqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSourcedataSource)
throwsException {
SqlSessionFactoryBeanbean=newSqlSessionFactoryBean();
bean.setDataSource(dataSource);
returnbean.getObject();
}
@Primary
@Bean(name ="testSqlSessionTemplate")
publicSqlSessionTemplate testSqlSessionTemplate(
@Qualifier("testSqlSessionFactory") SqlSessionFactorysqlSessionFactory)throwsException {
returnnewSqlSessionTemplate(sqlSessionFactory);
}
}
// basePackages 最好分开配置如果放在同一个文件夹可能会报错
@Configuration
@MapperScan(basePackages ="com.itmayiedu.test2", sqlSessionTemplateRef ="test2SqlSessionTemplate")
publicclassTestMyBatisConfig2 {
// 配置数据源
@Bean(name ="test2DataSource")
publicDataSource testDataSource(DBConfig1testConfig)throwsSQLException {
MysqlXADataSourcemysqlXaDataSource=newMysqlXADataSource();
mysqlXaDataSource.setUrl(testConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(testConfig.getPassword());
mysqlXaDataSource.setUser(testConfig.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
AtomikosDataSourceBeanxaDataSource=newAtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("test2DataSource");
xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
xaDataSource.setTestQuery(testConfig.getTestQuery());
returnxaDataSource;
}
@Bean(name ="test2SqlSessionFactory")
publicSqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSourcedataSource)
throwsException {
SqlSessionFactoryBeanbean=newSqlSessionFactoryBean();
bean.setDataSource(dataSource);
returnbean.getObject();
}
@Bean(name ="test2SqlSessionTemplate")
publicSqlSessionTemplate testSqlSessionTemplate(
@Qualifier("test2SqlSessionFactory") SqlSessionFactorysqlSessionFactory)throwsException {
returnnewSqlSessionTemplate(sqlSessionFactory);
}
}
|
5.1.2.4 启动加载配置
@EnableConfigurationProperties(value = { DBConfig1.class, DBConfig2.class })
六, 日志管理
6.1
使用 log4j 记录日志 http://blog.didispace.com/springbootlog4j/
6.1.2 新建 log4j 配置文件
#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=info,error,CONSOLE,DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm}[%t][%c][%p]-%m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm}[%t][%c][%p]-%m%n
log4j.appender.info.datePattern=‘.‘yyyy-MM-dd
log4j.appender.info.Threshold =info
log4j.appender.info.append=true
#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm}[%t][%c][%p]-%m%n
log4j.appender.error.datePattern=‘.‘yyyy-MM-dd
log4j.appender.error.Threshold =error
log4j.appender.error.append=true
#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm}[%t][%c][%p]-%m%n
log4j.appender.DEBUG.datePattern=‘.‘yyyy-MM-dd
log4j.appender.DEBUG.Threshold =DEBUG
log4j.appender.DEBUG.append=true
#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug
log4j 代码
private static Logger log = Logger.getLogger(IndexController.class);
|
6.2
使用 AOP 统一处理 Web 请求日志 http://blog.didispace.com/springbootaoplog/
6.2.1POM 文件新增依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
|
6.2.2POM 文件新增依赖
@Aspect
@Component
publicclassWebLogAspect {
privateLoggerlogger= LoggerFactory.getLogger(getClass());
@Pointcut("execution(public * com.itmayiedu.controller..*.*(..))")
publicvoidwebLog() {
}
@Before("webLog()")
publicvoiddoBefore(JoinPointjoinPoint)throwsThrowable {
// 接收到请求,记录请求内容
ServletRequestAttributesattributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequestrequest=attributes.getRequest();
// 记录下请求内容
logger.info("URL :"+request.getRequestURL().toString());
logger.info("HTTP_METHOD :"+request.getMethod());
logger.info("IP :"+request.getRemoteAddr());
Enumeration<String>enu=request.getParameterNames();
while(enu.hasMoreElements()) {
Stringname= (String)enu.nextElement();
logger.info("name:{},value:{}",name,request.getParameter(name));
}
}
@AfterReturning(returning ="ret", pointcut ="webLog()")
publicvoiddoAfterReturning(Objectret)throwsThrowable {
// 处理完请求,返回内容
logger.info("RESPONSE :"+ret);
}
}
|
七, 缓存支持
7.1
注解配置与 EhCache 使用 http://blog.didispace.com/springbootcache1/
7.1.1 pom 文件引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
|
7.1.2 新建 ehcache.xml 文件
<?xmlversion="1.0" encoding="UTF-8"?>
<ehcachexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStorepath="java.io.tmpdir/Tmp_EhCache" />
<!-- 默认配置 -->
<defaultCachemaxElementsInMemory="5000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120"
memoryStoreEvictionPolicy="LRU" overflowToDisk="false" />
<cachename="baseCache" maxElementsInMemory="10000"
maxElementsOnDisk="100000" />
</ehcache>
|
配置信息介绍
1.<!--
2.name: 缓存名称.
3.maxElementsInMemory: 缓存最大个数.
4.eternal: 对象是否永久有效, 一但设置了, timeout 将不起作用.
5.timeToIdleSeconds: 设置对象在失效前的允许闲置时间 (单位: 秒). 仅当 eternal=false 对象不是永久有效时使用, 可选属性, 默认值是 0, 也就是可闲置时间无穷大.
6.timeToLiveSeconds: 设置对象在失效前允许存活时间 (单位: 秒). 最大时间介于创建时间和失效时间之间. 仅当 eternal=false 对象不是永久有效时使用, 默认是 0., 也就是对象存活时间无穷大.
7.overflowToDisk: 当内存中对象数量达到 maxElementsInMemory 时, Ehcache 将会对象写到磁盘中.
8.diskSpoolBufferSizeMB: 这个参数设置 DiskStore(磁盘缓存) 的缓存区大小. 默认是 30MB. 每个 Cache 都应该有自己的一个缓冲区.
9.maxElementsOnDisk: 硬盘最大缓存个数.
10.diskPersistent: 是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. Thedefaultvalue isfalse.
11.diskExpiryThreadIntervalSeconds: 磁盘失效线程运行时间间隔, 默认是 120 秒.
12.memoryStoreEvictionPolicy: 当达到 maxElementsInMemory 限制时, Ehcache 将会根据指定的策略去清理内存. 默认策略是 LRU(最近最少使用). 你可以设置为 FIFO(先进先出) 或是 LFU(较少使用).
13.clearOnFlush: 内存数量最大时是否清除.
14.-->
7.1.3 代码使用 Cacheable
@CacheConfig(cacheNames ="baseCache")
publicinterfaceUserMapper {
@Select("select * from users where name=#{name}")
@Cacheable
UserEntity findName(@Param("name") Stringname);
}
|
7.1.4 清除缓存
@Autowired
privateCacheManagercacheManager;
@RequestMapping("/remoKey")
publicvoidremoKey() {
cacheManager.getCache("baseCache").clear();
}
|
7.1.5 启动加入缓存
@EnableCaching // 开启缓存注解
使用 Redis 做集中式缓存 http://blog.didispace.com/springbootcache2/
八, 其他内容
8.1,
使用 @Scheduled 创建定时任务 http://blog.didispace.com/springbootscheduled/
在 Spring Boot 的主类中加入 @EnableScheduling 注解, 启用定时任务的配置
- @Component
- publicclassScheduledTasks{
- privatestaticfinalSimpleDateFormat dateFormat =newSimpleDateFormat("HH:mm:ss");
- @Scheduled(fixedRate = 5000)
- publicvoidreportCurrentTime(){
- System.out.println("现在时间:"+ dateFormat.format(newDate()));
- }
- }
- 8.2,
使用 @Async 实现异步调用 http://blog.didispace.com/springbootasync/
启动加上 @EnableAsync , 需要执行异步方法上加入 @Async
8.3, 自定义参数
配置文件值
name=itmayiedu.com
|
配置文件值
@Value("${name}")
privateStringname;
@ResponseBody
@RequestMapping("/getValue")
publicString getValue() {
returnname;
}
|
8.4, 多环境配置
spring.profiles.active=pre
|
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
|
8.5, 修改端口号
- server.port=8888
- server.context-path=/itmayiedu
8.6,SpringBoot YAML 使用
创建 application.YAML
server:
port:8090
context-path:/itmayiedu
|
8.7, 发布打包
使用 mvn package 打包
使用 java -jar 包名
如果报错没有主清单, 在 pom 文件中新增
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<maimClass>com.itmayiedu.app.App</maimClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
|
来源: http://www.bubuko.com/infodetail-2922390.html