Springboot(一)springboot 的实现

一、SpringBoot是什么

spring boot只是一个配置工具,整合工具,辅助工具.

Spring Framework

Java EE 框架

Spring Boot

快速构建spring的应用

Spring Cloud

构建spring boot分布式的环境

Springboot 2.0 是基于 Java8

底层框架是:springframework5.0.X 而 springframework 5.0必须基于Java8或以上

 

1、Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。采用 Spring Boot 可以大大的简化开发模式,所有你想集成的常用框架,它都有对应的组件支持。

2、Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用,大部分的 Spring Boot 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

3、Spring Boot 特性

  1. 使用 Spring 项目引导页面可以在几秒构建一个项目
  2. 方便对外输出各种形式的服务,如 REST API、WebSocket、Web、Streaming、Tasks
  3. 非常简洁的安全策略集成
  4. 支持关系数据库和非关系数据库
  5. 支持运行期内嵌容器,如 Tomcat、Jetty
  6. 强大的开发包,支持热启动
  7. 自动管理依赖
  8. 支持各种 IED,如 IntelliJ IDEA 、NetBeans

基于Spring Boot 的这些特性、我们可以快速构建独立的微服务。是Java 领域最优秀的微服务架构落地技术。
 


Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop. ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。

Spring MVC是基于Servlet 的一个 MVC 框架主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。

说得更简便一些:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。

 

Spring MVC的功能

Spring MVC提供了一种轻度耦合的方式来开发web应用。

Spring MVC是Spring的一个模块,式一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。

 

Spring Boot的功能

Spring Boot实现了自动配置,降低了项目搭建的复杂度。

众所周知Spring框架需要进行大量的配置,Spring Boot引入自动配置的概念,让项目设置变得很容易。Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。

对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。

所以,用最简练的语言概括就是:

Spring 是一个“引擎”;

Spring MVC 是基于Spring的一个 MVC 框架;

Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

以上内容来自:https://blog.csdn.net/u014590757/article/details/79602309 
 

 

二、Spring boot消失的xml配置(@Configuration

 

Springboot 中建议放弃通过 XML 定义 Spring 应用程序推荐在代码类上面通过 @Configuration 实现配置

如有需要还可以通过 @ImportResource 来导入 xml 配置文件

 

我们定义好自己的 @Configuration 如何引用呢?

启动类中,可以通过 @Import 注解来引入我们自定义的 配置类 @Configuration

@Import :引入 @Configuration【Class<?>[] value();】

@ImportResource :引入 xml文件【String[] value() default {};】

@SpringBootApplication
@Import({
        RedisConfig.class,
        MysqlConfig.class
})
@ImportResource(value = {"classpath:beans3.xml"})
public class Application {

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

}

RedisConfig

@Configuration
@ComponentScan({"net.core.cache.redis"})
public class RedisConfig {
    public RedisConfig() {
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new FastJson2JsonRedisSerializer(Object.class));
        return template;
    }
}

MysqlConfig 

@Configuration
@ImportResource(value = {
        "classpath:beans1.xml",
        "classpath:beans2.xml"
})
@EnableConfigurationProperties({MysqlProperties.class})
public class MysqlConfig {
    public MysqlConfig() {
    }

    @Bean
    DataSource dataSource(MysqlProperties mysqlProperties) {
        DruidDataSource dataSource = new DruidDataSource();
        ......
        return dataSource;
    }
}

 

 

三、Springboot的starter(重要)

starter是一个集成接合器,其包含许多依赖项,这些依赖项是使用项目快速启动和运行所需的依赖项。

例如:通过配置spring-boot-starter-data-redis,可以快捷的使用spring对Redis进行数据访问,

因为这个依赖包里面已经包含了Redis官方常用的多个依赖包,而 spring-boot-starter-data-redis 所做的就是将多个依赖包打包为一个总的依赖包(减少依赖包的引用个数),并且提供了一些简洁的操作接口和封装了一些实用工具类,使我们能快速方便的使用 redis.

主要帮我们干了两件事

  1. starter 引入相关的jar
  2. starter 自动完成的bean配置

 

四、SpringBoot自动装配原理(重点)

1、spring-boot-autoconfigure 依赖

如果要实现自动配置,需要 spring-boot-autoconfigure 这个依赖

在我们引用的 spring-boot-starter 依赖中可以找到,autoconfigure 里面包含了很多常用的配置

 

2、@SpringBootApplication 注解分析

(1)我们常用的 @SpringBootApplication 注解点开可以看到就是在 spring-boot-autoconfigure 包下

 

(2)进入 @EnableAutoConfiguration 注解

@EnableAutoConfiguration 简单概括一下就是,借助 @Import 的支持,收集和注册特定场景相关的bean定义

  • @EnableScheduling 是通过 @Import 将Spring调度框架相关的bean定义都加载到IoC容器。
  • @EnableMBeanExport 是通过 @Import 将JMX相关的bean定义加载到IoC容器。

而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!

其中,最关键的要属 @Import(AutoConfigurationImportSelector.class),借助 AutoConfigurationImportSelector@EnableAutoConfiguration 可以帮助SpringBoot应用将所有符合条件的 @Configuration 配置都加载到当前SpringBoot创建并使用的IoC容器。

 

(3)SpringFactoriesLoader详解:自动配置幕后英雄

SpringFactoriesLoader 属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置

 

配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类

上图就是从SpringBoot的autoconfigure依赖包中的META-INF/spring.factories配置文件中摘录的一段内容,可以很好地说明问题。

        所以,@EnableAutoConfiguration自动配置的魔法骑士就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

 

 

3、自动配置案例

下面我们以 DataSource 为例,来看是如何进行自动配置的

(1)我们找 DataSource 肯定是在 jdbc 里面,看到 DataSourceAutoConfiguration 是一个配置类,里面已经为我们预先配置了很多信息

 

(2)要找DataSource肯定要先找池,这个池里什么都没有写,但是通过 @Import 引入了5个DataSource

 

(3)我们可以先看一下Tomcat的DataSource是什么,进入后看到这个类上有一些注解,类里面的方法是bean信息

ConditionalXXX 注解:用来判断加载这个bean信息的条件(当所有and条件全部成立后 IOC 容器中才会有这个 bean)

例如:

//项目中必须存在org.apache.tomcat.jdbc.pool.DataSource.class这个类(有引入Tomcat的DataSource jar包)
@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
//在当前容器IOC中不存在DataSource(DataSource这个bean为null)
@ConditionalOnMissingBean(DataSource.class)
//在资源文件中(Property、yml)有包含以下信息
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true) 

下图是注解的介绍 :

个性化加载配置

 

(4)如果我们没有引入外部任何DataSource jar依赖,那么就会使用 Generic 返回一个默认的 DataSource

我们可以看到这里的 conditional 条件比先前少了一些

 

 

4、bean配置需要的参数是如何规定和获取的

例如:配置dataSource需要数据库连接参数,mybatis也有自己的配置参数

找到 mybatis-spring-boot-starter 这个综合依赖包,进入看到有 mybatis-spring-boot-autoconfigure 依赖

 

(1)依赖包里 MybatisAutoConfiguration 是配置类,上面有很多配置注解

@EnableConfigurationProperties({MybatisProperties.class})可以看出指向了 MybatisProperties

 

(2)MybatisProperties 类中,注解表示在 properties、yml 资源文件中找以 mybatis 为前缀的信息,这样就能找到我们资源文件中对应的配置信息

Configuration 为我们嵌套了mybatis默认的配置信息,我们如果有某个新配置信息,则会覆盖特定默认的

 

五、Springboot 启动加载bean流程(重要)

问:spring 启动时将所有带 @Configuration 注解的配置类扫描,然后将bean装入容器中?

答:是的,但是springboot只扫描 启动类 路径同级和子级的@Configuration

自动装配bean大概流程(重要): 

  1. Spring boot 启动时(run方法)会先运行,SpringFactoriesLoader.class
  2. SpringFactoriesLoader 中会加载扫描所有依赖 jar 中的 META-INF/spring.factories 文件
  3. spring.factories文件会指向 XXXAutoConfiguration
  4. 根据 XXXAutoConfiguration 信息 ,合理的将bean加载进spring容器

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值