【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】
之前我们又讲了第六种 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 {//第一个参数就是我们之前看的元数据,而且他还有一个参数,也就是这种方式比第六种更强大@Overridepublic 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 {//第一个参数就是我们之前看的元数据,而且他还有一个参数,也就是这种方式比第六种更强大@Overridepublic 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的覆盖,进而达成不修改源代码的情况下更换实现的效果

上一篇:【机器学习】拉格朗日对偶性
下一篇:关于道的成语有哪些