Spring Boot
1.springboot概念
springboot是spring快速开发脚手架,通过约定大于配置的方式,快速构建和启动spring项目 。
spring的缺点:
- 复杂的配置:项目各种配置是开发时的损耗, 写配置挤占了写应用程序逻辑的时间。
- 混乱的依赖管理:项目的依赖管理非常的繁琐。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这是一个棘手的问题。并且,一旦选错了依赖的版本,随之而来的就是各种的不兼容的bug。
spring boot 可以解决上面2个问题.
Spring Boot 特点:
- 快速开发spring应用的框架
- 内嵌tomcat和jetty容器,不需要单独安装容器,jar包直接发布一个web应用
- 简化maven配置,parent这种方式,一站式引入需要的各种依赖
- 基于注解的零配置思想
- 和各种流行框架,spring web mvc,mybatis,spring cloud无缝整合
2.全注解配置和属性注入
2.1.全注解配置
spring全注解配置主要靠java类和一些注解,比较常用的注解有:
- @Configuration :声明一个类作为配置类,代替xml文件
- @Bean :声明在方法上,将方法的返回值加入Bean容器,代替 标签
- @value :属性注入
- @PropertySource :指定外部属性文件
用java配置来尝试实现连接池配置:
首先引入Druid连接池依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
创建一个jdbc.properties文件,编写jdbc属性:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=123456
然后编写代码:
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
解读:
- @Configuration :声明我们 JdbcConfig 是一个配置类
- @PropertySource :指定属性文件的路径是: classpath:jdbc.properties
- 通过 @Value 为属性注入值
- 通过@Bean将 dataSource() 方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值加入Spring容器中。默认的对象名id=方法名,可以通过@Bean(“自定义名字”),来指定新的对象名
接下来就可以在任意位置通过 @Autowired 注入DataSource。
在 HelloController 中测试:
@RestController
public class HelloController {
@Autowired
private DataSource dataSource;
@GetMapping("hello")
public String hello() {
return "hello, spring boot!" + dataSource;
}
}
2.2.属性注入
1.新建一个类,用来进行属性注入:
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
// ... 略
// getters 和 setters
}
- 在类上通过@ConfifigurationProperties注解声明当前类为属性读取类
- prefix=“jdbc” 读取属性文件中,前缀为jdbc的值。
- 在类上定义各个属性,名称必须与属性文件中 jdbc. 后面部分一致
- 需要注意的是,这里我们并没有指定属性文件的地址,所以我们需要把jdbc.properties名称改为application.properties,这是SpringBoot默认读取的属性文件名:
2.在JdbcConfifig中使用这个属性:
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {
@Bean
public DataSource dataSource(JdbcProperties jdbc) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbc.getUrl());
dataSource.setDriverClassName(jdbc.getDriverClassName());
dataSource.setUsername(jdbc.getUsername());
dataSource.setPassword(jdbc.getPassword());
return dataSource;
}
}
通过 @EnableConfigurationProperties(JdbcProperties.class) 来声明要使用 JdbcProperties 这个类的对象。
可以通过以下方式注入JdbcProperties:
@Autowired注入 :
@Autowired
private JdbcProperties prop;
构造函数注入:
private JdbcProperties prop;
public JdbcConfig(Jdbcproperties prop){
this.prop = prop;
}
声明有@Bean的方法参数注入 :
@Bean
public Datasource dataSource(JdbcProperties prop){
// ...
}
3.整合SpringMVC
修改端口:# 映射端口:server.port=80
3.1.访问静态资源
默认的静态资源路径为:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public
习惯会把静态资源放在 classpath:/static/ 目录下。
3.2.添加拦截器
1.首先我们定义一个拦截器:
public class LoginInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) {
logger.debug("处理器执行前执行!");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) {
logger.debug("处理器执行后执行!");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
logger.debug("跳转后执行!");
}
}
2.通过实现 WebMvcConfigurer 并添加 @Configuration 注解来实现自定义部分SpringMvc配置:
@Configuration
public class MvcConfig implements WebMvcConfigurer{
/**
* 通过@Bean注解,将我们定义的拦截器注册到Spring容器
* @return
*/
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
/**
* 重写接口中的addInterceptors方法,添加自定义拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 通过registry来注册拦截器,通过addPathPatterns来添加拦截路径
registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");
}
}
ant path路径匹配通配符 :
- ‘?’ 匹配任何单字符
- ‘*’ 匹配0或者任意数量的字符
- ‘/**’ 匹配0或者更多的目录
结构如下:
接下来运行并查看日志:你会发现日志中什么都没有,因为我们记录的log级别是debug,默认是显示info以上,我们需要进行配置。
# 设置com.lxs包的日志级别为debug
logging.level.com.lxs=debug
4.整合jdbc
引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
配置连接池:
# 连接四大参数
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=123456
# 可省略,SpringBoot自动推断
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10
5.整合mybatis
<!--mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
# mybatis 别名扫描
mybatis.type-aliases-package=com.lxs.domain
# mapper.xml文件位置,如果没有映射文件,请注释掉
mybatis.mapper-locations=classpath:mappers/*.xml
实体类,直接使用jdbc用到的实体类。
接口:
public interface UserDao {
public List<User> findAll();
}
映射文件:
<?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="com.lxs.demo.dao.UserDao">
<select id="findAll" resultType="user">
select * from tb_user
</select>
</mapper>
Mapper的加载接口代理对象方式有2种
第一种:使用@Mapper注解(不推荐) 需要注意,这里没有配置mapper接口扫描包,因此我们需要给每一个Mapper接口添加 @Mapper 注解,才能被识别。
@Mapper
public interface UserMapper {
}
第二种设置MapperScan,注解扫描的包(推荐),@MapperScan(“dao所在的包”),自动搜索包中的接口,产生dao的代理对象。
@SpringBootApplication
@MapperScan("com.lxs.demo.dao")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
6.Thymeleaf
Thymeleaf 是一个跟 FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下特点:
- 动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,无网络显示静态内容,有网络用后台得到数据替换静态内容。
- 与SpringBoot完美整合,springboot默认整合thymeleaf。
thymeleaf表达式:
1.变量表达式即OGNL表达式或Spring EL表达式(在Spring中用来获取model attribute的数据)。如下所示: ${session.user.name}
它们将以HTML标签的一个属性来表示:
<h5>表达式</h5>
<span>${text}</span>
<span th:text="${text}">你好 thymleaf</span>
2.选择表达式很像变量表达式,不过它们用一个预先选择的对象来代替上下文变量容器(map)来执行,如下:
- {customer.name}
被指定的object由th:object属性定义:
<tr th:each="user : ${users}" th:object="${user}">
<td th:text="${user.id}">1</td>
<td th:text="*{name}">张三</td>
<td th:text="*{userName}">zhangsan</td>
....
3.URL表达式指的是把一个有用的上下文或回话信息添加到URL,这个过程经常被叫做URL重写。 @{/order/list}
URL还可以设置参数: @{/order/details(id=${orderId}, name=*{name})} 相对路径:@{…/documents/report}
url表达式:
<a th:href="@{/delete(id=${user.id}, userName=*{userName})}">删除</a>
文本替换:
<a th:href="|/update/${user.id}|">修改</a>
字符串拼接:
<a th:href="'/approve/' + ${user.id}">审核</a>