本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2021-05(19)

2021-06(42)

2021-07(10)

2021-08(54)

2021-09(37)

Spring Boot由浅入深学习笔记

发布于2021-05-29 20:06     阅读(755)     评论(0)     点赞(27)     收藏(3)


1 spring boot由来

1.1 spring、spring MVC 、spring boot区别

Spring为简化我们的开发工作,封装了一系列的开箱即用的组件功能模块,包括:Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test等。如下经典网络图:

SpringMVC是属于SpringWeb里面的一个功能模块(SpringWebMVC)。专门用来开发SpringWeb项目的一种MVC模式的技术框架实现。MVC:Model(模型)、VIew(视图)、Controller(控制器)。如下经典网络图:

Spring Boot基本上是Spring框架的扩展,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。为更快,更高效的开发生态系统铺平了道路。可以理解为Spring包含了SpringMVC,而SpringBoot又包含了Spring。

1.2 微服务

在前后端分离技术还未普及时,开发需要花大量的时间在JSP上面。那时候都是单体应用,应用的所有功能都开发和打包在一起。当用户访问量变大导致一台服务器无法支撑,开始加服务器加负载均衡;后面发现把静态文件独立出来,通过CDN等手段进行加速,可以提升应用的整体响应。

微服务(Microservice)是SOA(面向服务的架构) 的演进和实践思路。微服务强调每一个微服务应该都是单一职责的,一个微服务解决一个业务问题;将自己的业务能力封装并对外提供服务,微服务本身也可能使用到其它微服务的能力。微服务架构是一种架构思想,是架构不断发展的必然结果,具有构建灵活、易扩展、快速应用、可伸缩性、高可用等特点;微服务架构思想的推出对技术有了更高的要求,在这样的背景下 Spring Boot 孕育而生,Spring Boot 是 Java 领域微服务架构最优落地技术。

1.3 spring boot 优点

1)独立运行的 Spring 项目

Spring Boot 可以以 jar 包的形式独立运行,运行一个 Spring Boot 项目只需通过 java–jar xx.jar 来运行。

2)内嵌 Servlet 容器

Spring Boot 可选择内嵌 Tomcat、Jetty 或者 Undertow,这样我们无须以 war 包形式部署项目。

3)提供 starter 简化Maven配置

Spring 提供了一系列的 starter pom 来简化 Maven 的依赖加载。

4)自动配置 Spring

Spring Boot 会根据在类路径中的 jar 包、类,为 jar 包里的类自动配置 Bean,这样会极大地减少我们要使用的配置。

5)准生产的应用监控

Spring Boot 提供基于 http、ssh、telnet 对运行时的项目进行监控。

6)无代码生成和 xml 配置

Spring Boot 是通过条件注解来实现的,Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

2 Spring Boot搭建

2.1 启动类

这里借助一个在线网站熟悉spring boot 的创建过程:https://start.spring.io/,可以选择“generate”将生成的框架代码下载下来,也可以直接点击“explore”在网页上探索。

在网页上直接查看到spring boot 的启动类。

2.2 @SpringBootApplication 介绍

@SpringBootApplication 是一个“三体”结构,实际上它是一个复合 Annotation:@Configuration@EnableAutoConfiguration@ComponentScan。就是可以直接将原启动代码中的@SpringBootApplication 换成后面符合的三个,启动效果一样。

@Configuration 就是 JavaConfig 形式的 Spring IoC 容器的配置类使用的那个 @Configuration,是一个 IoC 容器的配置类。

@EnableAutoConfiguration也是一个复合 Annotation,其中最重要的是@Import(EnableAutoConfigurationImportSelector.class),借助 EnableAutoConfigurationImportSelector,@EnableAutoConfiguration 可以帮助 SpringBoot 应用将所有符合条件的 @Configuration 配置都加载到当前 SpringBoot 创建并使用的 IoC 容器。简单理解就是借助 @Import 的支持,收集和注册特定场景相关的 bean 定义,如@EnableScheduling 是通过 @Import 将 Spring 调度框架相关的 bean 定义都加载到 IoC 容器。

@ComponentScan 的功能其实就是自动扫描并加载符合条件的组件或 bean 定义,最终将这些 bean 定义加载到容器中。加载 bean 定义到 Spring 的 IoC 容器,我们可以手工单个注册,不一定非要通过批量的自动扫描完成,所以说 @ComponentScan 是可有可无的。

2.3 run执行流程

使用的是 SpringApplication 的静态 run 方法

1)SpringApplication 实例初始化:

根据 classpath 里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为 Web 应用使用的 ApplicationContext 类型,还是应该创建一个标准 Standalone 应用使用的 ApplicationContext 类型。
使用 SpringFactoriesLoader 在应用的 classpath 中查找并加载所有可用的 ApplicationContextInitializer。
使用 SpringFactoriesLoader 在应用的 classpath 中查找并加载所有可用的 ApplicationListener。
推断并设置 main 方法的定义类。

2)执行 run 方法

首先遍历执行所有通过 SpringFactoriesLoader 可以查找到并加载的 SpringApplicationRunListener,调用它们的 started() 方法,告诉这些 SpringApplicationRunListener。

3)扩展点介绍

SpringApplicationRunListener 是一个只有 SpringBoot 应用的 main 方法执行过程中接收不同执行时点事件通知的监听者

ApplicationListener属于 Spring 框架对 Java中实现的监听者模式的一种框架实现

ApplicationContextInitializer是在 ConfigurableApplicationContext 类型(或者子类型)的 ApplicationContext 做 refresh 之前,允许我们对 ConfigurableApplicationContext 的实例做进一步的设置或者处理。
CommandLineRunner 是很好的扩展接口,属于 SpringBoot 应用特定的回调扩展接口。

2.4 自动配置

基于 @EnableAutoConfiguration 的自动配置功能拥有更加强大的调控能力,通过配合比如基于条件的配置能力或者调整加载顺序,我们可以对自动配置进行更加细粒度的调整和控制。

基于条件的自动配置

  1. if(符合 @Conditional 规定的条件){
  2. 加载当前配置(enable current Configuration)或者注册当前bean定义;
  3. }
  4. 要通过 @Conditional 指定自己的 Condition 实现类
  5. @Conditional({MyCondition1.class, MyCondition2.class, ...})

调整自动配置的顺序

可以使用 AutoConfigureBefore 或者 AutoConfigureAfter 让当前配置或者组件在某个其他组件之前或者之后进行。

3 spring-boot-starter配置

3.1 starter-logging

Java的日志系统多种多样,从 java.util 默认提供的日志支持,到 log4j,log4j2,commons logging 等.

1)maven 依赖中添加了 spring-boot-starter-logging

  1. <dependency>
  2. <groupId> org.springframework.boot </groupId>
  3. <artifactId> spring-boot-starter-logging </artifactId>
  4. </dependency>

spring-boot应用将自动使用 logback 作为应用日志框架,要将 spring-boot-starter-logging 作为依赖加入到当前应用的 classpath。

2)使用 log4j 或者 log4j2

  1. <dependency>
  2. <groupId> org.springframework.boot </groupId>
  3. <artifactId> spring-boot-starter-log4j </artifactId>
  4. </dependency>
  5. or
  6. <dependency>
  7. <groupId> org.springframework.boot </groupId>
  8. <artifactId> spring-boot-starter-log4j2 </artifactId>
  9. </dependency>

3.2 starter-web

使用 SpringMVC 开发 web 应用,为了帮我们简化快速搭建并开发一个 Web 项目,SpringBoot 为我们提供了 spring-boot-starter-web 自动配置模块。现加maven依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>

当前项目下运行 mvn spring-boot:run 就可以直接启动一个使用了嵌入式 tomcat 服务请求的 Web 应用,只不过,我们还没有提供任何服务 Web 请求的 Controller,所以,访问任何路径都会返回一个 SpringBoot 默认提供的错误页面,我们可以在当前项目下新建一个服务根路径 Web 请求的 Controller 实现:

  1. @RestController
  2. public class IndexController {
  3. @RequestMapping("/")
  4. public String index() {
  5. return "hello, word";
  6. }
  7. }

注意:静态文件和页面模板的存放位置变了,原来是放在 src/main/webapp 目录下的一系列资源,现在都统一放在 src/main/resources 相应子目录下。

注意:spring-boot-starter-web 默认将为我们自动配置如下一些 SpringMVC 必要组件:

  • 必要的 ViewResolver,比如 ContentNegotiatingViewResolver 和 Bean-NameViewResolver。
  • 将必要的 Converter、GenericConverter 和 Formatter 等 bean 注册到 IoC 容器。
  • 添加一系列的 HttpMessageConverter 以便支持对 Web 请求和相应的类型转换。
  • 自动配置和注册 MessageCodesResolver。

3.3 starter-jdbc

SpringBoot 应用如果只依赖一个数据库,那么,使用 DataSource 自动配置模块提供的配置参数是最方便的:

  1. spring.datasource.url=jdbc:mysql://{database host}:3306/{databaseName}
  2. spring.datasource.username={database username}
  3. spring.datasource.password={database password}

SpringBoot 还会自动配置相应的 JdbcTemplate、DataSourceTransactionManager 等关联“设施”,我们可以直接使用。

若在一个应用中需要依赖和访问多个数据库:

  1. @Bean
  2. @Primary
  3. public DataSource dataSource1() throws Throwable {
  4. DruidDataSource dataSource = new DruidDataSource();
  5. dataSource.setUrl(...);
  6. dataSource.setUsername(...);
  7. dataSource.setPassword(...);
  8. // TODO other settings if necessary in the future.
  9. return dataSource;
  10. }
  11. @Bean
  12. public DataSource dataSource2() throws Throwable {
  13. DruidDataSource dataSource = new DruidDataSource();
  14. dataSource.setUrl(...);
  15. dataSource.setUsername(...);
  16. dataSource.setPassword(...);
  17. // TODO other settings if necessary in the future.
  18. return dataSource;
  19. }
  20. }

3.4 starter-aop

spring-boot-starter-aop 自动配置行为由两部分内容组成:

  1. 位于 spring-boot-autoconfigure的org.springframework.boot.autoconfigure.aop.AopAutoConfiguration 提供 @Configuration 配置类和相应的配置项。
  2. spring-boot-starter-aop 模块自身提供了针对 spring-aop、aspectjrt 和 aspectjweaver 的依赖。

SpringAOP 其实提供了多种横切逻辑织入机制(Weaving),性能损耗上也是各有差别,从运行期间的动态代理和字节码增强 Weavng,到类加载期间的 Weaving,甚至高冷的 AspectJ 二次静态编译 Weaving。

3.5 starter-security

应用安全属于安全防护体系中的重要一环,spring-boot-starter-security 主要面向 Web 应用安全,配合 spring-boot-starter-web,要使用SpringBoot构建一个安全的对外提供服务的 Web 应用

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-security</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency> <!--其他依赖 -->
  10. </dependencies>

SpringSecurity 默认会需要声明一个默认名称为“springSecurityFilterChain”的 org.springframework.web.filter.DelegatingFilterProxy(web.xml 方式或者 JavaConfig 方式),然后指向 IoC 容器中注册的一个 org.springframework.security.web.FilterChainProxy 实例。FilterChainProxy 通过扩展 GenericFilterBean 间接实现了 Filter 接口,同时持有一组 SecurityFilterChain,使它可以针对不同的 Web 资源进行特定的防护:

真正执行防护任务的其实是一个个 org.springframework.security.web.SecurityFilterChain 中定义的一系列 Filter:

public interface SecurityFilterChain {
    boolean matches(HttpServletRequest request);
    List<Filter> getFilters();
}

当我们经常看到如下的 xml schema 形式的配置格式的时候:

<http auto-config='true'>
    <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page='/login.jsp'/>
</http>

其实一个个 http 元素背后对应的就是一个个 SecurityFilterChain 实例,而 http 元素的那些子元素,比如 intercept-url,则对应的就是一个个 Filter。

除了使用 SecurityProperties 暴露的配置项(以 security.* 开头)对 spring-boot-starter-security 进行简单的配置,我们还可以通过给出一个继承了 WebSecurityConfigurerAdapter 的 JavaConfig 配置类对 spring-boot-starter-security 的行为进行更深一级的定制。为了能够让这些调整生效,我们定义的 WebSecurityConfigurerAdapter 实现类一般在顺序上需要先于 spring-boot-starter-security 默认提供的配置:

  1. @Configuration
  2. @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
  3. public class DemoSecurityConfiguration extends WebSecurity-ConfigurerAdapter {
  4. protected DemoSecurityConfiguration() {
  5. super(true); // 取消默认提供的安全相关Filters配置
  6. }
  7. @Override
  8. public void configure(WebSecurity web) throws Exception {
  9. // ...
  10. }
  11. @Override
  12. protected void configure(HttpSecurity http) throws Exception {
  13. // ...
  14. }
  15. // 通过Override其他方法实现对web安全的定制
  16. }

这个时候,我们可以直接实现并注册一个标注了 @EnableWebSecurity 的 JavaConfig 配置类到 IoC 容器,

  1. @Configuration
  2. @EnableWebSecurity
  3. public class OverhaulSecurityConfiguration {
  4. @Bean
  5. public AuthenticationManager authenticationManager() {
  6. // ...
  7. }
  8. @Bean
  9. public AccessDecisionManager accessDecisionManager() {
  10. // ...
  11. }
  12. @Bean
  13. public SecurityFilterChain mySecurityFilterChain() {
  14. // ...
  15. }
  16. // 其他web安全相关组件和依赖配置}
  17. }

 

原文链接:https://blog.csdn.net/xlsj228/article/details/117322775



所属网站分类: 技术文章 > 博客

作者:举起你的手来

链接:http://www.javaheidong.com/blog/article/207312/552665b1ce45386ca0c2/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)