本文共 1459 字,大约阅读时间需要 4 分钟。
作用:ZJ:BeanDefinition实例化之后,会有"一个东西"将这些实例化的BeanDefinition交给BeanDefinitionRegistry并调用下面两个方法
1.下面我自己定义了一个BeanDefinitionRegistry
public class MyBeanDefinitionRegistry implements BeanDefinitionRegistry { //该方法可用于动态注入bean @Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException { System.out.println(String.format("调用方法:%s", "registerBeanDefinition")); } @Override public boolean containsBeanDefinition(String beanName) { System.out.println(String.format("调用方法:%s", "containsBeanDefinition")); return false; }
2.下面是一个main方法
public static void main(String[] args) { ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(new MyBeanDefinitionRegistry()); scanner.scan("基础包名"); }
main方法中的scanner就是我上面所说的"一个东西",我猜应该有很多类似这样的类,它会扫描基础包名下面所有有@Component注解的类及其派生类,然后将这些类封装成BeanDefinition,每生成一个BeanDefinition,都会再将这个BeanDefinition交给我自己定义的MyBeanDefinitionRegistry类,然后调用containsBeanDefinition方法,再调用registerBeanDefinition注册,至少ClassPathBeanDefinitionScanner应该,我说的是应该,这样子
3.动态注入bean
public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.refresh(); // 可以在我们的系统里获取到ApplicationContext // 然后转换成BeanDefinitionRegistry即可动态注入 BeanDefinitionRegistry bdr = (BeanDefinitionRegistry) ctx; bdr.registerBeanDefinition("abc", new RootBeanDefinition(Abc.class)); Abc cb = ctx.getBean(Abc.class); System.out.println(cb);}
转载地址:http://fxhws.baihongyu.com/