SpringBoot的优点
- 开箱即用,提供各种默认配置来简化项目配置(自动装配)。
- 内嵌容器,简化Web项目。
- 没有冗余的代码生成和XML配置要求。
Tips:Maven、Spring、SpringMVC、SpringBoot都是约定大于配置。
什么是微服务?
- 微服务是一种架构风格,他要求我们在开发一个应用的时候,这个应用必须构建成一系列小服务的组合,可以通过http的方式进行互通。
- 单体架构:(all in one)将一个应用中的所有应用服务都放在一个应用中。
我的第一个SpringBoot程序
- 在application.properties修改端口号:
sever.port=8081
SpringBoot自动装配原理
- 为什么导入依赖不用写版本? 在pom文件中的父工程中管理了很多核心依赖的版本,但是如果导入的包没有在依赖中管理着就需要手动配置版本了。
- 每个依赖中的springboot-start-xxx就相当于xxx的启动器。
- @SpringBootApplication:标注这是一个springboot的应用。
- @EnableAutoConfiguration:自动注入配置
- @EnableConfigurationProperties(xxxProperties.class):自动配置属性,在这个
xxxProperties.class
里面就有我们需要在application.properties配置文件中的值,即我们在配置文件中写的一些配置都会被这个class读取并注入给它的属性值。 - 在spring-boot-autoconfigure包中有个META-INF包下的
spring.factories
文件,这个就是自动配置的核心文件,里面配置了许多组件,它会把所需要的组件导入的组件,以类名的方式返回,这些组件就会被添加到容器中,容器中也有很多xxxAutoConfiguration的文件,就是因为这些类给容器导入了一些相关的组件才实现了自动配置。
- 核心注解@ConditionOnxxx(条件)派生注解:表示如果这里的条件都满足则才会生效。如,springboot中有很多的配置但是只有引入了启动类才会生效。
【总结】:所以,自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。
Tips:springboot所有的自动配置都是在启动的时候才扫描并加载,所有的自动配置类都在这个
spring.factories
文件中,但不一定生效,要判断是否满足条件(是否导入了相关的架包),导入了相关的启动器这个自动装配就会生效(自动装配的类在容器中),然后就可以配置成功。
SpringBoot自定义装配
- 为什么以经自动装配了,还要我们自定义呢?虽然SpringBoot已经给我们自动装配了一些配置,但是对于我们实际开发是不够的,如果自己不去配置的话,估计就只能写个helloword程序了。
- 可以通过
@ConfigurationProperties(prefix="xxx")
与yml配置文件中的属性值绑定。 - SpringBoot中可以在一下路径存放资源文件,
classpath:public
,classpath:resources
,classpath:static
,其中的优先级resources>static>public。 - 网站icon配置:在springboot 2.2.x中修改了以前配置网站图标方式,不需要在文件中声明了,而是在HTML中以标签的形式写出,例如:<link rel="icon" th:href="@{/public/favicon.ico}" type="image/x-icon"/>
- 网站首页配置:在静态资源目录下创建index.html就会弹到首页,默认是没有这个页面的所以一开始我们进去都是弹404 error页面。
Tips:在templates目录下的文件或页面只能通过controller操作才能访问,有点像以前学的WEB-INF目录。
Thymeleaf模板引擎
- Thymeleaf我们都是基于3.x进行开发的(Springboot 2.x ),导入依赖:(这个模板有视图解析器的功能,有了这个模板才能利用controller跳转)
<!--引入thymeleaf依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
-
在HTML页面中,还需要导入头文件
<html lang="en" xmlns:th="http://www.themleaf.org">
-
Thymeleaf官方文档 :https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
-
所有的html元素都可以被thymeleaf替换接管:th: 元素名。
-
遍历数组:
<h3 th:each="user:${users}" th:text="${user}"></h3>
-
日期格式转换,可以直接在html页面中使用thymeleaf的
<h3 th:text="${#dates.format(相关数据,'yyyy-MM-dd HH:mm:ss')}"></h3>
方法,可以不用在后台写方法。
Tips:如果想在修改操作时,想得到修改前的数据就先查询出来。
整合Mybatis
- 首先要导入mybatis-spring-boot-start依赖,以及数据库驱动、springboot-jdbc的依赖。
- 在application.properties中配置数据源及用户名和密码,创建mapper,在每个mapper类上加@Mapper、@Repositoty注解。
- 若要使用xml方式实现增删改查,要创建xxxMapper.xml文件。
- 并且要在application.properties配置相关信息
# 整合mybatis
mybatis.type-aliases-package="com.cwx.pojo" #取别名
mybatis.mapper-locations="classpath:mapper/*.xml" #配置mapper
- 若使用注解的方式就直接在方法上使用相关的注解操作。
整合SpringSecurity(具体的细节可以百度)
- SpringSecurity是利用AOP的思想,对代码横切进去的,不用改源码,直接加配置类就可以了。
- 导入spring-boot-start-security依赖。其中有几个重要的类:
- WebSecurityConfigurerAdapter:自定义security策略。
- AuthenticationManagerBuilder:自定义认证策略。
- @EnableWebSecurity:开启WebSecurity模式。
- 认证( Authentication)、授权(Authorization)。
- 首先创建一个配置类并继承 WebSecurityConfigurerAdapter,并加上@EnableWebSecurity。
- 重写认证(得到用户是什么,有什么角色)的方法configure(AuthenticationManagerBuilder auth)、重写授权(给网页授权,即判定你有什么权限才能够访问该页面)的方法configure(HttpSecurity http)。
- security搭配thymeleaf:
- 导入依赖,就可在前端页面使用
sec:authorize="isAuthenticated()"
,判断是否验证(登录)了,如果有则显示该内容,sec:authentication="name"
获得登录的用户名,sec:authentication="principal.authorites"
获得权限名(角色名),sec:authorize="hasRole('xxx')"
如果有这个角色才显示该内容。
HTML可以引入头文件,会有提示。xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
- 导入依赖,就可在前端页面使用
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
举例:
package com.cwx.config;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//定制请求的授权规则
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/").permitAll()
.antMatchers("/level1/**").hasRole("vip1")
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
//开启自动配置的登录功能:如果没有权限,就会跳转到登录页面!
// /login 请求来到登录页
// /login?error 重定向到这里表示登录失败
http.formLogin()
.usernameParameter("username")
.passwordParameter("password")
.loginPage("/toLogin")
.loginProcessingUrl("/login"); // 登陆表单提交请求
//开启自动配置的注销的功能
// /logout 注销请求
// .logoutSuccessUrl("/"); 注销成功来到首页
http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求
http.logout().logoutSuccessUrl("/");
//记住我
http.rememberMe().rememberMeParameter("remember");
}
//定义认证规则
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//在内存中定义,也可以在jdbc中去拿....这里演示的是在内存中拿!
//Spring security 5.0中新增了多种加密方式,也改变了密码的格式。
//要想我们的项目还能够正常登陆,需要修改一下configure中的代码。我们要将前端传过来的密码进行某种方式加密
//spring security 官方推荐的是使用bcrypt加密方式。
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("kuangshen").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
.and()
.withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
.and()
.withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2");
}
}
Tips:登录失败可能的原因有
http.csrf().disable();
没有关闭csrf功能,防攻击用的。
网友评论