手書きのSpringConfig、最後の戦い、是非ご覧ください!

構成分析

構成方法を提供する理由前のコンテンツでは、コードを使用してテストしました。

GeneralBeanDefinition bd = new GeneralBeanDefinition();
bd.setBeanClass(Lad.class);
List<Object> args = new ArrayList<>();
args.add("sunwukong");
args.add(new BeanReference("magicGril"));
bd.setConstructorArgumentValues(args);
bf.registerBeanDefinition("swk", bd);

bd = new GeneralBeanDefinition();
bd.setBeanClass(MagicGril.class);
args = new ArrayList<>();
args.add("baigujing");
bd.setConstructorArgumentValues(args);
bf.registerBeanDefinition("magicGril", bd);

通常使用する場合の構成を見てみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="girl" class="di.MagicGirl"
     init-method="start" destroy-method="end">
        <constructor-arg type="java.lang.String" value="girl"></constructor-arg>
        <property name="friend" ref="boy"></property>
    </bean>

    <bean id="boy" class="di.Lad">
        <constructor-arg type="java.lang.String" value="boy"></constructor-arg>
        <constructor-arg type="di.MagicGirl" value="girl"></constructor-arg>
    </bean>
</beans>

構成を提供する方法の利点は次のとおりです。

  • 実用的でシンプル、より柔軟に変更可能
  • コードを変更せずに

一般的に使用される構成方法は、XMLと注釈の形式であり、その作業プロセスは次のとおりです。

image.png

構成作業プロセス

XMLタグと注釈の定義

どのXMLタグと注釈を定義する必要がありますか?前のコンテンツからわかるように、構成のコンテンツはBean定義情報であり、Bean定義のコンテンツは構成が必要なコンテンツです。

まず、Bean定義インターフェースにある情報を見てみましょう。

image.png

XML構成方法では、最初にDTDまたはXSDドキュメントを定義して、Bean定義を指定するための一連のタグ情報を定義する必要があります。

<bean id="girl" class="di.MagicGirl"
     init-method="start" destroy-method="end">
        <constructor-arg type="java.lang.String" value="girl"></constructor-arg>
        <property name="friend" ref="boy"></property>
</bean>

Bean構成で指定されたコンテンツは、Bean定義インターフェースの情報であることがわかります。

アノテーションの方法では、一連のアノテーションを定義する必要があるため、どのアノテーションが必要か。これはBean定義インターフェースのコンテンツでもあります。

  • クラスの指定、BeanNameの指定、スコープの指定、ファクトリメソッドの指定、ファクトリBeanの指定、initメソッドの指定、destroyメソッドの指定、これらはSpringを使用するときに@Componentを介して実装されます。
  • 構築パラメーターへの依存関係の指定:@ Autowired、@ Qualifier
  • プロパティの依存関係を指定します:@Value

Bean構成の分析

Bean構成の解析プロセスは、BeanFactoryではなく、別のインターフェースで実装する必要があります。単一責任の原則を実現するには、Bean構成を解析するための別のインターフェースを定義してから、Bean定義をに登録する必要があります。 BeanFactory

ApplicationContextインターフェース

ApplicationContextインターフェースは、Bean構成の解析を完了するために使用されます。前述のように、構成を実装するためのXMLとアノテーションがあるため、ApplicationContextインターフェースを実装するための2つの実装クラスがあります。

image.png

  1. XMLでの実装:
  • 複数のXMLファイルが存在する可能性があるため、ここではリストを使用します
  • 完了する必要がある:xmlのロード、xmlの解析、Bean定義の作成、およびBean定義の登録のタスク
  1. アノテーションの実装
  • 複数のスキャンされたパッケージもあり、リストもここで使用されます
  • 完了する必要があります:パッケージをスキャンし、アノテーションを取得し、Bean定義を作成し、Bean定義を登録します。

Bean定義を作成して登録する必要があるため、BeanFactoryおよびBeanDefinitionRegistryインターフェースが使用されます。したがって、サブクラスに個別に実装すると、コードのこの部分が繰り返され、抽象化されて親クラスに配置されます。

image.png

ユーザーがそれらを使用するときに知っておく必要のあるインターフェースとクラスは何ですか?

  1. 関連する構成を指定します:xml、アノテーション
  2. Bean関連の取得:BeanFactory

次に、外観モードを使用して、ユーザーがApplicationContextとそのサブクラスを知っているだけでよいようにすることができます。ApplicationContextはBeanFactoryを継承し、2つのインターフェースを組み合わせることができます。

image.png

ApplicationContextインターフェース:

/**
 * @className: ApplicationContext
 * 用来构建整个应用环境的接口,用来完成Bean的配置和解析
 * 1:为了减少用户对框架类接口的依赖,扩展了BeanFactory接口,
 * Bean的配置和Bean的获取都可以通过ApplicationContext接口来完成
 * 2:配置资源的方式有xml和注解,所以存在xml和注解两种子类的实现
 * 3. Bean配置解析首先需要加载,所以实现了配置资源Resource的加载接口ResourceLoader
 * @author: TR
 */
public interface ApplicationContext extends ResourceLoader,BeanFactory {

}

ApplicationContextの抽象クラス実装

/**
 * @className: AbstractApplicationContext
 * @description: ApplicationContext的抽象类实现
 * @author: TR
 */
public abstract class AbstractApplicationContext implements ApplicationContext {

    /** 用组合的方式来持有BeanFactory,完成BeanFactory接口的方法 */
    protected BeanFactory beanFactory;

    public AbstractApplicationContext() {
        super();
        this.beanFactory = new PreBuildBeanFactory();
    }

    public AbstractApplicationContext(BeanFactory beanFactory) {
        super();
        this.beanFactory = beanFactory;
    }

    @Override
    public Object getBean(String beanName) throws Exception {
        return this.beanFactory.getBean(beanName);
    }

    @Override
    public void registerBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
        this.beanFactory.registerBeanPostProcessor(beanPostProcessor);
    }
}

xml構成のApplicationContext実装クラス

/**
 * @className: XmlApplicationContext
 * @description: xml配置方式的ApplicationContext实现类
 * @author: TR
 */
public class XmlApplicationContext extends AbstractApplicationContext {

}

アノテーション構成のApplicationContext実装クラス

/**
 * @className: AnnotationApplicationContext
 * @description: 注解配置方式的ApplicationContext实现类
 * @author: TR
 */
public class AnnotationApplicationContext extends AbstractApplicationContext {

}

おすすめ

転載: blog.csdn.net/qq_41701956/article/details/118159022