目錄
BeanFactoryPostProcessor
BeanDefinitionRegistryPostProcessor
使用一下Bean工廠后置處理器
定義包掃描范圍
定義一個組件Bean
定義一個普通的類
自定義一個組件類實現Bean工廠后處理器
測試類
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 {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// Dog類只是一個普通的類// 在這里我通過Spring的回調拿到BeanDefinitionRegistry// 通過BeanDefinitionRegistry將Dog類的定義信息放入Spring容器中GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(Dog.class);registry.registerBeanDefinition("dog", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// Spring回調將beanFactory傳遞過來// 這里通過beanName從beanFactory中獲取到對應的BeanDefinition信息BeanDefinition catBeanDefinition = beanFactory.getBeanDefinition("cat");String beanClassName = catBeanDefinition.getBeanClassName();// 這里打印出:spring.demo.CatSystem.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的beanObject catBean = applicationContext.getBean("cat");// 這里打印出:spring.demo.Cat@4310d43System.out.println(catBean);// 從容器中獲取beanName為cat的beanObject dogBean = applicationContext.getBean("dog");// 這里打印出:spring.demo.Dog@54a7079eSystem.out.println(dogBean);}
}