目录
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
- 该接口是Spring提供的扩展点之一
- 是一个函数式接口,只有一个抽象方法
- Spring会在合适的时机执行方法回调,并将bean工厂作为参数传递进去
既然把ConfigurableListableBeanFactory类型的bean工厂传递过来了,那么该类型中的方法我是不是就可以为所欲为地为自己所用了啊
package org.springframework.beans.factory.config;
import org.springframework.beans.BeansException;
// 函数式接口
@FunctionalInterface
public interface BeanFactoryPostProcessor {
// 参数为bean工厂
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
BeanDefinitionRegistryPostProcessor
- 是BeanFactoryPostProcessor的子接口
- 自身提供了一个将BeanDefinitionRegistry作为参数传递进来的方法
把BeanDefinitionRegistry传递过来了,BeanDefinitionRegistry是用来管理BeanDefinition的,提供了一系列操作BeanDefinition的方法,那么我就可以操作Spring容器中的BeanDefinition了
package org.springframework.beans.factory.support;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
// 继承了BeanFactoryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
// 将BeanDefinitionRegistry作为参数
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
使用一下Bean工厂后置处理器
定义包扫描范围
package spring.demo;
import org.springframework.context.annotation.ComponentScan;
// 扫描spring.demo及其子包
@ComponentScan("spring.demo")
public class SpringConfig {
}
定义一个组件Bean
package spring.demo;
import org.springframework.stereotype.Component;
// 这里添加了@Component注解
// Spring容器启动过程中通过ConfigurationClassPostProcessor解析@Component注解,将Cat类的BeanDefinitoon放入容器中
@Component
public class Cat {
}
定义一个普通的类
package spring.demo;
// Dog类只是一个普通的Java类,没加任何注解
public class Dog {
}
自定义一个组件类实现Bean工厂后处理器
package spring.demo;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;
@Component
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// Dog类只是一个普通的类
// 在这里我通过Spring的回调拿到BeanDefinitionRegistry
// 通过BeanDefinitionRegistry将Dog类的定义信息放入Spring容器中
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(Dog.class);
registry.registerBeanDefinition("dog", beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// Spring回调将beanFactory传递过来
// 这里通过beanName从beanFactory中获取到对应的BeanDefinition信息
BeanDefinition catBeanDefinition = beanFactory.getBeanDefinition("cat");
String beanClassName = catBeanDefinition.getBeanClassName();
// 这里打印出:spring.demo.Cat
System.out.println(beanClassName);
}
}
测试类
package spring.demo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringMain {
public static void main(String[] args) {
// 启动Spring容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
// 从容器中获取beanName为cat的bean
Object catBean = applicationContext.getBean("cat");
// 这里打印出:spring.demo.Cat@4310d43
System.out.println(catBean);
// 从容器中获取beanName为cat的bean
Object dogBean = applicationContext.getBean("dog");
// 这里打印出:spring.demo.Dog@54a7079e
System.out.println(dogBean);
}
}