SpringBoot-探索回顾Spring框架本质

自始至终,SpringBoot框架都是为了能够帮助使用Spring框架的开发 快速高效地构建 一个个基于Spring框架以及Spring生态体系的应用解决方案。要深刻理解SpringBoot框架,首先我们需要深刻理解Spring框架。

一、Spring 中的 IoC、DI 和 DL

部分Java开发者对 IoC 和 DI 的概念有些混淆,认为二者是对等的,实际IoC(Inversion Of Control——控制反转)有两种方式:

  • 一种就是DI(Dependency Injection——依赖注入)是当前软件实体被动接受其依赖的其他组件被IoC容器注入;
  • 而另一种是DL(Dependency Lookup——依赖査找)是当前软件实体主动去某个服务注册地査找其依赖的那些服务。

概念之间的关系如图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRnrEDuD-1614673450451)(…/…/Study notes/SpringBoot/notes/image/图2-1 IOC相关概念示意图.png)]

以一下Spring IoC容器的一个典型代码片段为例

public class App (public static void main(String[] args) (Applicationcontext context = new FileSystemXmlApplication-Context("...");// ...MockService service = context.getBean(MockService.class); service.doSomething())
)

任何一个使用Spring框架构建的独立的Java应用,通常都会存在一行类似于context.getBean(..);的代码,实际上,这行代码做的就是DL的工作,而构建的任何一种IoC容器背后(比如 BeanFactory或者ApplicationContext)发生的事情,则更多是DI的过程(也可能有部分DL的逻辑用于对接遗留系统)。

此外,Spring IoC容器的依赖注入工作可以分为两个阶段:

阶段一:收集和注册

第一个阶段可以认为是构建和收集bean定义的阶段,在这个阶段中,我 们可以通过XML或者Java代码的方式定义一些bean,然后通过手动组装或者让容器基于某些机制自动扫描的形式,将这些bean定义收集到IoC容器中。

阶段二:分析和组装

第二阶段要干的事情就是分析这些已经在IoC容器之中的bean, 然后根据它们之间的依赖关系先后组装它们。如果IoC容器发现某个bean依赖另一个bean,它就会将这另一个bean注入给依赖它的那个bean,直到所有 bean的依赖都注入完成,所有bean都“整装待发”,整个IoC容器的工作即算完成。

二、JavaConfig 与 @Configuration

Java 5的推出,加上当年基于纯Java Annotation的依赖注入框架Guice的 出现,使得Spring框架及其社区也“顺应民意”,推出并持续完善了基于Java 代码和Annotation元信息的依赖关系绑定描述方式,即JavaConfig项目

基于JavaConfig方式的依赖关系绑定描述基本上映射了最早的基于XML的配置方式,比如

  1. 表达形式层面

    基于XML的配置方式是这样的:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi= nhttp://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans 			 http://www.springframework.org/schema/beans/spring-beans.
    xsd http://www.springframework.org/schema/context http://www. springframework.org/schema/context/spring-context.xsd">                                                 <!-- bean 定义-->
    </beans>
    

    基于JavaConfig的配置方式是这样的:

    ©Configuration
    public class MockConfiguration{// bean定义
    }
    

    任何一个标注了 ©Configuration的Java类定义都是一个JavaConfig配 置类。

  2. 注册bean定义层面

    基于XML的配置形式是这样的:

    <bean id= "mockService" class="..MockServicelmpl">...
    </bean>
    

    而基于JavaConfig的配置形式是这样的:

    ©Configuration
    public class MockConfiguration {@Beanpublic MockService mockService() {return new MockServiceJmpl()}
    }
    

    任何一个标注了 @Bean的方法,其返回值将作为一个bean定义注册到 Spring的IoC容器,方法名将默认成为该bean定义的id。

  3. 表达依赖注入关系层面

    为了表达bean与bean之间的依赖关系,在XML形式中一般是这样的:

    <bean id= "mockService" class="..MockServicelmpl"><property name="dependencyService" ref="dependencyservice"/>
    </bean>
    <bean id="dependencyservice" class="DependencyServicelmpl"/>
    

    而在JavaConhg中则是这样的:

    @Configuration
    public class MockConfiguration {@Beanpublic MockService mockService() {return new MockServiceImpl(dependencyservice())}@Beanpublic Dependencyservice dependencyservice() {return new DependencyServicelmpl()}
    }
    

    如果一个bean的定义依赖其他bean,则直接调用对应JavaConfig类中依赖bean的创建方法就可以了。

三、其他高曝光率的Annotation

©Configuration在前面已经提及过了,这里不再赘述,下面看几个其他比较常见的Annotation,便于为后面更好地理解SpringBoot框架

1、@ComponentScan

@ComponentScan: 对应 XML 配置形式中的 context:component-scan 元 素

注解作用:@ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Bean、@Controller、@Service、@Component、@Repository等等。

2、@lmport 与 @lmportResource

在XML形式的配置中,我们通过<import resource=,'XXX.xml"/>的形式 将多个分开的容器配置合到一个配置中,在JavaConfig形式的配置中,我们则 使用@Import这个Annotation完成同样目的:

@Configuration
©Import (MockConfiguration.class)
public class XConfiguration {...
}

@Import只负责引入JavaConfig形式定义的loC容器配置,如果有一些遗 留的配置或者遗留系统需要以XML形式来配置(比如dubbo框架),我们依然 可以通过@ImportResource将它们一起合并到当前JavaConfig配置的容器中:

@Configuration
@ImportResource("...")
public class XConfiguration {...
}

参考:

  • 《SpringBoot揭秘+快速构建微服务体系》 第二章
  • 浅析Spring IOC、依赖注入(DI)和依赖查找(DL)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis精解

概念Redis是完全开源免费的,遵守BSD协议,是-一个高性能的key-value数据库。它支持存储的value类型很多,包括string(字符串)、list(链表)、set(集合)、(Zset(有序集合),这些数据类型都支持。 push/pop、add/remove及 取交集和并集及更丰富的操作,Redis支持各种不同方式的排序)…

@SpringBootApplication揭秘

一、SpringBoot初体验 一个典型的SpringBoot应用长什么样子呢&#xff1f;如果我们使用http://start.spring.io/创建一个最简单的依赖Web模块的SpringBoot应用&#xff0c;一般情况下&#xff0c; 我们会得到一个SpringBoot应用的启动类&#xff0c;如下面代码所示&#xff1a…

SpringApplication:SpringBoot程序启动的一站式解决方案

我们说SpringBoot是Spring框架对“约定优先于配置(Convention Over Configuration)"理念的最佳实践的产物&#xff0c;一个典型的SpringBoot应用本质上其 实就是一个基于Spring框架的应用 如果非说SpringBoot微框架提供了点儿自己特有的东西&#xff0c;在核心类层面&…

了解spring-boot-starter

SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter自动配置 依赖模块&#xff0c;如此多“开箱即用”的依赖模块&#xff0c;使得开发各种场景的Spring应用 更加快速和高效&#xff0c;本文会就几个常见的通用spring-boot-starter模块进行了解 一、约定优先于…

常用脚本

mysql状态收集 #! /bin/bash#mysql for zabbixUptime() {mysqladmin status I awk [print $2]}Slow_ queries() {mysqladmin status | awk [print $9]} ICom_ insert() {mysqladmin extended-status |awk /<Com_ insertl>/[print $4]}Com_ delete() {mysqladmi…

linux产生随机数方法

如果产生的数据长短格式不统一&#xff0c;使用md5sum命令&#xff0c;并使用cut截取相应位数echo $RANDOM openssl rand -base64 openssl rand -base64 10 date %s%N /dev/random设备&#xff0c;存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候&#x…

oracle视图等

视图 视图是基于其他表或视图创建的逻辑表 视图不包含自己的数据&#xff0c;它基于的表称为基表 使用视图是为了: 限制对数据的访问 使复杂的查询简单化 提供数据的独立性 相同的数据展现不同的视图 不能删除行不能修改行不能添加行 --分组函数 - -GRoUP BY子句 -…

Java集合:关于 ArrayList 的内容盘点

本篇内容包括&#xff1a;ArrayList 概述、ArrayList 的扩容机制&#xff08;包含源码部分&#xff09;、如何在遍历 ArrayList 时正确的移除一个元素、ArrayList 的构造方法及常用方法、关于 Array 与 ArrayList 的区别、关于 CopyOnWriteArrayList、关于 Fail Fast 与 Fail S…

Java集合:关于 LinkedList 的内容盘点

本篇内容包括&#xff1a;LinkedList 的概述、LinkedList 的结构既双向链表实现与LinkedList-Node 结构、LinkedList 的使用&#xff08;构造方法&常用方法&#xff09;、关于 Queue 队列的介绍、关于 ArrayList 和 LinkedList 的区别以及算法&#xff1a;翻转链表&#xf…

shell自动化巡检

#!/bin/bash #主机信息每日巡检IPADDR$(ifconfig eth0|grep inet addr|awk -F [ :] {print $13}) #环境变量PATH没设好&#xff0c;在cron里执行时有很多命令会找不到 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin source /etc/profile…

Java集合:关于 Vector 的内容盘点

Vector 与 ArrayList 一样&#xff0c;也是通过数组实现的&#xff0c;不同的是它支持线程的同步&#xff0c;即某一时刻只有一个线程能够写 Vector&#xff0c;避免多线程同时写而引起的不一致性&#xff0c;但实现同步需要很高的花费&#xff0c;因此&#xff0c;访问它比访问…

memcached 的基本命令

memcached 的基本命令(安装、卸载、启动、配置相关)&#xff1a; -p 监听的端口 -l 连接的 IP 地址, 默认是本机 -d start 启动 memcached 服务 -d restart 重起 memcached 服务 -d stop|shutdown 关闭正在运行的 memcached 服务 -d install 安装 memcached 服务 -d uninstall …

Java集合:关于 HashSet 的内容盘点

哈希表存放的是哈希值&#xff0c; HashSet 存储元素的顺序并不是按照存入时的顺序&#xff08;和 List 显然不同&#xff09; 而是按照哈希值来存的所以取数据也是按照哈希值取得。 &#xff5e; 本篇内容包括&#xff1a;HashSet 概述、HashSet 与 HashMap 的关系以及HashSet…

mysql备份脚本

#!/bin/bash #保留备份个数&#xff0c;会删除时间较早的.dump备份 number3 #设置备份保存路径&#xff0c;yourpath替换成自己的备份保存路径 backup_diryourpath #日期格式 dddate %Y%m%d #备份工具 toolmysqldump #数据库用户名 usernameroot #数据库密码&#xff0c;由于密…

Java集合:关于 TreeSet 的内容盘点

TreeSet() 是使用二叉树的原理对新 add() 的对象按照指定的顺序排序&#xff08;升序、降序&#xff09;&#xff0c;每增加一个对象都会进行排序&#xff0c;将对象插入的二叉树指定的位置&#xff1b; ~ 本篇内容包括&#xff1a;TreeSet 概述、TreeSet 的使用以及其他知识点…

python求素数

口求100内的素数 -个数能被从2开始到自己的平发根的正整数整数整除,就是合数 import math n100 for X in range(2, n): for i in range(2, math.ceil(math.sqrt(x))): if x %i 0: break else: print(x)口求100内的素数 合数一定可以分解为几个质数的乘积 import math n100 pri…

svn钩子脚本

REP0S"$1" REV"$2"export LANGen_US.UTF-8 LOGPATH"/app/log" [ !-d ${LOGPATH}] && mkdir $[LOGPATH) -p #update content from svn↓14 SVN/usr/bin/svn↓ SVN update --username test --password test /data/ if[ $? -eq ] then /us…

shell判断字符串是否为数字

#1.组合语法判断1: [ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g"] &&\echo”两个参数都必须为数字”&& exit 1#2.组合语法判断2:[ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g&…

MySQL:DQL 数据查询语句盘点

本篇内容包括&#xff1a;DQL 的简介、SELECT 语句、WHERE 条件语句、JOIN 连接查询(多表查询)和分组、过滤、排序、分页、子查询的使用。 一、DQL 简介 DQL&#xff08;Data QueryLanguage&#xff09;语句&#xff0c;即数据查询语句 常用的语句关键字有&#xff1a;SELECT…

MySQL:DML 数据操作语句盘点

本篇内容包括&#xff1a;DML 的简介、INSERT 命令、UPDATE 命令、DELETE 命令以及 TRUNCATE 命令的使用。 一、DML 简介 DML&#xff08;Data Manipulation Language&#xff09;语句&#xff0c;即数据操作语句&#xff0c;用于操作数据库对象中所包含的数据。 常用关键字包…