美文网首页
Java进阶框架之SpringBoot

Java进阶框架之SpringBoot

作者: 在error边缘疯狂试探 | 来源:发表于2020-04-18 14:06 被阅读0次

    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功能,防攻击用的。

    相关文章

      网友评论

          本文标题:Java进阶框架之SpringBoot

          本文链接:https://www.haomeiwen.com/subject/feqvvhtx.html