Gaofangye

Gaofangye

Spring IOC コンテナに Bean を手動で注入する

この機能は、Spring が提供する ImportBeanDefinitionRegistrar インターフェースを使用して実現します。

以下のステップに分かれています:

Bean の作成#

 import java.io.Serializable;

 public class User implements Serializable {

     private String username;

     public String getUsername() {
         return username;
     }

     public void setUsername(String username) {
         this.username = username;
     }
 }

MyImportBeanDefinitionRegistrar をカスタマイズして ImportBeanDefinitionRegistrar インターフェースを実装#

 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.RootBeanDefinition;
 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
 import org.springframework.core.type.AnnotationMetadata;

 public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
     @Override
     public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
         RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);
         beanDefinition.getPropertyValues().add("username", "私はBeanを作成するときに保存した");
         registry.registerBeanDefinition("cn.gaofangye.springbeanstudy.ImportBeanDefinitionRegistrar.demo1.User", beanDefinition);
     }
 }

このコードは、Beanusernameプロパティに値を設定するもので、プロパティにsetメソッドを追加する必要があります。

MyConfig 設定クラスをカスタマイズして Bean を作成するクラスを Import#

 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;

 @Configuration
 @Import(MyImportBeanDefinitionRegistrar.class)
 public class MyConfig {
 }

このようにすることで、カスタマイズした Bean を Spring IOC コンテナに正常に注入できます。

テストクラスを作成して検証#

 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;

 public class Main {

     public static void main(String[] args) {
         ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
         User user = applicationContext.getBean(User.class);
         System.out.println(user.getUsername());
     }
 }

出力結果#

 11:27:56.094 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5e91993f
 11:27:56.103 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
 11:27:56.165 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
 11:27:56.165 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
 11:27:56.166 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
 11:27:56.167 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
 11:27:56.170 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myConfig'
 11:27:56.173 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'cn.gaofangye.springbeanstudy.ImportBeanDefinitionRegistrar.demo1.User'
 私はBeanを作成するときに保存した

BeanName をカスタマイズして BeanName を使って IOC 内の Bean を取得#

 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.RootBeanDefinition;
 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
 import org.springframework.core.type.AnnotationMetadata;

 public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
     @Override
     public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
         RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);
         beanDefinition.getPropertyValues().add("username", "私はBeanを作成するときに保存した");
         registry.registerBeanDefinition("user", beanDefinition);
     }
 }
 registry.registerBeanDefinition("user", beanDefinition);

registerBeanDefinition の最初のパラメータを通じて、Bean に BeanName を設定します。

BeanName を使って IOC 内の Bean を取得することを検証#

 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;

 public class Main {

     public static void main(String[] args) {
         ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
         User user = applicationContext.getBean(User.class);
         System.out.println(user.getUsername());

         User findUserByBeanName = (User) applicationContext.getBean("user");
         System.out.println("BeanNameを使って取得したBean: " + findUserByBeanName.getUsername());
     }
 }

出力結果#

 12:30:24.491 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5e91993f
 12:30:24.500 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
 12:30:24.560 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
 12:30:24.560 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
 12:30:24.561 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
 12:30:24.562 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
 12:30:24.565 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myConfig'
 12:30:24.567 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user'
 私はBeanを作成するときに保存した
 BeanNameを使って取得したBean: 私はBeanを作成するときに保存した
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。