SpringBoot狂神说学习笔记

SpringBoot

1.Hello World

  • tomcat服务器已经内嵌

  • 不需要再去配置一些以前的ssm的配置文件,springboot都给配置好了

package com.demo1.controller;

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

@RestController //@Controller和@ResponseBody的结合,此类中的所有方法都加上了@ResponseBody
@RequestMapping("/hello")
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
       return "hello world!!!";
   }
}
  • 如何更改启动的端口号,例如将8080改变为8081
在resources目录下的application.properties中更改
server.port=8081
  • 如何设置启动时候的banner,在resources下新建banner.txt,将文字形成的图片放入进去

2.pom.xml

  • spring-boot-dependencies:核心依赖在父工程中

  • 导入一些springboot依赖的时候,不需要指定版本,因为有这些版本仓库

  • 启动器:说白了就是springboot的启动场景,比如spring-boot-starter-web,会帮我们导入web环境所所有的依赖,我们需要什么功能,找到相应的启动器即可

3.Spring Boot原理初探

springboot所有的自动配置类都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了相应的starter,就有了对应的启动器,有了启动器,自动装配就会生效,然后就配置成功

4.关于全局配置文件的使用

SpringBoot使用一个全局配置文件,配置文件名称是固定的

  • application.properties

    • 语法结构:key=value
  • application.yaml

    • 语法结构:key:空格value
application.yaml

#普通的key-value
name: wyf

#对象
student:
	name: wyf
	age:3
#对象的行内写法
student: {那么: wyf,age: 3}

#数组
pets:
	- cat
	- dog
	- pig
#数组的行内写法
pets: [cat,dog,pig]

5.JSR303校验

@Component
@Data
@ConfigurationProperties(prefix = "person")
@Validated//开启数据校验
public class Person {

    @Email(message = "邮箱格式错误")//给email赋值必须是email类型
    private String email;
    private Integer age;
    private boolean happy;
    
}

6.springboot的多环境配置

//application.properties
#可以指定激活哪一个配置文件
spring.profiles.active=test/dev
//application-dev.properties
server 
	port: 8081
//application-test.properties
server 
	port: 8082

7.SpringBoot可以自己扩展springmvc的配置文件

@Configuration
@EnableWebMvc
public class MyMvcConfig implements WebMvcConfigurer {

    //设置静态资源的访问路径
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/").addResourceLocations("classpath:/templates/");
    }
	//添加视图控制器
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
      registry.addViewController("/").setViewName("index");
      registry.addViewController("/index.html").setViewName("index");
    }

}

8.页面国际化(页面可以中英文切换)

  • 需要配置i18n(国际化单词的缩写)文件

  • 如果需要在项目中进行按钮自动切换,我们需要自定义一个组件LocalResolver

  • 将自己写额组件配置到spring容器中,@Bean

9.登录加拦截器

//form表单提交按钮之后会走action,并将name="username"和name="password"传递到后端
<form class="form-signin" th:action="@{/user/login}">
    <img class="mb-4" th:src="@{/img/bootstrap-solid.svg}" alt="" width="72" height="72">
    <h1 class="h3 mb-3 font-weight-normal">Please sign inh1>
    <p  style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}">p>
    
    <input type="text" name="username" class="form-control" placeholder="Username" required="" autofocus="">
    <input type="password"  name="password" class="form-control" placeholder="Password" required="">
    
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign inbutton>
form>
@Controller
public class LoginController {
    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username, 
                        @RequestParam("password") String password, 
                        Model model, HttpSession session){
        //具体的业务
        if (!StringUtils.isEmpty(username) && "123456".equals(password)){
            session.setAttribute("loginUser",username);
            return "redirect:/main.html";
        }else {
            model.addAttribute("msg","用户名密码错误");
            return "index";
        }
    }
}
//配置自己的拦截器,重写方法
public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object loginUser = request.getSession().getAttribute("loginUser");
        if (loginUser == null){
            request.setAttribute("msg","没有权限,请先登录");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;
        }else{
            return true;
        }
    }
}
//扩展mvc的配置文件
@Configuration
@EnableWebMvc
public class MyMvcConfig implements WebMvcConfigurer {

    //可以加载静态资源
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/").addResourceLocations("classpath:/templates/");
    }

    //配置视图控制器
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
      registry.addViewController("/").setViewName("index");
      registry.addViewController("/index.html").setViewName("index");
      registry.addViewController("main.html").setViewName("dashboard");
    }

    //配置拦截器的拦截条件
    @Override/70
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor())
                .addPathPatterns("/**").excludePathPatterns()
                .excludePathPatterns("/index.html","/","/user/login","/css/*","/js/**","/img/**");
    }
}

10.Spring Boot默认数据库连接池

SpringBoot默认数据库连接池Hikari Hikari是一款非常强大,高效,并且号称“史上最快连接池。

11.Druid简介

  • Druid是阿里巴巴开源平台上的一个数据库连接池实现,结合了c3p0、DBCP、PROXOOL等数据库连接池的优点,同时加入了日志监控。

Spring Boot2.0以上默认使用Hikari数据源,可以说Hikari与Driud都是当前Java Web上最优秀的数据源。

  • Druid有自己的后台监控平台,可以清晰的看到每一条sql语句的执行信息
//对Driud的一些属性进行设置
@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")//指定配置哪的属性
    @Bean
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }

    //后台监控 :相当于web.xml
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet());

        //后台需要有人登录,账号密码配置
        HashMap<String,String> initParameters = new HashMap<>();

        //增加配置
        //设置后端监控平台的用户名和密码
        initParameters.put("loginUsername","admin");
        initParameters.put("loginPassword","123456");

        //设置允许谁可以访问
        initParameters.put("allow","");

        bean.setInitParameters(initParameters);
        return bean;
    }
    //同样也可以配置过滤器,对哪些请求不进行统计
}

在这里插入图片描述

12.Spring Boot整合Mybatis

  • 导入mybatis和jdbc的依赖包
  • 在.yaml中配置mapper的路径
//在application.yaml中配置mybatis的mapper-locations的路径(注意mapper是否需要增加@Mapper和@Repository)
mybatis-plus:
  mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml,classpath:mapper/*/*Mapper.xml
  • 编写mapper.xml(写sql的地方)

13.Spring Security

  • Spring Security是针对项目的安全框架,也是spring boot底层安全模块认证的技术选型,可以实现强大的Web安全控制,仅仅需要导入spring-boot-starter-security模块,进行少量的配置

  • 记住几个重要的类

    • WebSecurityConfigurerAdapter:自定义Security策略
    • AuthenticationManagerBuilder:自定义认证策略
    • EnableWebSecurity:开启WebSecurity模式
  • Spring Security两个主要目标是认证和授权

//设置自己的安全策略
@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
        http.formLogin();
        
        //开启注销功能
        http.logout();
        
        //开启记住我,存了一个cookie,默认时长2周
        http.rememberMe();
    }

    //认证,认证之后,授权的界面才能进行访问
    //需要对密码进行加密,Java中有默认的MD5加密
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //这些数据正常应该从数据库中进行读取
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("wyf").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3").and()
                .withUser("csq").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    }
}

14.Spring Boot整合Shiro

  • shiro的三层

    • Subject:用户
    • SecurityManager:管理所有用户
    • Realm:连接数据库
  • shiro的内置过滤器

    • anon:无需认证就可以访问
    • authc:必须认证了才能进行访问
    • user:必须拥有记住我功能才能访问
    • perms:拥有对某个资源的权限才能访问
    • role:拥有某个角色权限才能访问
  • Shiro的具体实现

    • 定义自己的两个类UserRealm

SpringBoot狂神说学习笔记_第1张图片

  • ShiroConfig
    SpringBoot狂神说学习笔记_第2张图片

  • 在ShiroConfig的安全管理器中实现登录拦截,设置只有认证的用户才能进行请求操作
    SpringBoot狂神说学习笔记_第3张图片

  • 实现用户认证,将前端传过来的用户名和密码封装成为一个token令牌

SpringBoot狂神说学习笔记_第4张图片

  • 在自己的Realm类中进行token的验证(编写一个user的实体类,通过mybatis获取数据库中的用户数据)

SpringBoot狂神说学习笔记_第5张图片

  • shiro也可以整合Thymeleaf模板引擎,(具有可以添加信息权限的用户显示添加按钮,对于具有添加和删除权限的用户显示添加和删除按钮)

​ 需要导入导入thymeleaf-extras-shiro依赖包

15.Swagger的使用(测试接口的文档)

//实体类
@ApiModel("用户实体类")
public class user(){

	@ApiModelProperty("用户名")
	public String username;
	
	@ApiModelProperty("密码")
	public String password;
}
@Api(tags="纪念日祝福")
@RestController
@RequestMapping("/birthday/zhBirthdayBless")
public class ZhBirthdayBlessController extends JeecgController<ZhBirthdayBless, IZhBirthdayBlessService> {
	@Autowired
	private IZhBirthdayBlessService zhBirthdayBlessService;

	@ApiOperation(value="纪念日祝福-分页列表查询", notes="纪念日祝福-分页列表查询")
	@GetMapping(value = "/list")
	public Result<IPage<ZhBirthdayBless>> queryPageList(ZhBirthdayBless zhBirthdayBless,
								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
								   HttpServletRequest req) {
		QueryWrapper<ZhBirthdayBless> queryWrapper = QueryGenerator.initQueryWrapper(zhBirthdayBless, req.getParameterMap());
		Page<ZhBirthdayBless> page = new Page<ZhBirthdayBless>(pageNo, pageSize);
		IPage<ZhBirthdayBless> pageList = zhBirthdayBlessService.page(page, queryWrapper);
		return Result.OK(pageList);
 }
  • 在正式发布的时候,需要关闭Swagger,出于安全,并且节省运行的内存

16.异步任务

  • 目的是实现页面秒刷新,但是业务层的处理仍在进行
  • 给需要进行异步的方法加上@Async注解
    SpringBoot狂神说学习笔记_第6张图片
  • 在启动类上加上注解开启异步注解功能
    SpringBoot狂神说学习笔记_第7张图片

17.定时任务

TaskScheduler 任务调度者
TaskExecutor  任务执行者
@EnableScheduling	//开启定时功能的注解
@Scheduled	//什么时候执行
  • 在启动类上加上开启定时功能的注解@EnableScheduling

  • 在方法上加上@Scheduled注解表示什么时候执行

@Service
public class ScheduledService{
//在特定一个时间执行这个方法
//cron表达式
//秒 分 时 日 月 周几

@Scheduled(cron = "30 15 10 * * ?")
public void hello(){
	System.out.println("hello,你在每日的10点15分30秒被执行了")
	}
}
  • 可以在百度搜索cron生成,会根据自己设定执行的时间生成cron表达式

18.SpringBoot集成Redis

  • Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为 String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。

  • RedisTemplate提供了redis各种操作。

  • springboot2.x以后,Lettuce是一个高性能基于Java编写的Redis驱动框架

  • RedisTemplate和StringRedisTemplate区别

    • StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。而stringredistemplate,默认存入的数据就是原文,因为stringRedistemplate默认使用的是string序列化策略。

    • RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。RedisTemplate默认使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示。

19.分布式一些概念

  • RPC:远程调用,是一种技术的概念名词。RPC可以通过 HTTP 来实现,也可以通过Socket自己实现一套协议来实现.所以题目可以换一种理解,为何 RPC 还有除 HTTP 之外的实现法,有何必要,毕竟除了HTTP实现外,私有协议不具备通用性。

  • RPC好处:如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了:首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。最后是安全性。

为stringRedistemplate默认使用的是string序列化策略。

  • RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。RedisTemplate默认使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示。

19.分布式一些概念

  • RPC:远程调用,是一种技术的概念名词。RPC可以通过 HTTP 来实现,也可以通过Socket自己实现一套协议来实现.所以题目可以换一种理解,为何 RPC 还有除 HTTP 之外的实现法,有何必要,毕竟除了HTTP实现外,私有协议不具备通用性。

  • RPC好处:如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了:首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。最后是安全性。

你可能感兴趣的:(spring,boot,java,spring)