SpringBoot 开发总结思考(二)

简介: 模块装配:假设要注入MongoDB,那么就加上@Configuration注解,有可能一个配置类没办法解决某个方向的问题,往往是很多@Configuration的类组合在一起SpringBoot是使用Enable注解,然后再通过@import导入Selector,通过Selector读取 .factories 文件,最终加载的Configuration

SpringBoot 开发总结思考(二)


1、SpringBoot 自动配置(装配)


.原理是什么?

https://blog.csdn.net/u014745069/article/details/83820511


.为什么要有?


2、SpringBoot 是如何把一些库加入到IOC中的?


@Component、@Configuration 适用于自定义业务,而SpringBoot考虑的是如何把第三方以及自己的库加入到IOC中


@SpringBootApplication 就是一个超级大的配置类,其中包含的注解会分解小的配置类模块


3、@EnableAutoConfiguration :SpringBoot中最核心的注解


主要作用就是为了加载N多的Bean,然后将其放入IOC中


部分的属性是写在配置文件中的,允许从配置文件中更改配置的Bean的属性等


必须要能把Bean加入到IOC中


@Import(AutoConfigurationImportSlector.class)
AutoConfigurationImportSlector 中有一个非常重要的方法:selectImports


.核心方法,用于加载第三方配置类


要加载的所有的配置都在spring.factories中记录,SpringBoot 会读取该文件所有的Bean,然后再将这些Bean加入到IOC中


spring.factories 中的配置类与SpringBoot的自动加载机制是如何关联起来的?


.核心就是  .factories 配置文件


4、第三方的Bean也加了 @Configuration,为什么还要通过  @EnabledAutoConfiguration +  .factories 的机制加入到IOC中?


如果只是加了 @Configuration ,相当于直接把源码加入到了IOC中


第三方SDK也直接将源码加入到IOC中吗?显然不可能


5、以Enabled 开头的注解,被称之为模块装配


模块装配:假设要注入MongoDB,那么就加上@Configuration注解,有可能一个配置类没办法解决某个方向的问题,往往是很多@Configuration的类组合在一起


SpringBoot是使用Enable注解,然后再通过@import导入Selector,通过Selector读取  .factories 文件,最终加载的Configuration


6、@EnableAutoConfiguration 最终还是要加载@Configuration


比起自定义@Configuration ,还多了一步@Import的Selector



修改前面的 HeroConfiguration 类,并将所有的@Component去掉


@Configuration
public class HeroConfiguration {
    //@Bean
    public ISkill diana(){
        return new Diana("Diana", 1);
    }
    @Bean
    public ISkill irelia(){
        return new Irelia();
    }
}


但现在的结构仍然可以自动将HeroConfiguration 加载到IOC中,因为启动类的@SpringBootApplication包含了ComponentScan,当前包下的标注了@Component/@Configuration的都会被加入到IOC中


自定义一个 启动类 LOLApplication,并将启动类的@SpringBootApplication注解去掉


@ComponentScan
public class LolApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(LolApplication.class)
                .run(args);
        ISkill iSkill = (ISkill) context.getBean("irelia");
        iSkill.r();
    }
}


使用另一种@Import方式


.最简单的一种方式就是,将配置类传入到Import中


@Import(HeroConfiguration.class)


此时会报错,unable to start web service,为什么加@ComponentScan就可以?


在默认情况下,上下文会启动Web服务器,如果不主动关闭Web服务器的模式,它就会自动启动


之所以加@ComponentScan可以,是因为该注解会扫描和web服务器相关配置的


但注释之后使用@Import只是导入了一个配置类,所以很多SpringBoot内置的配置都是没有导入到IOC中


增加WebApplicationType.NONE  把服务器关闭


@Import(HeroConfiguration.class)
public class LolApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(LolApplication.class)
                .web(WebApplicationType.NONE)
                .run(args);
        ISkill iSkill = (ISkill) context.getBean("irelia");
        iSkill.r();
    }
}


@Import 第二个用法


  • 传入的参数增加一个Selector

新增一个Selector:LolConfigurationSelector


public class LolConfigurationSelector implements ImportSelector {
    /**
     * 该接口要求返回一个数组,这个数组是一个字符串类型
     * @param annotationMetadata
     * @return
     */
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        /**
         * 其实还是在返回元类的名字,一次可以导入多个配置类
         */
        return new String[] {HeroConfiguration.class.getName()};
    }
}


更改启动类 LolApplication


@Import(LolConfigurationSelector.class)
public class LolApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(LolApplication.class)
                .web(WebApplicationType.NONE)
                .run(args);
        ISkill iSkill = (ISkill) context.getBean("irelia");
        iSkill.r();
    }
}


7、SpringBoot自动装配的spring.factories文件


新建一个Enable  注解类:EnableLolConfiguration(相当于一个模块装配)


元注解需要标注一些注解


@Retention(RetentionPolicy.RUNTIME) :用来修饰注解,是注解的注解

@Target(ElementType.TYPE) : 被描述的注解可以用在什么地方

@Documented : 表明这个注释是由 javadoc记录的


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(LolConfigurationSelector.class)
public @interface EnableLolConfiguration {
}


修改  LolApplication


@EnableLolConfiguration
public class LolApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(LolApplication.class)
                .web(WebApplicationType.NONE)
                .run(args);
        ISkill iSkill = (ISkill) context.getBean("irelia");
        iSkill.r();
    }
}


8、@EnableAutoConfiguration 为什么要从 .factories 文件读取?


一个模块具体要加载哪些配置类,是一个变化的过程。


既然是变化,那么就应该被隔离到配置文件中


但不是所有在  .factories  文件中的配置都会被导入,所以这些配置文件中的类被称为   候选配置类


满足一定条件之后,配置类才会被导入到IOC中


AutoConfigurationImportSelector中有一个很重要的方法就是:getCandidateConfigurations(获取所有的候选配置类名)


9、Java SPI 机制解析


SpringBoot自动装配机制其实是SPI机制/思想的应用


SPI 机制/思想:


. Service Provider Interface (服务发现机制)


SPI 就是应对变化,一个系统中往往会依赖很多模块,这些模块又是有各种各样不同实现方案的,有时候需要灵活的替换实现方案


首先有调用方,再有标准服务接口,服务接口下可能会有很多不同的实现(方案A、方案B),不同的方案遵循标准的服务接口,就可以被调用方调用;换句话说就是在Java中SPI,等同于基于接口编程。不基于Interface接口编程,无法提供标准服务接口,也无法将众多方案的具体隐藏在抽象之后


SpringBoot自动加载机制就是SPI机制/思想的衍生


对于一个方案来说,完全可以通过修改 .factories文件去切换不同的配置类,切换不同配置类的实质就是在切换众多的方案之一


10、再谈如何解决变化?


既然有了@Primary、条件注解之后,为什么还要有SPI机制/思想?


首先肯定的是,无论是SPI 还是@Primary、条件注解机制,都是为了解决变化而生


但是两者关注模块的细粒度是不一样的


.@Primary、条件注解  关注的是类/对象层面的变化,关注的具体/粒度非常小


.SPI 关注的点非常抽象,是整体解决方案的切换;有时候通过简单的类替换是没办法解决问题的

举个栗子


.装修的时候将1木质地板换成大理石地板(@Primary、条件注解)


.房子的整体装修风格发生了变化(SPI)


两者应对变化没有明显的界限


11、SpringBoot自动装配到底做了一件什么事情?


SpringBoot 较其他框架多出了一个IOC容器,SpringBoot自动装配真正解决了如何发现这些Bean并把这些配置的Bean要能够加入到IOC容器中,如果没有IOC,则需要手动在XML指定

目录
相关文章
|
4月前
|
IDE Java 开发工具
Spring Boot:加速Java后端开发的现代化利器
在当今快速迭代的软件开发环境中,Spring Boot 已成为Java后端开发领域的首选框架。作为Spring家族的一员,它以“约定优于配置”的设计理念,极大地简化了传统Spring应用的配置和部署过程,让开发者能够更加专注于业务逻辑的实现。本文将探讨Spring Boot的核心优势,并通过一个简单的示例展示如何快速启动一个基于Spring Boot的Java Web应用。
99 1
|
11天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的医院门诊预约挂号系统
基于Java+Springboot+Vue开发的医院门诊预约挂号系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的门诊预约挂号管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
31 2
基于Java+Springboot+Vue开发的医院门诊预约挂号系统
|
16天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
消息中间件 缓存 监控
81 0
|
29天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
58 2
|
1月前
|
NoSQL 前端开发 Java
使用 Spring Boot + Neo4j 实现知识图谱功能开发
在数据驱动的时代,知识图谱作为一种强大的信息组织方式,正逐渐在各个领域展现出其独特的价值。本文将围绕使用Spring Boot结合Neo4j图数据库来实现知识图谱功能开发的技术细节进行分享,帮助读者理解并掌握这一技术栈在实际项目中的应用。
102 4
|
1月前
|
IDE Java 开发工具
还在为繁琐的配置头疼吗?一文教你如何用 Spring Boot 快速启动,让开发效率飙升,从此告别加班——打造你的首个轻量级应用!
【9月更文挑战第2天】Spring Boot 是一款基于 Spring 框架的简化开发工具包,采用“约定优于配置”的原则,帮助开发者快速创建独立的生产级应用程序。本文将指导您完成首个 Spring Boot 项目的搭建过程,包括环境配置、项目初始化、添加依赖、编写控制器及运行应用。首先需确保 JDK 版本不低于 8,并安装支持 Spring Boot 的现代 IDE,如 IntelliJ IDEA 或 Eclipse。
87 5
|
2月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
62 0
|
2月前
|
前端开发 Java 开发者
Spring Boot DevTools 热部署神器,助你在开发浪潮中乘风破浪,一骑绝尘!
【8月更文挑战第29天】在快速迭代的软件开发领域,高效开发至关重要。Spring Boot DevTools 作为一款优秀的热部署工具,可自动重新加载代码修改,无需手动重启应用,大幅节省时间,即时预览修改效果,简化开发流程。通过简单示例,展示了其自动刷新静态资源和模板文件的功能,有效提升了开发效率,使开发者更专注于功能实现。它就像是开发者的得力助手,显著减少等待时间,带来更高效、流畅的开发体验。
31 0
|
3月前
|
存储 SQL 测试技术
基于SpringBoot+Vue交通管理在线服务系统的开发(源码+部署说明+演示视频+源码介绍+lw)(2)
基于SpringBoot+Vue交通管理在线服务系统的开发(源码+部署说明+演示视频+源码介绍+lw)
108 2
下一篇
无影云桌面