一、如何扩展
- 1.通过实现bean工厂的后置处理器(BeanFactoryPostProcessor)来扩展
二、示例截图
三、代码示例
package com.learning.beanDefinitionExtension;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/**
* @Author wangyouhui
* @Description bean工厂后置处理器
**/
@Component
public class BeanFactoryPostProcessor implements org.springframework.beans.factory.config.BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 在所有BeanDefinition注册完之后调用
for(String beanDefinitionName : beanFactory.getBeanDefinitionNames()){
System.out.println(beanDefinitionName);
}
BeanDefinition userService = beanFactory.getBeanDefinition("userService");
// 修改为多例
userService.setScope(BeanDefinition.SCOPE_PROTOTYPE);
}
}
package com.learning.beanDefinitionExtension;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author wangyouhui
* @Description 配置类
**/
@Configuration
public class BeanConfig {
@Bean
public UserService userService(){
return new UserService();
}
@Bean
public BeanFactoryPostProcessor beanFactoryPostProcessor(){
return new BeanFactoryPostProcessor();
}
}
package com.learning.beanDefinitionExtension;
import org.springframework.stereotype.Component;
/**
* @Author wangyouhui
* @Description bean
**/
@Component
public class UserService {
public UserService(){
System.out.println("对象实例化完成");
}
}
package com.learning.beanDefinitionExtension;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @Author wangyouhui
* @Description 启动类
**/
public class Applicaiton {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
UserService bean1 = applicationContext.getBean(UserService.class);
UserService bean2 = applicationContext.getBean(UserService.class);
// 改为多例后判断是否相同,false则表示多例设置成功
System.out.println(bean1 == bean2);
}
}