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 を実装します。