springboot原理篇(一)

目录

一.自动配置

1.1 bean的加载方式(八种)

1.1.1 XML方式声明bean

1.1.2 XML+注解方式声明bean 

​1.1.3 纯注解方式声明bean

1.1.4 FactoryBean接口

1.1.5 加载旧系统的XML配置文件

1.1.6 proxyBeanMethods

1.1.7 使用@Import注解导入要注入的bean对应的字节码

1.1.8 使用上下文对象在容器初始化完毕后注入bean

1.1.9  通过实现ImportSelector接口以创建bean

1.1.10 通过实现ImportBeanDefinitionRegistrar接口以创建bean

1.1.11 实现BeanDefinitionRegistryPostProcessor接口以创建bean


一.自动配置

1.1 bean的加载方式(八种)

1.1.1 XML方式声明bean

springboot原理篇(一)_第1张图片

1.1.2 XML+注解方式声明bean 

1.在配置文件中定义哪些包及其子包被扫描:

springboot原理篇(一)_第2张图片

2.在被扫描的包中使用注解将某些类定义为bean,这些类包括自定义类和第三方类

 使用@Component及其衍生注解@Controller 、@Service、@Repository定义bean

使用@Bean定义第三方bean,并将所在类定义为配置类或Bean

springboot原理篇(一)_第3张图片1.1.3 纯注解方式声明bean

只需将xml配置文件转为配置类即可

springboot原理篇(一)_第4张图片

1.1.4 FactoryBean接口

先看下面这个例子:

第一步:定义一个工厂类,让这个工厂类实现FactoryBean接口,并重写这个接口中的方法

springboot原理篇(一)_第5张图片

第二步:将这个工厂类定义为配置类中的第三方bean

springboot原理篇(一)_第6张图片

第三步:加载这个配置类,并查看类中方法返回的bean的类型

springboot原理篇(一)_第7张图片

结论:可以发现,这个工厂bean产生的bean的类型是其方法的返回值类型

springboot原理篇(一)_第8张图片

1.1.5 加载旧系统的XML配置文件

我们在旧系统上开发新功能的时候,新功能可能会采用注解的方式加载bean,而旧系统可能采用xml配置文件的方式加载bean,这个时候我们就要在配置类中使用@ImportResource注解加载旧系统的配置文件,以便把旧系统的bean跟新功能的bean都加到spring容器中。

springboot原理篇(一)_第9张图片

1.1.6 proxyBeanMethods

@Configuratiion注解中有一个proxyBeanMethods属性。使用proxyBeanMethods=true可以保障调用此方法得到的对象是从容器中获取的而不是重新创建的。

例如:

第一步:声明一个配置类,将proxyBeanMethods置为true,并在配置类中定义一个bean。

springboot原理篇(一)_第10张图片

第二步:加载配置类,并从容器中取出springConfig33这个bean执行其cat()方法

springboot原理篇(一)_第11张图片

 第三步:查看将proxyBeanMethods置为true的效果

springboot原理篇(一)_第12张图片

结论:可以发现将proxyBeanMethods置为true后,调用这个bean的方法产生的对象都是同一个。

1.1.7 使用@Import注解导入要注入的bean对应的字节码

步骤:

第一步:使用@Import注解导入要注入的bean对应的字节码

第二步:加载第一步中的配置文件,并取出SpringConfig4这个beanspringboot原理篇(一)_第13张图片

结论:发现这个bean已加入到spring容器中

springboot原理篇(一)_第14张图片

1.1.8 使用上下文对象在容器初始化完毕后注入bean

springboot原理篇(一)_第15张图片

1.1.9  通过实现ImportSelector接口以创建bean

导入实现了ImportSelector接口的类,实现对导入源的编程式处理

第一步:定义MyImportSelector类实现ImportSelector接口

springboot原理篇(一)_第16张图片

 第二步:创建SpringConfig6类,导入MyImportSelector.class

第三步:运行App6类,查看请其中是否有对应的bean

springboot原理篇(一)_第17张图片

结果:

springboot原理篇(一)_第18张图片

1.1.10 通过实现ImportBeanDefinitionRegistrar接口以创建bean

导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对 容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果。

第一个形参的作用跟上一种方法的形参相同,第二个形参的作用如下图所示

springboot原理篇(一)_第19张图片

1.1.11 实现BeanDefinitionRegistryPostProcessor接口以创建bean

导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean, 实现对容器中bean的最终裁定

此方法中的形参跟上一个方法中的第二个形参作用相同。如果一个项目中定义了多个同名bean,此方法定义的bean会覆盖其他的同名bean。

springboot原理篇(一)_第20张图片

总结:bean的加载方式也不止这八种,如果感兴趣,可以自己再去找来学习。

你可能感兴趣的:(springboot,spring,boot,java,spring)