SpringBoot的幕后推手,五年Java开发者小米、阿里面经

    ApplicationContext context = new FileSystemXmlApplicationContext("config-file-path")

    DemoService service = context.getBean(DemoService.class);

    service.doSomething();

}

}




我相信每一个使用Spring框架构建的独立的Java应用,通常都会存在类似`context.getBean(...)`的代码,其实这行代码做的事情就是DL,而且构建每一种IoC容器背后发生的事情,更多的是DI的过程,当前也可能会有部分DL的逻辑用来对接旧的遗留系统。



Spring的IoC容器的依赖注入工作分为两步走:



阶段一、收集和注册Bean



这个阶段中,开发者通过XML或者Java代码的方式来定义bean,然后以手动组装或让容器基于特定的机制自动扫描的形式,将这些定义好的bean收集到IoC容器中。



假如我们以XML配置的方式来收集和注册如下一个单一bean,一般来说形式如下:



...



随着我们项目中bean越来越多,这样逐个手动配置比较麻烦,我们还可以使用如下方式配置来批量扫描并采集和注册一批bean:



<context:component-scan base-package=“x.x”/>




阶段二、分析和组装



  第一个阶段完成以后,我们可以先暂时认为IoC容器中保存着一个个相互独立的bean,它们之间还没有任何关系,但是实际项目中它们之间是有着不可或缺的关系的,所以呢,Ioc容器第二个阶段需要做的工作就是分析这些已经在IoC容器中bean,根据它们的依赖关系先后按顺序组装它们,工作原来是这样的:IoC发现一个bean依赖另外一个bean,那么它会将另一个bean注入给依赖它的那个bean,一直到所有的bean的依赖都完成注入。这个时候容器中所有的bean都已经准备好待使用,也就标志着整个IoC容器的工作完成。



  那么IoC容器分析和组装的依据是啥呢?Spring框架其实最早的时候只能通过XML配置文件来描述bean和bean之间的关系,但是随着Java生态研发技术以及理念的转变,又出现了基于Java代码和Annotation元信息的描述方式(比如@AutoWired和@Inject)。但是呢,无论使用哪一种配置方式,目的都是为了简化绑定逻辑描述的各种表象,最终也都是为本阶段的最终目的来服务。



### 四、JavaConfig是个什么鬼?



​  Java 5的出世,加上当时基于纯Java Annatation的依赖注入框架Guice的出现,就使得Spring框架和社区不得不顺应民意,出版并持续完善了基于Java代码和Annotation元信息的依赖关系绑定描述方式,就是JavaConfig项目。



基于JavaConfig方式的依赖关系描述基本映射了早期基于XML方式的配置,比如:



**1\. 表达形式**



XML配置方式如下:



<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

   xmlns="http://www.springframework.org/schema/beans"         

   xmlns:context="http://www.springframework.org/schema/context"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 

     http://www.springframework.org/schema/context 

     http://www.springframework.org/schema/context/spring-context.xsd">

// bean定义



JavaConfig的配置方式如下:



@Configuration

public class DemoConfiguration {

// bean定义

}




> 也就是说任何一个被标注了`@Configuration`注解的Java类都是一个JavaConfig配置类。



**2\. 注册bean定义**



XML配置方式:



...



JavaConfig配置方式:



@Configuration

public class DemoConfiguration {

@Bean

public DemoService demoService() {

    return new DemoServiceImpl();

}

}




> 也就是说任何一个标注了`@Bean`注解的方法,它的返回值就将作为一个bean定义注册到Spring的IoC容器,方法名将默认成为该bean在容器中的id.



**3\. 表达依赖注入关系**



XML配置形式:



<property name="dependencyService" ref="aService"/>



JavaConfig形式:



@Configuration

public class DemoConfiguration {

@Bean

public AService aService() {

    return new AServiceImpl();

}

@Bean

public BService bService() {

    return new BServiceImpl(aService());

}

}




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



从以上种种表象我们可以看出,以前Spring IoC容器中具有的特性在JavaConfig中都可以进行表述,只是换了另外的一种形式而已。并且通过声明相应的Java Annotation反而“内聚”一起了,变得更加简洁了。



### 五、那些常用的Annotation



1. **`@ComponentScan`**



​  该注解对应的是XML配置中的`<context:component-scan>`元素,用于配合一些元信息Java Annotation,比如`@Component`和`@Repository`等,将标注了这些注解的bean定义类批量采集到Spring的IoC容器中。


# 《MySql面试专题》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/323d061e349a5dda0977caa8107cf4b5.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/efe888023326af51541dc45b08058c5e.png)

# 《MySql性能优化的21个最佳实践》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/abacd1a6ffaf7f9871117f9d65b53f25.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/b69652b6f8f437369d407cda91b8557e.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/d32344e66a6bd20b21058be6c1e2c7ee.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/ce1d500b713a237936531e218ce1c2af.png)

# 《MySQL高级知识笔记》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/b069a90ee1f07e73bf7a91620327b592.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/9ec9681469064837738581c2152089e9.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/b79ed1933e439c25eff4f9e6152f57db.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/510410b369f47c8345cf4fc1fc78c9bd.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/0f493c0e5330af145b1bb39c1c054a7f.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/38638dc947e657cb35da795e75f80ecb.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/32287c9257ead838641f594ef01c6dd2.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/65d2e99de5dd3ef2fb3eb7156e19cdcc.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/dd0ab11778edb4c7d3dc28aa823aae58.png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/dc4310f3d8065b580176c867580d8396.png)

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/6f9806273794229d9aeef497a9efc7ea.png)

## 获取方式:[点击这里前往传送门](https://gitee.com/vip204888/java-p7)

628685885424)]

[外链图片转存中...(img-WcyhOh0r-1628685885425)]

[外链图片转存中...(img-KgJT9bsH-1628685885426)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中...(img-yiQIevr1-1628685885426)]

## 获取方式:[点击这里前往传送门](https://gitee.com/vip204888/java-p7)

**关注我,点赞本文给更多有需要的人**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值