豆をスプリングコンテナに手動でロードします

1. @Configuration + @Bean
このメソッドは前の記事で紹介されており、最も一般的に使用されるメソッドでもあります。@Configuration を使用して構成クラスを宣言し、@Bean アノテーションを使用して Bean を宣言します。それを Spring コンテナーに移します。

具体的なコードは次のとおりです。

@Configuration
public class MyConfiguration {
    
    
    @Bean
    public Person person() {
    
    
        Person person = new Person();
        person.setName("spring");
        return person;
    }
}

2. @Componet + @ComponentScan
このメソッドは、私たちがよく使う方法でもあります。@Componet をコンポーネントとして中国語に翻訳し、クラス名に配置し、@ComponentScan を構成クラスに配置すると、パスを次のように指定できます。 @Componet アノテーションが付けられた Bean のスキャンを実行し、それらをコンテナーに追加するように指定します。

@Component
public class Person {
    
    
    private String name;
 
    public String getName() {
    
    
 
        return name;
    }
    public void setName(String name) {
    
    
        this.name = name;
    }
    @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}
 
@ComponentScan(basePackages = "com.springboot.initbean.*")
public class Demo1 {
    
    
    public static void main(String[] args) {
    
    
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
        Person bean = applicationContext.getBean(Person.class);
        System.out.println(bean);
    }
}

上記は日常的な操作であり、主に以下のコードによって実現され、他にも 2 つのメソッドが提供されています。ブロガーのリンクを参照してください。

@Import + ImportBeanDefinitionRegistrar を使用する

   // 在启动类或者在需要使用的类 引入
@Import(MyImportBeanDefinitionRegistrar.class)
public class Demo1 {
    
    
    public static void main(String[] args) {
    
    
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
        Person bean = applicationContext.getBean(Person.class);
        System.out.println(bean);
    }
}
 
class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    
    
 
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
    
        // 构建一个beanDefinition, 关于beanDefinition我后续会介绍,可以简单理解为bean的定义.
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();
        // 将beanDefinition注册到Ioc容器中.
        registry.registerBeanDefinition("person", beanDefinition);
    }
}

BeanDefinitionRegistryPostProcessor を使用する

  // 实际都是在启动类上
public class Demo1 {
    
    
    public static void main(String[] args) {
    
    
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        MyBeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor = new MyBeanDefinitionRegistryPostProcessor();
        applicationContext.addBeanFactoryPostProcessor(beanDefinitionRegistryPostProcessor);
        applicationContext.refresh();
        Person bean = applicationContext.getBean(Person.class);
        System.out.println(bean);
    }
}
 
class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    
    
 
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    
    
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();
        registry.registerBeanDefinition("person", beanDefinition);
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    
    
 
    }
}

上の2つの違いは、

ImportBeanDefinitionRegistrar は @Import を使用するか、spring.factories 構成ファイル org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ クラスのフル パスを使用する必要があります。

BeanDefinitionRegistryPostProcessor は必要なく、BeanFactoryPostProcessor を継承するため、@Component @bean @Configuration などの Spring 独自のインジェクション アノテーションを使用できます。

概要(全て)

Spring コンテナに Bean を追加するいくつかの方法:
@Configuration + @Bean
@ComponentScan + @Component
@Import インターフェイスでインポートする
FactoryBean を使用します。
後処理のために BeanDefinitionRegistryPostProcessor を実装します。

おすすめ

転載: blog.csdn.net/weixin_43051544/article/details/130603930