超级实用springBoot学习

Spring Boot

  1. Spring Boot简介

Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的
轻量级代替品。无需开发重量级的 Enterprise JavaBean(EJB),Spring 为企业级
Java 开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java 对象(Plain Old Java Object,POJO)实现了 EJB 的功能。

虽然 Spring 的组件代码是轻量级的,但它的配置却是重量级的。

第一阶段:xml配置
在Spring 1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件放到不同的配置文件里,那时需要频繁的在开发的类和配置文件之间进行切换

第二阶段:注解配置
在Spring 2.x 时代,随着JDK1.5带来的注解支持,Spring提供了声明Bean的注解(例如@Component、@Service),大大减少了配置量。主要使用的方式是应用的基本配置(如数据库配置)用xml,业务配置用注解

第三阶段:java配置
Spring 3.0 引入了基于 Java 的配置能力,这是一种类型安全的可重构配置方式,可以代替 XML。我们目前刚好处于这个时代,Spring4.x和Spring Boot都推荐使用Java配置。

所有这些配置都代表了开发时的损耗。 因为在思考 Spring 特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间。除此之外,项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这难题实在太棘手。并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问会是生产力杀手。

Spring Boot 让这一切成为了过去。
Spring Boot 简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置),这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。
我们可以使用SpringBoot创建java应用,并使用java –jar 启动它,或者采用传统的war部署方式。

Spring Boot 主要目标是:
l 为所有 Spring 的开发提供一个从根本上更快的入门体验
l 开箱即用,但通过自己设置参数,即可快速摆脱这种方式。
l 提供了一些大型项目中常见的非功能性特性,如内嵌服务器、安全、指标,健康检测、外部化配置等
l 绝对没有代码生成,也无需 XML 配置。
2. Spring Boot 入门

2.1. 环境准备

数据库:MySQL
IDE:Eclipse Mars2
Spring-Boot:1.4.4
Maven: 3.3.3 (官方声明1.4.4版本需要Maven 3.2+)
本地仓库:需要使用资料中的仓库
2.2. 起步依赖

2.2.1. 创建一个Maven工程

2.2.2. 添加依赖
在pom.xml中添加依赖,效果如下

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.4.RELEASE</version>
</parent>
<groupId>cn.itcast.springboot</groupId>
<artifactId>itcast-springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

我们会惊奇地发现,我们的工程自动添加了好多好多jar 包,而这些jar 包正式我们做开发时需要导入的jar 包。

因为这些jar 包被我们刚才加入的spring-boot-starter-web 所引用了,所以添加spring-boot-starter-web后会自动把依赖传递过来。

2.3. 变更JDK版本

我们发现默认情况下工程的JDK版本是1.6,但是通常使用的是1.7的版本

修改JDK为1.7,需要在pom.xml中添加以下配置:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Demo {
   

public static void main(String[] args) {
SpringApplication.run(Demo.class, args);
}
}

这里多了一个@SpringBootApplication注解
@Configuration: 用于定义一个配置类
@EnableAutoConfiguration :Spring Boot 会自动根据你jar 包的依赖来自动配置
项目。
@ComponentScan: 告诉Spring 哪个packages 的用注解标识的类会被spring
自动扫描并且装入bean 容器。

Banner
直接启动,控制台出现以下标识。
. _ _ _
/\ / _ ()_ _ _ _ \ \ \ \
( ( )___ | ‘_ | ‘| | ‘ \/ _` | \ \ \ \
\/ _)| |)| | | | | || (| | ) ) ) )
’ |_| .|| ||| |_, | / / / /
=========||==============|__/=///_/
:: Spring Boot :: (v1.4.4.RELEASE)

这个标识是Spring启动标识,如果不想要,可以设置取消

import org.springframework.boot.Banner.Mode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
// SpringApplication.run(Application.class, args);
SpringApplication application = new SpringApplication(Application.class);
application.setBannerMode(Mode.OFF);
application.run(args);
}
}

参考附录二的banner设置,可以通过修改配置文件制定自己的标识。

2.5. 入门程序

需求:使用Spring MVC实现Hello World输出

2.5.1. 原来的实现
我们现在开始使用spring MVC 框架,实现json 数据的输出。如果按照我们原来的做法,需要在web.xml 中添加一个DispatcherServlet 的配置,还需要添加一个spring的配置文件,配置文件如下配置

spring加入配置

<!-- controller注解扫描 -->
<context:component-scan base-package="cn.itcast.springboot.controller" />

<!-- 注解驱动 -->
<mvc:annotation-driven />

web.xml加入配置

<!-- 配置前端控制器 -->
<servlet>
<servlet-name> itcast-springboot</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name> itcast-springboot</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

还要编写Controller。。。

2.5.2. Spring-Boot的实现
我们不需要配置文件,直接编写Controller类即可

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
   

@RequestMapping("info")
public String info() {
return "Hello world!";
}

}

@RestController注解:其实就是@Controller和@ResponseBody注解加在一起

启动方式一:启动之前编写的引导类即可
启动方式二:使用Maven命令spring-boot:run执行即可
选择 Maven Build

在浏览器地址栏输入http://localhost:8080/info 即可看到运行结果

2.6. 热部署

我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间。

能不能在我修改代码后不重启就能生效呢?可以,由于Spring Boot应用只是普通的Java应用,所以JVM热交换(hot-swapping)也能开箱即用。不过JVM热交换能替换的字节码有限制,想要更彻底的解决方案可以使用Spring Loaded项目或JRebel。 spring-boot-devtools 模块也支持应用快速重启(restart)。

我们只需要在pom.xml加入如下配置即可

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
  1. SpringBoot整合

3.1. 整合Spring Data JPA

3.1.1. 需求
使用Spring Boot + Spring MVC + Spring Data JPA + EasyUI 框架组合实现部门列表查询,效果如下:

3.1.2. 环境准备
3.1.2.1. 导入数据库表
在MySQL数据库执行以下语句

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `password` varchar(100) DEFAULT NULL COMMENT '密码',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', 'zhangsan', '123456', '张三');
INSERT INTO `user` VALUES ('2', 'lisi', '123456', '李四');
INSERT INTO `user` VALUES ('3', 'wangwu', '123456', '王五');
INSERT INTO `user` VALUES ('4', 'zhangwei', '123456', '张伟');
INSERT INTO `user` VALUES ('5', 'lina', '123456', '李娜');
INSERT INTO `user` VALUES ('6', 'lilei', '123456', '李磊');

3.1.2.2. 创建Maven工程
itcast-info(打jar包),在pom.xml中进行如下配置

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>

3.1.2.3. 加入Spring-Boot配置文件
在src/main/resources 下添加application.properties 配置文件,内容如下:

DB Configuration:

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/taotao
spring.datasource.username=root
spring.datasource.password=root

JPA Configuration:

spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

此文件用于覆盖Spring Boot的默认配置,完整的配置信息参考“附录2”

3.1.3. 后端实现
3.1.3.1. 创建实体类

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class User {
   
@Id
private Long id;
private String userName;
private String password;
private String name;

//添加 get 和set 方法
}

3.1.3.2. 创建DAO接口

import org.springframework.data.jpa.repository.JpaRepository;
import cn.itcast.info.pojo.User;

public interface UserDao extends JpaRepository<User, Long> {
   
}

3.1.3.3. 创建业务逻辑接口

import java.util.List;
import cn.itcast.info.pojo.User;

public interface UserService {
   
List<User> findAll();
}

3.1.3.4. 创建业务逻辑实现类

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.itcast.info.dao.UserDao;
import cn.itcast.info.pojo.User;
import cn.itcast.info.service.UserService;

@Service
public class UserServiceImpl implements UserService {
   

@Autowired
private UserDao userDao;

@Override
public List<User> findAll() {
List<User> list = this.userDao.findAll();
return list;
}
}

3.1.3.5. 创建Controller

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.itcast.info.pojo.User;
import cn.itcast.info.service.UserService;

@RestController
@RequestMapping("user")
public class UserControlelr {

@Autowired
private UserService userService;

@RequestMapping("list")
public List<User> queryUserAll() {
List<User> list = this.userService.findAll();
return list;
}

}

3.1.3.6. 创建引导类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
   
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}

运行引导类Application,打开浏览器输入http://127.0.0.1:8080/user/list

3.1.4. 前端实现
把资料中的static文件夹,拷贝到src/main/resources路径下

浏览器地址栏输入:http://127.0.0.1:8080/user.html,效果如下

运行引导类Application

3.2. 整合MyBatis

3.2.1. 简单整合
3.2.1.1. 加入依赖
在pom.xml中加入以下依赖

<!-- SpringBoot的Mybatis启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>

3.2.1.2. 编写Mapper
和之前的方式一样,只是多了两个注解
@Mapper:声明Mapper接口
@Select:声明这个接口所需要使用的sql,当然,有查询的注解,肯定就有增删改的注解。

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import cn.itcast.info.pojo.User;

@Mapper
public interface UserMapper {

@Select("select * from user where name like '%${value}%'")
public List<User> queryUserByName(String name);

}

3.2.1.3. 编写Service和Controller
添加Service调用Mapper

@Service
public class UserServiceImpl implements UserService {
   

@Autowired
private UserDao userDao;

@Autowired
private UserMapper userMapper;

@Override
public List<User> findAll() {
List<User> list = this.userDao.findAll();
return list;
}

@Override
public List<User> queryUserByName(String name) {
List<User> list = this.userMapper.queryUserByName(name);
return list;
}

}

修改Controller

@RestController
@RequestMapping("user")
public class UserControlelr {
   

@Autowired
private UserService userService;

@RequestMapping("list")
public List<User> queryUserAll() {
List<User> list = this.userService.findAll();
return list;
}

@RequestMapping("list/{name}")
public List<User> queryUserAll(@PathVariable String name) {
List<User> list = this.userService.queryUserByName(name);
return list;
}

}

3.2.1.4. 测试
浏览器地址栏输入:http://127.0.0.1:8080/user/list/
显示效果:

3.2.2. 整合通用Mapper和分页助手
以上所有的配置都是使用的默认配置,我们只需要专注java代码的开发即可,不需要加入配置文件了。

但并不是所有得场景都是简单的业务,有时候业务复杂,需要我们加入自定义的配置文件;有时候需要载入例如分页助手这样的插件,辅助开发,所以我们也需要了解如何加载这些配置。

3.2.2.1. 加入依赖
我们需要加入通用Mapper和分页插件,所以需要在pom.xml加入以下依赖

<!-- 通用Mapper -->
<dependency>
<groupId>com.github.abel533</groupId>
<artifactId>mapper</artifactId>
<version>2.3.4</version>
</dependency>
<!-- 分页助手 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.7.5</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.1</version>
</dependency>

3.2.2.2. 修改配置文件
在application.properties添加配置

#spring集成Mybatis环境
#pojo别名扫描包
mybatis.type-aliases-package=cn.itcast.info.pojo
#加载Mybatis核心配置文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
mybatis.config-location=classpath:mybatis/SqlMapConfig.xml
#配置连接池,还需要在pom.xml中加入该连接池的依赖
#spring.datasource.type=com.jolbox.bonecp.BoneCPDataSource

在src\main\resources\mapper路径下加入UserMapper.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.itcast.info.dao.UserMapper">
<select id="queryAll" resultType="user">
select * from user
</select>
</mapper>

在src\main\resources\mybatis加入SqlMapConfig.xml配置文件,用以加载通用Mapper和分页助手

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 分页助手 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql" />
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true" />
</plugin>

<!-- 通用Mapper -->
<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
<!--主键自增回写方法,默认值MYSQL,详细说明请看文档 -->
<property name="IDENTITY" value="MYSQL" />
<!--通用Mapper接口,多个通用接口用逗号隔开 -->
<property name="mappers" value="com.github.abel533.mapper.Mapper" />
</plugin>
</plugins>
</configuration>

3.2.2.3. 编写Mapper

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import cn.itcast.info.pojo.User;

//extends com.github.abel533.mapper.Mapper<User>:需要继承通用Mapper
@Mapper
public interface UserMapper extends com.github.abel533.mapper.Mapper<User> {

@Select("select * from user where name like '%${value}%'")
public List<User> queryUserByName(String name);

// 使用UserMapper.xml配置文件
public List<User> queryAll();
}

3.2.2.4. 编写Service和Controller
Service编写

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import cn.itcast.info.dao.UserDao;
import cn.itcast.info.dao.UserMapper;
import cn.itcast.info.pojo.User;
import cn.itcast.info.service.UserService;

@Service
public class UserServiceImpl implements UserService {
   

@Autowired
private UserDao userDao;

@Autowired
private UserMapper userMapper;

@Override
public List<User> findAll() {
List<User> list = this.userDao.findAll();
return list;
}

@Override
public List<User> queryUserByName(String name) {
List<User> list = this.userMapper.queryUserByName(name);
return list;
}

// 调用使用UserMapper.xml的Mapper
@Override
public List<User> queryAll() {
List<User> list = this.userMapper.queryAll();
return list;
}

// 使用通用Mapper和分页助手

@Override
public List<User> queryUserByPage(Integer page, Integer rows) {
// 设置分页
PageHelper.startPage(page, rows);
// 使用通用Mapper的方法进行查询所有数据
List<User> list = this.userMapper.select(null);
return list;
}
}

Controller编写

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.itcast.info.pojo.User;
import cn.itcast.info.service.UserService;

@RestController
@RequestMapping("user")
public class UserControlelr {

@Autowired
private UserService userService;

@RequestMapping("list")
public List<User> queryUserAll() {
List<User> list = this.userService.findAll();
return list;
}

@RequestMapping("list/{name}")
public List<User> queryUserAll(@PathVariable String name) {
List<User> list = this.userService.queryUserByName(name);
return list;
}

@RequestMapping("list/query")
public List<User> queryUserAll2() {
List<User> list = this.userService.queryAll();
return list;
}

@RequestMapping("list/{page}/{rows}")
public List<User> queryUserAll(@PathVariable Integer page, @PathVariable Integer rows) {
List<User> list = this.userService.queryUserByPage(page, rows);
return list;
}

}

3.2.2.5. 测试
测试使用UserMapper.xml
浏览器地址栏输入:http://127.0.0.1:8080/user/list/query

测试使用通用Mapper和分页助手
浏览器地址栏输入:http://127.0.0.1:8080/user/list/2/2

3.3. 整合Redis

3.3.1. 注解方式实现添加缓存
需求:基于上例代码,将列表数据缓存到Redis
3.3.1.1. 加入依赖
在pom.xml加入依赖

<!-- 配置使用redis启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>

3.3.1.2. 修改引导类
修改开启缓存,添加注解@EnableCaching

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class Application {
   
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}

3.3.1.3. 设置实现序列化接口
需要修改实体,让实体实现序列化接口

@Entity
public class User implements Serializable {
   
@Id
private Long id;
private String userName;
private String password;
private String name;

。。。。。。
}

3.3.1.4. 实现添加/删除缓存
修改UserServiceImpl,添加@Cacheable注解实现缓存添加

@Override
@Cacheable(value = "userCache", key = "'user.findAll'")
public List<User> findAll() {
System.out.println("从Mysql中查询");
List<User> list = this.userDao.findAll();
return list;
}

@Override
@CacheEvict(value = "userCache", key = "'user.findAll'")
public List<User> queryUserByName(String name) {
System.out.println("缓存清理了!");
List<User> list = this.userMapper.queryUserByName(name);
return list;
}

这样设置完成后,执行findAll()方法就会使用缓存,如果缓存没有就添加缓存,而queryUserByName(String name)方法则是删除缓存

@Cacheable:添加/使用缓存
@CacheEvict:删除缓存
参数value是缓存的名字,在执行的时候,会找叫这个名字的缓存使用/删除
参数key默认情况下是空串””,是Spring的一种表达式语言SpEL,我们这里可以随意指定,但是需要注意一定要加单引号

3.3.2. redis的深入使用
3.3.2.1. 直接操作redis
redis除了作为缓存使用,还有很多其他的作用,例如利用redis的单线程获取唯一数,例如使用redis为单点登录系统存储用户登录信息等,我们就需要直接操作redis。

官网提供了三种接口RedisConnectionFactory, StringRedisTemplate 和 RedisTemplate,我们可以直接注入或者自己实现其他的实现类,来直接操作redis。我们

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值