spring-创建 bean 的几种姿势

  • 使用 @Bean 注解

  • 使用 @Component 注解。@Service 和 @Repository,等都是 @Component 的继承

  • 使用 xml,不推荐

  • 使用 @import 注解,可以导入一个普通类作为 bean,或者导入被 @Configuration 注解的配置类,或者 ImportSelector, ImportBeanDefinitionRegistrar 的实现。

  • 实现 BeanFactoryAware 方法

  • 创建 BeanDefinitionRegistryPostProcessor 的实现的实现类,并实现 postProcessBeanDefinitionRegistry 方法

    @Import 普通类

    public class ImportDemo {
    
        public void say() {
            System.out.println("this is a @import demo class ");
        }
    }
    
    @Configuration
    @Import(ImportDemo.class)
    public class AppConfig {
    }
    
    public class Main {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext(AppConfig.class);
            ImportDemo bean = context.getBean(ImportDemo.class);
            bean.say();
        }
    }
    

    @Import 配置类

    参考:http://events.jianshu.io/p/899013ac1d9a

    创建 BeanDefinitionRegistryPostProcessor bean 实例

    @Configuration
    public class AppConfig {
    
        @Bean
        public BeanDefinitionRegistryPostProcessor people() {
            return new BeanDefinitionRegistryPostProcessor() {
    
                @Override
                public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    
                }
    
                @Override
                public void postProcessBeanDefinitionRegistry(@NonNull BeanDefinitionRegistry registry) throws BeansException {
                    BeanDefinitionBuilder beanBuilder = BeanDefinitionBuilder.genericBeanDefinition(People.class, People::new);
                    registry.registerBeanDefinition("people", beanBuilder.getBeanDefinition());
                }
            };
        }
    
    }
    
posted @ 2022-12-17 14:43  莫己若  阅读(22)  评论(0编辑  收藏  举报