发布于2021-05-29 20:06 阅读(1096) 评论(0) 点赞(27) 收藏(3)
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。
在前后端分离技术还未普及时,开发需要花大量的时间在JSP上面。那时候都是单体应用,应用的所有功能都开发和打包在一起。当用户访问量变大导致一台服务器无法支撑,开始加服务器加负载均衡;后面发现把静态文件独立出来,通过CDN等手段进行加速,可以提升应用的整体响应。
微服务(Microservice)是SOA(面向服务的架构) 的演进和实践思路。微服务强调每一个微服务应该都是单一职责的,一个微服务解决一个业务问题;将自己的业务能力封装并对外提供服务,微服务本身也可能使用到其它微服务的能力。微服务架构是一种架构思想,是架构不断发展的必然结果,具有构建灵活、易扩展、快速应用、可伸缩性、高可用等特点;微服务架构思想的推出对技术有了更高的要求,在这样的背景下 Spring Boot 孕育而生,Spring Boot 是 Java 领域微服务架构最优落地技术。
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 的所有配置。
这里借助一个在线网站熟悉spring boot 的创建过程:https://start.spring.io/,可以选择“generate”将生成的框架代码下载下来,也可以直接点击“explore”在网页上探索。
在网页上直接查看到spring boot 的启动类。
@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 是可有可无的。
使用的是 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 应用特定的回调扩展接口。
基于 @EnableAutoConfiguration 的自动配置功能拥有更加强大的调控能力,通过配合比如基于条件的配置能力或者调整加载顺序,我们可以对自动配置进行更加细粒度的调整和控制。
基于条件的自动配置
- if(符合 @Conditional 规定的条件){
- 加载当前配置(enable current Configuration)或者注册当前bean定义;
- }
-
-
- 要通过 @Conditional 指定自己的 Condition 实现类
- @Conditional({MyCondition1.class, MyCondition2.class, ...})
调整自动配置的顺序
可以使用 AutoConfigureBefore 或者 AutoConfigureAfter 让当前配置或者组件在某个其他组件之前或者之后进行。
Java的日志系统多种多样,从 java.util 默认提供的日志支持,到 log4j,log4j2,commons logging 等.
1)maven 依赖中添加了 spring-boot-starter-logging
- <dependency>
- <groupId> org.springframework.boot </groupId>
- <artifactId> spring-boot-starter-logging </artifactId>
- </dependency>
spring-boot应用将自动使用 logback 作为应用日志框架,要将 spring-boot-starter-logging 作为依赖加入到当前应用的 classpath。
2)使用 log4j 或者 log4j2
- <dependency>
- <groupId> org.springframework.boot </groupId>
- <artifactId> spring-boot-starter-log4j </artifactId>
- </dependency>
- or
- <dependency>
- <groupId> org.springframework.boot </groupId>
- <artifactId> spring-boot-starter-log4j2 </artifactId>
- </dependency>
使用 SpringMVC 开发 web 应用,为了帮我们简化快速搭建并开发一个 Web 项目,SpringBoot 为我们提供了 spring-boot-starter-web 自动配置模块。现加maven依赖:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
当前项目下运行 mvn spring-boot:run 就可以直接启动一个使用了嵌入式 tomcat 服务请求的 Web 应用,只不过,我们还没有提供任何服务 Web 请求的 Controller,所以,访问任何路径都会返回一个 SpringBoot 默认提供的错误页面,我们可以在当前项目下新建一个服务根路径 Web 请求的 Controller 实现:
- @RestController
- public class IndexController {
- @RequestMapping("/")
- public String index() {
- return "hello, word";
- }
- }
注意:静态文件和页面模板的存放位置变了,原来是放在 src/main/webapp 目录下的一系列资源,现在都统一放在 src/main/resources 相应子目录下。
注意:spring-boot-starter-web 默认将为我们自动配置如下一些 SpringMVC 必要组件:
SpringBoot 应用如果只依赖一个数据库,那么,使用 DataSource 自动配置模块提供的配置参数是最方便的:
- spring.datasource.url=jdbc:mysql://{database host}:3306/{databaseName}
- spring.datasource.username={database username}
- spring.datasource.password={database password}
SpringBoot 还会自动配置相应的 JdbcTemplate、DataSourceTransactionManager 等关联“设施”,我们可以直接使用。
若在一个应用中需要依赖和访问多个数据库:
- @Bean
- @Primary
- public DataSource dataSource1() throws Throwable {
- DruidDataSource dataSource = new DruidDataSource();
- dataSource.setUrl(...);
- dataSource.setUsername(...);
- dataSource.setPassword(...);
- // TODO other settings if necessary in the future.
- return dataSource;
- }
- @Bean
- public DataSource dataSource2() throws Throwable {
- DruidDataSource dataSource = new DruidDataSource();
- dataSource.setUrl(...);
- dataSource.setUsername(...);
- dataSource.setPassword(...);
- // TODO other settings if necessary in the future.
- return dataSource;
- }
- }
spring-boot-starter-aop 自动配置行为由两部分内容组成:
SpringAOP 其实提供了多种横切逻辑织入机制(Weaving),性能损耗上也是各有差别,从运行期间的动态代理和字节码增强 Weavng,到类加载期间的 Weaving,甚至高冷的 AspectJ 二次静态编译 Weaving。
应用安全属于安全防护体系中的重要一环,spring-boot-starter-security 主要面向 Web 应用安全,配合 spring-boot-starter-web,要使用SpringBoot构建一个安全的对外提供服务的 Web 应用
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency> <!--其他依赖 -->
- </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 默认提供的配置:
- @Configuration
- @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
- public class DemoSecurityConfiguration extends WebSecurity-ConfigurerAdapter {
- protected DemoSecurityConfiguration() {
- super(true); // 取消默认提供的安全相关Filters配置
- }
- @Override
- public void configure(WebSecurity web) throws Exception {
- // ...
- }
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- // ...
- }
- // 通过Override其他方法实现对web安全的定制
- }
这个时候,我们可以直接实现并注册一个标注了 @EnableWebSecurity 的 JavaConfig 配置类到 IoC 容器,
- @Configuration
- @EnableWebSecurity
- public class OverhaulSecurityConfiguration {
- @Bean
- public AuthenticationManager authenticationManager() {
- // ...
- }
- @Bean
- public AccessDecisionManager accessDecisionManager() {
- // ...
- }
- @Bean
- public SecurityFilterChain mySecurityFilterChain() {
- // ...
- }
- // 其他web安全相关组件和依赖配置}
- }
原文链接:https://blog.csdn.net/xlsj228/article/details/117322775
作者:举起你的手来
链接:http://www.javaheidong.com/blog/article/207312/552665b1ce45386ca0c2/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!