Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
其实人们把Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。它提供了如下特性如果有需求则可以引入
a) 自动配置 Spring-boot-starter 开箱即用依赖模块。
b) 简化统一配置文件。 c) 监控管理actuator。 d) 内嵌了如Tomcat,Jetty,所有的依赖都打到一个jar包里面,可以直接 java -jar 运行。
SpringCloud, SpringBoot、SpringMVC和Spring区别?
Spring最重要的特征是依赖注入。所有 SpringModules不是依赖注入就是IOC控制反转。 当我们恰当的使用DI或者是IOC的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像 DispatcherServelet,MoudlAndView和ViewResolver等一些简单的概念,开发 Web 应用将会变的非常简单。
SpringBoot: Spring 和 SpringMVC 的问题在于需要配置大量的参数。
Spring MVC是Spring的一个模块,式一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
Spring框架需要进行大量的配置,Spring Boot引入自动配置的概念,让项目设置变得很容易。Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
Spring框架为开发Java应用程序提供了全面的基础架构支持。它包含一些很好的功能,如依赖注入和开箱即用的模块,如:Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test。这些模块缩短应用程序的开发时间,提高了应用开发的效率。
Spring Framework提供了多种功能,使Web应用程序的开发更加容易。这些功能包括依赖注入,数据绑定,面向方面的编程,数据访问等等。随着Spring社区的壮大,Spring慢慢变得越来越复杂,不再像开始宣称的那么轻量级。开发应用程序的配置量越来越大令开发者头疼。这时Spring Boot就派上用场了 - 它采用“约定大于配置”的思想简化了配置,对Spring提供的功能和配置而且将一些功能抽象成为“Starter”开箱即用、按需引用。极大地简化了开发。
Spring Boot是Spring的扩展,它消除了设置Spring应用程序所需的XML配置,为更快更高效的开发生态系统铺平了道路。以下是Spring Boot中的一些特点:
1.创建独立的spring应用。 2.嵌入Tomcat, Jetty Undertow 而且不需要部署他们。
3.提供的“starters” poms来简化Maven配置 4.尽可能自动配置spring应用。
5.提供生产指标,健壮检查和外部化配置 6.绝对没有代码生成和XML配置要求
与Spring不同,Spring Boot只需要一个依赖项来启动和运行Web应用程序,spring-boot-starter-web依赖。
Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
SpringBoot专注于快速方便的开发单个个体微服务。它是一个服务于spring框架的框架,它简化了配置文件,可以快速构建web应用,内置tomcat,无需打包部署,直接运行。核心原理:是基于SpringMVC无配置文件完全注解化+内置tomcat实现SpringBoot框架,使用Main函数启动。
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来, 为各个服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、精选决策、分布式会话等集成服务。 SpringBoot可以离开SpringCloud独立开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
SpringBoot不依赖于SpringCloud,SpringCloud依赖于SpringBoot,属于依赖关系。
(1). 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
(2). 开箱即用,远离繁琐的配置。
(3). 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
(4). 没有代码生成,也不需要XML配置。
(5). 避免大量的 Maven 导入和各种版本冲突。
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:
@SpringBootApplication(exclude{DataSourceAutoConfiguration.class})
@ComponentScan:Spring组件扫描。
Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:(1)面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。 (2)减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。 (3)类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。
在spring程序main方法中添加@SpringBootApplication或者@EnableAutoConfiguration会自动去maven读取每个starter中的spring.factories文件,该文件配置了所有需要被创建spring容器中的bean. 启动SpringBoot,只有一个注解@SpringBootApplication点击进去看到三个重要的注解。
a) @SpringBootConfiguration:我们点进去以后可以发现底层是Configuration注解,说白了就是支持JavaConfig的方式来进行配置(使用Configuration配置类等同于XML文件)
@EnableAutoConfiguration:开启自动配置功能
@ComponentScan就是扫描注解,默认是扫描当前类下的package。将@Controller / @Service/@Component/@Repository等注解加载到IOC容器中。
b) @EnableAutoConfiguration注解进去回看到
@AutoConfigurationPackage自动配置包 和 @Import给IOC容器导入组件。
这个@AutoConfigurationPackage注解解释成自动配置包,我们也看看@AutoConfigurationPackage里边。会不会觉得,这不就是ComponentScan的功能吗?这俩不就重复了吗?
比如说,你用了Spring Data JPA,可能会在实体类上写@Entity注解。这个@Entity注解由@AutoConfigurationPackage扫描并加载,而我们平时开发用的@Controller/ @Service/@Component/@Repository这些注解是由ComponentScan来扫描并加载的。
简单理解:这二者扫描的对象是不一样的。
c)回到@Import(AutoConfigurationImportSelector.class)代码上,再点进去AutoConfigurationImportSelector.class看看具体的实现? 得到了很多配置信息,这些配置信息是从哪里来的(进去getCandidateConfigurations方法)。追踪看到的是SpringFactoriesLoader来加载。
d) Spring启动的时候会扫描所有jar路径下的META-INF/spring.factories,将其文件包装成Properties对象从Properties对象获取到key值为EnableAutoConfiguration的数据,然后添加到容器里边。
在 Spring Boot 里面,可以使用以下几种方式来加载配置。1)properties文件;2)yaml文件;3)系统环境变量;4)命令行参数;等等。。。
什么是 YAML?YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。
YAML 配置的优势: YAML 现在可算是非常流行的一种配置文件格式了,那YAML 配置和传统的 properties 配置有哪些优势?1)配置有序,在一些特殊的场景下,配置有序很关键;2)支持数组,数组中的元素可以是基本数据类型也可以是对象;3)简洁;4)相比 properties 配置文件,YAML 有一个缺点,不支持@PropertySource 注解导入自定义的 YAML 配置。
读取配置的方式:
SpringBoot可通过@PropertySource- 不支持yml文件读取,
@Value,
@Environment,
@ConfigurationProperties(prefix = “ ”)
// 获取 Spring Boot 上下文
ConfigurableApplicationContext ctx =
SpringApplication.run(SpringbootPropertiesApplication.class, args);
// ctx.getEnvironment(); // 获取 边境变量
//获取字符串
System.out.println("String: " + (ctx.getEnvironment().getProperty("string.port") + 1111) );
//获取整数
System.out.println(ctx.getEnvironment().getProperty("db.link.url"));
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
一般单体的Spring Boot 工程,不太遇到 bootstrap.properties 配置文件,但在结合 Spring Cloud 时,这个配置就会经常遇到,特别是在需要加载一些远程配置文件的时侯。
Spring Boot 的核心配置文件是application和bootstrap配置文件。application配置文件这个容易理解,主要用于SpringBoot项目的自动化配置。bootstrap配置文件有以下几个应用场景。使用Spring Cloud Config 配置中心时,这时需要在bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;一些固定的不能被覆盖的属性;一些加密/解密的场景;
配置文件有.properties和.yml区别主要是书写格式不同。.yml 格式不支持@PropertySource注解导入配置。加载顺序上区别
bootstrap.yml(bootstrap.properties)先加载
application.yml(application.properties)后加载
bootstrap.yml 用于应用程序上下文的引导阶段,由父Spring ApplicationContext加载。父ApplicationContext 被加载到使用application.yml的之前, 在应用程序上下文的引导阶段生效。
在Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap是应用程序的父上下文,也就是说bootstrap加载优先于applicaton。
bootstrap主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
应用:bootstrap.yml 和application.yml 都可以用来配置参数。
bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
application 配置文件这个容易理解,application.yml 可以用来定义应用级别的,主要用于Spring Boot .
Spring Profiles 允许用户根据配置文件(dev,test,uat,prod等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。
为了在自定义端口上运行 Spring Boot 应用程序,您可以在application.properties 中指定端口。server.port = 8090
为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。
Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。Shiro 和 Spring Security 相比,主要有如下一些特点:1) Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架; 2) SpringSecurity 概念复杂,配置繁琐, Shiro 概念简单、配置简单; 3) Spring Security 功能强大, Shiro 功能简单;
什么是源和跨域: 源(origin)就是协议、域名和端口号。URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口全部相同,则表示他们同源。否则,只要协议、域名、端口有任何一个不同,就是跨域。
Spring Boot 2.X应用程序中可以使用注解@CrossOrigin,每个方法加上注解。
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。
访问 spring-boot-actuator 给我们展现的是纯 JSON 格式的数据,对于非开发人员来说不够直观和不够人性化。SpringBootAdmin就是用来解决这个问题的,使用 SpringBoot Admin 可以实现这些 JSON 接口数据的界面展现,方便运营人员监控检测应用环境。方便查看和管理。
Actuator的2.x 版本中,大多数端点默认被禁掉了,且默认端点增加了/actuator前缀。默认暴露的两个端点为 /actuator/health 和 /actuator/info,正是如上可以访问的两个URL.
如果想开启所有的断点可以被访问,需要在工程的properties文件中,增加如下配置:
management.endpoints.web.exposure.include=*
访问路径可以看出,默认访问 Actuator 所有的监控点路径都在/actuator/*,是否可以自定义呢?是的,可以自定义这个前缀,只需要在 properties 中配置如下内容即可:
management.endpoints.web.base-path=/monitor
WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道。1). WebSocket 是双向的 -使用 WebSocket 客户端或服务器可以发起消息发送。2)WebSocket 是全双工的 -客户端和服务器通信是相互独立的。3) 单个 TCP 连接 -初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有未来的通信. 4) Light -与 http 相比,WebSocket 消息数据交换要轻得多。
Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:SpringData 项目支持 NoSQL 存储: MongoDB (文档数据库), Neo4j(图形数据库), Redis(键/值存储), Hbase(列族数据库)
SpringData 项目所支持的关系数据存储技术: JDBC, JPA。
Spring Data Jpa 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!Spring Data JPA 通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。
SpringBoot Batch 提供可重用的函数,这些函数在处理大量记录时非常重要,包括日志/跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。它还提供了更先进的技术服务和功能,通过优化和分区技术,可以实现极高批量和高性能批处理作业。简单以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息。
FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。使用 Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理 html 页面设计。最后使用freemarker 可以将这些结合起来,给出最终的输出页面。
使用 DEV 工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat 将重新启动。Spring Boot 有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java 开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot 在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools 模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供 H2 数据库控制台以更好地测试应用程序。
org.springframework.boot
spring-boot-devtools
Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter。
编写自己的SpringBoot-Starter 参考: 编写自己的SpringBoot-Starter_Mynah886的博客-CSDN博客*** 开发自己的starter准备思考一 . starter的好处是,集成众多依赖,提供一个一站式的依赖项。 Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。 使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖, Spring Boot就能自动扫描并加载相应的模块。 2. 命名 ...https://blog.csdn.net/Mynah886/article/details/103792659
新创建一个 Spring Boot 项目,默认都有 parent 的,就是 spring-boot-starter-parent , 主要有如下作用:1)定义了 Java 编译版本为 1.8 。2)使用 UTF-8 格式编码。3)继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。4)执行打包操作的配置。5)自动化的资源过滤。6)自动化的插件配置。7)针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。
Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。
Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
1)打包用命令或者放到容器中运行. 2)用 Maven/Gradle 插件运行. 3直接执行 main 方法运行.
1)继承spring-boot-starter-parent项目. 2)导入spring-boot-dependencies项目依赖
Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。
在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。
在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。 1) 使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。 2) 使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可.
29. Spring Boot 如何禁用特定的自动配置?
需要禁用特定Spring Boot的自动配置,我们可以使用@EnableAutoConfiguration注解的exclude属性来指示它。如下禁用了
DataSourceAutoConfiguration:
如果我们使用@SpringBootApplication注解。 它具有@EnableAutoConfiguration作为元注解 - 我们同样可以配置exclude属性来禁用自动配置:
还可以使用spring.autoconfigure.exclude环境属性禁用自动配置。在application.properties配置文件设置如下也可以达到同样的目的:
30. Spring Boot配置过滤器的方式
1).@WebFilter注解方式, 使用@WebFilter注解为声明当前类为filter,第一个参数为该filter起一个名字,第二个参数为说明要拦截的请求地址,当前类需要实现Filter接口,里面有三个方法,分别为过滤器初始化、过滤方法和过滤器销毁。
@WebFilter(filterName = "myFilter1", urlPatterns = "/*")
public class MyFilter1 implements Filter {}
启动类添加@ServletComponentScan注解,@ServletComponentScan注解所扫描的包路径必须包含该Filter,代码如下:
@SpringBootApplication
@ServletComponentScan(basePackages = "com.example.demo.filter")
2). @Bean注解方式, 新建MyFilter2.java类,不要加注解@WebFilter,代码如下:
public class MyFilter2 implements Filter{}
新建配置类WebConfig.java,配置bean,代码如下:
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean(new MyFilter2());
registration.addUrlPatterns("/test"); //
registration.setName("myFilter2"); return registration; } }
31. 在springboot-starter-web中用jetty代替tomcat
在spring-boot-starter-web移除现有的依赖项,并把下面这些添加进去。
32. Spring Boot根据不同的条件来加载bean
你可在配置中使用@Conditional 系列注解。例如@ConditionalOnMissingBean。此注释的最显着属性是: value:要检查的bean类型; name:要检查的bean的名称
放置在使用@Bean装饰的方法上时,目标类型默认为方法的返回类型
表示的意思是如果不存在CusService类型的bean则初始化并注入该bean。
@Conditional(MyCondition.class)
这句代码可以标注在类上面,表示该类下面的所有@Bean都会启用配置,也可以标注在方法上面,只是对该方法启用配置
除了自己自定义Condition之外,Spring还提供了很多Condition给我们用
@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)
以上是一些常用的注解,其实就是条件判断,如果为true了就创建Bean,为false就不创建。
36. SpringBoot注解
1) 启动类@SpringBootApplication,是Spring Boot的核心注解,主要组合包含了以下3个注解:
@SpringBootConfiguration组合了@Configuration 注解,实现配置文件的功能。是用来读取spring.factories文件的。
@EnableAutoConfiguration:打开自动配置的功能,自动配机制,是自动导入,在代码中是import的作用。也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描,管理项目中的bean,管理项目中类的依赖关系。spring中 base-package 属性指定要扫描的基础包。我们可以在配置中使用匹配符和占位符。
2) @EnableFeignClients:微服务接出客户端,注解的作用是扫描标记了@FeignClient的接口并创建实例bean,默认扫描并创建所在工程下的包。
3) @MapperScan 此注解是扫描被此注解中声明的mapper路径下的*mapper.xml文件,读取文件配置。@Mapper和 @Repository的区别(都是用在dao上,功能差不多),@Repository需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中:如下,在启动类中配置扫描地址:
@SpringBootApplication //添加启动类注解
@MapperScan("com.anson.dao") //配置mapper扫描地址
@Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。 也就是@Repository多了一个配置扫描地址的步骤.
4) @Conditional这是 Spring 4.0 添加的新注解,用来标识一个 Spring Bean 或者 Configuration 配置文件,当满足指定的条件才开启配置。
@ConditionalOnBean组合@Conditional 注解,当容器中有指定的 Bean 才开启配置。 @ConditionalOnMissingBean的作用是:只有对应的bean在系统中都没有被创建,它修饰的初始化代码块才会执行,【用户自己手动创建的bean优先】
@Component和@Configuration的区别,Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。注意:@Configuration注解的配置类有如下要求:1.@Configuration不可以是final类型;2.@Configuration不可以是匿名类;3.嵌套的configuration必须是静态类。
示例: @Configuration
public class TestConfig {
@Bean
public Driver driver(){ Driver driver = new Driver();
driver.setId(1); driver.setName("driver");driver.setCar(car()); return driver; }
@Bean
public Car car(){ Car car = new Car(); car.setId(1); car.setName("car"); return car;}}
可以发现使用Configuration时在driver和spring容器之中的是同一个对象,而使用Component时是不同的对象。造成不同结果的原因在ConfigurationClassPostProcessor类之中,通过调用enhanceConfigurationClasses方法,为被注解@Configuration的类进行CGLIB代理。
虽然Component注解也会当做配置类,但是并不会为其生成CGLIB代理Class,所以在生成Driver对象时和生成Car对象时调用car()方法执行了两次new操作,所以是不同的对象。当时Configuration注解时,生成当前对象的子类Class,并对方法拦截,第二次调用car()方法时直接从BeanFactory之中获取对象,所以得到的是同一个对象.