SpringBoot
【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】
SpringBoot 原理篇
文章目录
- SpringBoot
- SpringBoot 原理篇
- 1 自动配置
- 1.9 bean 的加载方式【七】
- 1.9.1 ImportBeanDefinitionRegistrar
1 自动配置
1.9 bean 的加载方式【七】
1.9.1 ImportBeanDefinitionRegistrar
之前我们又讲了第六种 ImportSelector ,通过实现这个接口去查某一个东西的“户口”
现在来说说第七种,这种方式又要复杂一些,高端一些
【直接开干】
来一个新的类
package com.dingjiaxiong.bean;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
/**
* ClassName: MyRegistrar
* date: 2022/10/24 16:24
*
* @author DingJiaxiong
*/
public class MyRegistrar implements ImportBeanDefinitionRegistrar {
//第一个参数就是我们之前看的元数据,而且他还有一个参数,也就是这种方式比第六种更强大
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
}
}
以前我们第六种的时候
返回
是用的全路径类名
第七种方式就不用了,靠的就是registry 这个对象来帮我们初始化bean
package com.dingjiaxiong.bean;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
/**
* ClassName: MyRegistrar
* date: 2022/10/24 16:24
*
* @author DingJiaxiong
*/
public class MyRegistrar implements ImportBeanDefinitionRegistrar {
//第一个参数就是我们之前看的元数据,而且他还有一个参数,也就是这种方式比第六种更强大
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//1. 使用元数据进行判定【这里就不判了】
//初始化BeanDefinition对象
BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Dog.class).getBeanDefinition();
registry.registerBeanDefinition("yellow",beanDefinition);
}
}
OK,再来一个配置类
package com.dingjiaxiong.config;
import com.dingjiaxiong.bean.MyImportSelector;
import com.dingjiaxiong.bean.MyRegistrar;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* ClassName: SpringConfig7
* date: 2022/10/24 14:52
*
* @author DingJiaxiong
*/
@Import(MyRegistrar.class)
public class SpringConfig7 {
}
OK。来一个运行类
package com.dingjiaxiong.app;
import com.dingjiaxiong.config.SpringConfig6;
import com.dingjiaxiong.config.SpringConfig7;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* ClassName: App7
* date: 2022/10/24 13:42
*
* @author DingJiaxiong
*/
public class App7 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig7.class);
String[] names = ctx.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
System.out.println("=========================");
}
}
直接运行
我超,出来了【这就又实现了对bean 的管理,更高端牛逼了】
OK,回顾一下
导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对
容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果