当前spring boot是非常火的,因为它也是实现spring cloudy的基础...,所以今天简单把spring boot开发用到的相关知识进行简单的汇总:
一:简介
1.1、SpringBoot简介
在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让你更易上手,更简单快捷地构建Spring应用!
SpringBoot让我们的Spring应用变的更轻量化。比如:你可以仅仅依靠一个Java类来运行一个Spring引用。你也可以打包你的应用为jar并通过使用java -jar来运行你的Spring Web应用。
SpringBoot的主要优点:
为所有Spring开发者更快的入门
开箱即用,提供各种默认配置来简化项目配置
内嵌式容器简化Web项目
没有冗余代码生成和XML配置的要求
本章主要目标完成SpringBoot基础项目的构建,并且实现一个简单的Http请求处理,通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单、开发快速的特性。
注意:spring boot不同的版本有些功能是不一样的,甚至是不支持的
1.2、项目代码运行系统要求:
Java1.8及以上
SpringFramework 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 publicclass HelloController { @RequestMapping("/hello") public String index() { return"Hello World"; } publicstaticvoid main(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 publicclass HelloController { @RequestMapping("/hello") public String index() { return"Hello World"; } publicstaticvoid main(String[] args) { SpringApplication.run(HelloController.class, args); } } |
2.8、SpringBoot启动方式2
@ComponentScan(basePackages = "com.itmayiedu.controller")---控制器扫包范围
@ComponentScan(basePackages = "com.itmayiedu.controller") @EnableAutoConfiguration publicclass App { publicstaticvoid main(String[] args) { SpringApplication.run(App.class, args); } } |
三、Web开发
3.1、静态资源访问
在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。
默认配置
SpringBoot默认提供静态资源目录位置需置于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 publicclass GlobalExceptionHandler { @ExceptionHandler(RuntimeException.class) @ResponseBody public Map<String, Object> exceptionHandler() { Map<String, Object> map = new HashMap<String, Object>(); map.put("errorCode", "101"); map.put("errorMsg", "系統错误!"); returnmap; } } |
3.3、渲染Web页面
渲染Web页面
在之前的示例中,我们都是通过@RestController来处理请求,所以返回的内容为json对象。那么如果需要渲染html页面的时候,要如何实现呢?
模板引擎
在动态HTML实现上Spring Boot依然可以完美胜任,并且提供了多种模板引擎的默认配置支持,所以在推荐的模板引擎下,我们可以很快的上手开发动态网站。
SpringBoot提供了默认配置的模板引擎主要有以下几种:
· Thymeleaf
· FreeMarker
· Velocity
· Groovy
· Mustache
SpringBoot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP将无法实现SpringBoot的多种特性,具体可见后文:支持JSP的配置
当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。
3.4、使用Freemarker模板引擎渲染web视图
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") public String 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> |
/** * @Author 18011618 * @Description * @Date 17:22 2018/7/5 * @Modify By */ @Controller @EnableAutoConfiguration public class ListController { @RequestMapping("/list") public String index(Map<String, Object> result) { result.put("name", "jhp"); result.put("sex", "0"); // 模拟数据 List<Map<String, Object>> friends = new ArrayList<Map<String, Object>>(); Map<String, Object> friend = new HashMap<String, Object>(); friend.put("name", "xbq"); friend.put("age", 22); friends.add(friend); friend = new HashMap<String, Object>(); friend.put("name", "July"); friend.put("age", 18); friends.add(friend); result.put("friends", friends); return "list"; } }
3.4.4、Freemarker其他用法
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8" /> <title>首页</title> </head> <body> ${name} <#if sex=="1"> 男 <#elseif sex=="2"> 女 <#else> 其他
</#if> <#list friends as user> ${user} </#list> </body> </html> |
3.4.5、Freemarker配置文件
###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 publicclass IndexController { @RequestMapping("/index") public String index() { return"index"; } } |
注意:创建SpringBoot整合JSP,一定要为war类型,否则会找不到页面.
四:数据访问
4.1、springboot整合使用JdbcTemplate
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 publicclass UserServiceImpl implements UserService { @Autowired private JdbcTemplate jdbcTemplate; publicvoid createUser(String name, Integer age) { System.out.println("ssss"); jdbcTemplate.update("insert into users values(null,?,?);", name, age); } } |
4.1.4 App类
@ComponentScan(basePackages = "com.itmayiedu") @EnableAutoConfiguration publicclass App { publicstaticvoid main(String[] args) { SpringApplication.run(App.class, args); } } |
注意: spring-boot-starter-parent要在1.5以上
4.2、springboot整合使用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代码
publicinterface UserMapper { @Select("SELECT * FROM USERS WHERE NAME = #{name}") User findByName(@Param("name") String name); @Insert("INSERT INTO USERS(NAME, AGE) VALUES(#{name}, #{age})") int insert(@Param("name") String name, @Param("age") Integer age); } |
4.2.4、启动方式
@ComponentScan(basePackages = "com.itmayiedu") @MapperScan(basePackages = "com.itmayiedu.mapper") @SpringBootApplication publicclass App { publicstaticvoid main(String[] args) { SpringApplication.run(App.class, args); } } |
4.3、springboot整合使用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") publicclass User { @Id @GeneratedValue private Integer id; @Column private String name; @Column private Integer age; // ..get/set方法 } |
4.3.3 创建UserDao
publicinterface UserDao extends JpaRepository<User, Integer> { } |
4.3.4 创建IndexController
@RestController publicclass IndexController { @Autowired private UserDao userDao; @RequestMapping("/index") public String index(Integer id) { User findUser = userDao.findOne(id); System.out.println(findUser.getName()); return"success"; } } |
4.3.5 启动项目
@ComponentScan(basePackages = { "com.itmayiedu" }) @EnableJpaRepositories(basePackages = "com.itmayiedu.dao") @EnableAutoConfiguration @ publicclass App { publicstaticvoid main(String[] args) { SpringApplication.run(App.class, args); } } |
五:缓存支持
7.1注解配置与EhCache使用
7.1.1 pom文件引入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> |
7.1.2新建ehcache.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <diskStore path="java.io.tmpdir/Tmp_EhCache" />
<!-- 默认配置 --> <defaultCache maxElementsInMemory="5000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" memoryStoreEvictionPolicy="LRU" overflowToDisk="false" />
<cache name="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. The default value is false.
11. diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
12. memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
13. clearOnFlush:内存数量最大时是否清除。
14. -->
7.1.3代码使用Cacheable
@CacheConfig(cacheNames = "baseCache") publicinterface UserMapper { @Select("select * from users where name=#{name}") @Cacheable UserEntity findName(@Param("name") String name); } |
7.1.4清除缓存
@Autowired private CacheManager cacheManager; @RequestMapping("/remoKey") publicvoid remoKey() { cacheManager.getCache("baseCache").clear(); } |
7.2 SpringBoot集成Redis
Maven依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> |
新增配置文件信息
######################################################## ###Redis (RedisConfiguration) ######################################################## spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=123456 spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=0 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1 spring.redis.timeout=5000 |
Java代码
@Service publicclass RedisService { @Autowired private StringRedisTemplate stringRedisTemplate;
publicvoid setObject(String key, Object value) { this.setObject(key, value, null); }
publicvoid setObject(String key, Object value, Long time) { if (StringUtils.isEmpty(key) || value == null) { return; } if (valueinstanceof String) { // 存放string类型 String stringValue = (String) value; if (time == null) { stringRedisTemplate.opsForValue().set(key, stringValue); } else { stringRedisTemplate.opsForValue().set(key, stringValue, time, TimeUnit.SECONDS); }
return; } if (valueinstanceof List) { // 存放list類型 List<String> listValue = (List<String>) value; for (String string : listValue) { stringRedisTemplate.opsForList().leftPush(key, string); }
}
}
publicvoid delKey(String key) { stringRedisTemplate.delete(key); }
public String getString(String key) { returnstringRedisTemplate.opsForValue().get(key); }
} |
八:其它特性
8.1、使用@Scheduled创建定时任务
在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置
@Component
publicclassScheduledTasks{
privatestaticfinalSimpleDateFormat dateFormat = newSimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
publicvoidreportCurrentTime() {
System.out.println("现在时间:" +dateFormat.format(new Date()));
}
}
8.2、使用@Async实现异步调用
启动加上@EnableAsync ,需要执行异步方法上加入 @Async
常用功能就讲完了,后面会说一下spring boot多数据源和事务的应用.