SpringBoot浅谈

原理初探

自动配置:

pom.xml

  • springboot-boot-dependencies:核心依赖在父工程中
  • 我们在写或者引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本仓库

启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 就是Springboot的启动场景
  • 比如:spring-boot-starter-web 就会自动导入web环境所有的依赖
  • springboot会将所有的功能场景,都变成一个个启动器
  • 需要使用什么功能,只需要找到对应的启动器就可以了 starter
@SpringBootApplication
public class Springboot01HelloworldApplication {

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

}

注解:

  • @SpringBootApplication:springboot的配置
    • @Configuration:spring配置类
    • @Component:说明这也是一个组件
  • @EnableAutoConfiguration:自动配置
    • @AutoConfigurationPackage:自动配置包
    • @Import(AutoConfigurationPackages.Registrar.class):导入选择器
    • @Import(AutoConfigurationImportSelector.class):自动配置包的核心
    • AutoConfigurationImportSelector:自动选择了什么东西
      • getAutoConfigurationEntry:获得自动配置的实体
      • getCandidateConfigurations:获得候选的配置
      • public static List loadFactoryNames:获得所有的加载配置名
      • loadSpringFactories:
      • 项目资源:classLoader.getResources(FACTORIES_RESOURCE_LOCATION):public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"; 核心注解@ConditionalOnClass 这里面的条件都满足,才会生效。
      • 从这些资源中遍历了所有的nextElement(自动配置),遍历完成之后,封装为Properties供我们使用

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

image-20210905163041034

  1. springboot在启动的时候,从类路径下/META-INF/srping.factories获取指定的值
  2. 将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置
  3. 以前我们需要自己配置的对象,现在springboot帮我们配置
  4. 整哥JavaEE,解决方案和自动配置的对象都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下
  5. 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
  6. 容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动配置 @Configuration , JavaConfig
  7. 有了自动配置类,免去了我们手动编写配置文件的工作

SpringApplication: 这个类主要做了以下四件事情

  1. 推断应用的类型是普通的项目还是Web项目
  2. 查找并加载所有可用初始化器,设置到initializers属性中
  3. 找出所有的应用程序监听器,设置到listeners属性中
  4. 推断并设置main方法的定义类,找到运行的主类

面试官问你你可以这样说

springboot是通过main方法下的SpringApplication.run方法启动的,启动的时候他会调用refshContext方法,先刷新容器,然后根据解析注解或者解析配置文件的形式祖册bean,而它是通过启动类的SpringBootApplication注解进行开始解析的,他会根据EnableAutoConfiguration开启自动化配置,里面有个核心方法ImportSelect选择性的导入,根据loadFanctoryNames根据classpash路径以MATA-INF/spring.factorces下面EnableAutoConfiguration开头的key去加载里面所有对应的自动化配置,他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器

SpringBoot配置

yaml和properties对比:

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  • cp只需要写一次即可,value则需要每个字段都添加
  • 松散绑定:在yaml中,last-name和lastName是一样的效果
  • JSR303数据校验:就是对字段增加一层过滤器验证,保证数据的合法性
  • 复杂类型封装,yaml中可以封装对象,使用@value就不支持

结论:

  • yaml和properties都可以获取到值,但建议使用yaml
  • 如果偶尔需要获取配置文件中的某个值,可以使用@value
  • 如果需要专门编写一个JavaBean来和配置文件映射,就直接使用@ConfigurationProperties。

自动装配原理:

  1. SpringBoot启动会加载大量的自动配置类

  2. 我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中

  3. 再看这个自动配置类中到底配置了哪些组件;只要我们要用的组件存在其中,我们就不需要手动配置了

  4. 给容器中自动配置类添加组件的时候,会从properties类中获取某个属性,我们只需要在配置文件中指定这些属性的值即可

    xxxxAutoConfiguration:自动配置类,给容器中添加组件

    xxxxProperties:封装配置文件中相关属性

SpringBootWeb开发

1、准备工作:

  • 添加自己的视图解析器
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    //ViewResolver 实现了视图解析器接口的类,就可以把他看做视图解析器
    @Bean
    public ViewResolver myViewRecolver(){
        return new MyViewResolver();
    }

    //自定义了一个自己的视图解析器
    public static class MyViewResolver implements ViewResolver{
        @Override
        public View resolveViewName(String s, Locale locale) throws Exception {
            return null;
        }
    }
}
  • 扩展mvc,视图跳转
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
      //视图跳转
      @Override
      public void addViewControllers(ViewControllerRegistry registry) {
          registry.addViewController("/bybing").setViewName("test");
      }
    }
    

在springboot中有非常多的xxxConfiguration帮助进行扩展配置,只要看到xxxConfiguration就得注意。

  1. 首页配置:
    1. 注意点,所有页面的静态资源都需要使用thymeleaf来接管

    2. 跳转url使用@{}

  2. 页面国际化:

    1. 需要配置i18n文件
    2. 如果需要在项目中进行按钮自动切换,我们需要自定义一个组件LocaleResolver
    3. 记得将自己写的组件配置到spring容器Bean
    4. #{}
  3. 登录+拦截器
    public class LoginHandlerInterceptor implements HandlerInterceptor {
    
       @Override
       public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
           //登录成功之后,应该有用户的session
           Object loginUser = request.getSession().getAttribute("loginUser");
           if(loginUser == null){//没有登录
               request.setAttribute("msg","没有权限,请先登录");
               request.getRequestDispatcher("/index.html").forward(request,response);
               return false;
           }else{
               return true;
           }
       }
    }
    
    

    然后再将写的组件配置到spring容器

    //登录+权限拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(new LoginHandlerInterceptor())
           .addPathPatterns("/**").excludePathPatterns("/index.html","/","/user/login");
    }
    
  4. 员工列表展示
    1. 提取公共页面
    • 提取在后面添加th:fragment="topbar",使用时在指定位置添加<div th:replace="~{commons::topbar}"></div>即可

    • 如果要传递参数,可以直接使用()传参,接收判断即可

      举例:点击导航栏后高亮显示

      <a th:class="${active=='main.html'?'nav-link active':'nav-link'}" th:href="@{/index.html}">
      
      <div th:replace="~{commons::sidebar(active='main.html')}"></div>
      
    1. 列表循环展示
  5. 添加员工
    1. 按钮提交

    2. 跳转添加页面

    3. 添加成功

    4. 返回首页

    5. 错误页面

      添加error文件夹,创建404.html 500.html页面即可,springboot会自动配置!

前端:

  • 模板:
  • 框架:组件,自己手动组合拼接

spring-boot整合Mybatis

mybatis-spring-boot-starter

1.导入包 2.配置文件3.mybatis配置 4.编写sql 5.service层调用dao层 6.controller层调用service层

pom.xml添加:

<!--mybatis-spring-boot-starter 整合-->
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

再次理解MVC三层架构:M:数据和业务 V:前端视图层 C:交接Controller层

Spring Security(安全)

  • 功能权限
  • 访问权限
  • 菜单权限
  • 拦截器,过滤器

简介:

Spring Security是针对Spring项目的安全框架,也是SpringBoot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入spring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理

重要的几个类:

  • WebSecurityConfigurerAdapter:自定义Secutiy策略
  • AuthenticationManagerBuilder:自定义认证策略
  • @EnableWebSecurity:开启WebSecurity模式

Spring Security的两个主要目标是”认证”和”授权”(访问控制)

认证:Authentication

授权:Authorization

这两个概念是通用的,并不仅限于Spring Security

Shiro

//获取当前的用户对象
Subject currentUser = SecurityUtils.getSubject();

//通过当前用户拿到session
Session session = currentUser.getSession();

//判断当前的用户是否被确认
if (!currentUser.isAuthenticated()) {}

//获得当前用户的认证
currentUser.getPrincipal();

//查看当前用户有什么角色
currentUser.hasRole("schwartz");

//查看有什么权限
currentUser.isPermitted("lightsaber:wield");

分布式Dubbo+Zookeeper+SpringBoot

序列化:数据传输的转换

Zookeeper:注册中心

dubbo-admin:是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注