春の研究ノート-02Beanスコープ、自動アセンブリ、アノテーション開発

1.Beanスコープ

Spring IOCコンテナがBeanインスタンスを作成するときに、シングルトン(シングルトンモード、デフォルトオプション、プロジェクト全体で1つのみ)、プロトタイプ(プロトタイプモード)、リクエスト(Httpリクエスト)、セッション(Httpリクエスト)を含むBeanのスコープを指定できます。セッション)、グローバルセッション(グローバルセッション)[後者の3つはWebプロジェクトでのみ有効です]。

(1)シングルトン

Spring IOCコンテナ全体でBeanIDに対応するエンティティクラスは1つだけです。これは、通常、サービスとDAOに適用されます。

    <bean id="dog" class="com.zt.entity.Dog" scope="singleton">
        <constructor-arg index="0" value="汪汪"/>
        <constructor-arg index="1" value="2"/>
    </bean>

デフォルトはシングルトンで、スコープを表示および書き込みすることもできます。

ここで説明しているシングルトンモードとは、同じBean IDを使用して取得されたエンティティクラスが同じであることを指しますが、2つのBeanタイプが同じであるが、Bean IDが異なる場合でも、2つは異なることに注意してください。エンティティクラス。

[注]:Javaでは、参照型==はオブジェクトストレージのメモリアドレスを比較します。

    <bean id="dog" class="com.zt.entity.Dog">
        <constructor-arg index="0" value="汪汪"/>
        <constructor-arg index="1" value="2"/>
    </bean>
    
    <bean id="dog2" class="com.zt.entity.Dog">
        <constructor-arg index="0" value="汪汪"/>
        <constructor-arg index="1" value="2"/>
    </bean>

(2)プロトタイプ

プロトタイプモードでは、IOCコンテナを使用して取得されたBeanは、Bean IDが同じであっても、毎回同じではありません。

    <bean id="dog" class="com.zt.entity.Dog" scope="prototype">
        <constructor-arg index="0" value="汪汪"/>
        <constructor-arg index="1" value="2"/>
    </bean>

(3)リクエスト

Httpリクエストでは、Bean IDは1つのインスタンスにのみ対応します。各リクエストで、Beanはシングルトンモード(同じBean IDに制限されます)であることが理解できます。

(4)セッション

セッションでは、BeanIDは1つのインスタンスにのみ対応します。

(5)グローバルセッション

グローバルセッション(一時的にわかりません。理解してから追加します)。

2.自動組立

Springは自動組み立て機能を提供します。簡単な構成のみで、注入用に自分で構成する必要もありません。

Autowireキーワード:注入に役立つSpringコンテナのルールを指定するために使用されます。

byName:BeanのIDが、注入を待機しているエンティティクラスの属性名と同じである場合、注入できます。

byType:Beanのタイプが、注入を待機しているエンティティクラスの属性のタイプと同じである場合、注入できます。

コンテナに登録されているBeanが同じタイプである場合(または、子の親クラスやインターフェイスなど、世代によって注入されたプロパティのカテゴリにすべて準拠している場合)、byTypeを使用するとエラーが報告されます。

もちろん、この属性を手動で挿入することもできます。Springが属性が挿入されたことを検出した後、自動的に挿入されることはありません。

3.アノテーションの開発

設定ファイルには明らかな欠陥があります:設定ファイルに多数のルールを書き込む必要があります。システムの統合が高くなると、多数の設定ファイルの混乱がプロジェクトの混乱を引き起こすため、注釈を使用します多くの場所で構成ファイルを置き換えるため。これにより、構成ファイルを大幅に簡素化したり、構成ファイルを削除したりすることができます。ただし、これは構成ファイルの書き込みが古くなっていることを意味するものではありません。構成ファイルには注釈では実現できない柔軟性があるためです。以前は、Mybatisでは<sql>と<include>を使用して、繰り返されるSQLを抽出できました。パーソナライズされたresultMapもカスタマイズします。これらはアノテーションでは不可能です。現在の一般的な方法は、柔軟性が必要な構成ファイルに書き込み、可能な限りアノテーションを使用して他のアノテーションを置き換えることです。

注釈を有効にするためには、構成ファイルとは異なります。構成ファイルでは、構成方法と構成の場所を直接指定できますが、知るためにはスキャン後に注釈を実現する必要があります。覚えていますか?Mybatisでは、アノテーション開発を使用する場合、マッパーの登録をクラスに変更し、DAOを指す必要があります。

1.自動アセンブリ注釈の使用

1.アノテーションを使用するには、コンテキストを導入し、構成ファイルを次のように変更する必要があります。

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


</beans>

2.スキャナーを構成します

<context:component-scan base-package="com.zt"/>

3.アセンブルする必要があるクラスの対応する属性にAutowiredアノテーションを追加します

    @Autowired
    private Stu stu;

4.テスト

注入されるプロパティと同じ名前のBeanIDがあります。

注入されるプロパティと同じ名前のBeanIDはなく、同じタイプのBeanがあります。

もちろん、SpringはAutowriedで使用するためのQualifierアノテーションも提供します。これは、BeanIDでBeanを指定することで挿入できます。これはプログラム検査にも便利です。

だが!Java自体がリソースアノテーションを提供し、自動アセンブリを実現することもできます。

違いとつながりを詳しく説明してください。

連絡先:@Autowiredと@Resouceの両方を自動アセンブリに使用でき、両方を属性フィールドまたはセッターに書き込むことができます。

違い:@Autowiredはデフォルトでタイプによって一致します。デフォルトでは、注入されるオブジェクトが存在する必要があり、nullにすることはできません。アセンブリをnullにできるように、プロパティrequired = falseを設定することもできます。@Qualifierアノテーションを使用すると、名前でアセンブリを使用できます。

属性名アセンブリ名で指定されたデフォルト名に応じた@Resource 名前が指定されていない場合、アノテーションがフィールド上にある場合、デフォルトではフィールド名に従って名前で検索が実行されます。アノテーションがセッター上にある場合、セッターメソッドに対応する属性名に従って検索されます。 。同名が見つからない場合は、種類に応じて組み立てます。ただし、名前が指定されている場合は、名前に従ってのみ組み立てられます。つまり、name-> byName-> byTypeです。

2.コンポーネントの注釈

アノテーションを導入した後、構成ファイルでBeanを構成する必要はありませんが、コンポーネントのアノテーションを使用して、SpringコンテナーでBeanとして管理する必要のあるクラスをSpringに通知します。

@Component:Springで管理する必要のあるクラスをbeanとして宣言できます。@ Component +値は<beanid = "" class = ""> </ bean>を置き換えます。

@Resourceアセンブリを使用できます。

@ Autowired + @Qualifierアセンブリを使用することもできます。

1)基本タイプのインジェクションには@Valueを使用します。

2)@ Autowired + @ Qualifierを使用して、参照型を自動的にアセンブルします。

3)配列、リスト、マップなどの複雑なオブジェクトは、挿入にアノテーションを直接使用するのは簡単ではありません。これは、構成ファイルの柔軟性も強調しています。

3.階層化された開発ノート 

実際、プロジェクト開発では、プロジェクトを階層化します:Controllr-Service-DAO

@Repository:DAOレイヤーをマークするために使用されます。

@Service:サービスレイヤーをマークするために使用されます。

@Controller:コントローラーレイヤーをマークするために使用されます。

上記のアノテーションが付いたクラスも、スキャナーでスキャンされた後、SpringコンテナーによってBeanとして管理されます。

4.構成クラス(構成ファイルの代わりにJava構成クラスを使用できます)

@Bean:コンテナ内の既存のオブジェクトをパラメータとして渡し、返されたオブジェクトを管理のためにコンテナに保存します。

@Configurable:現在のクラスが構成クラスであることを宣言します。

構成にアノテーションを使用する場合、jarパッケージ内のクラスを参照する必要がある場合があります。現時点では、これらのクラスを直接変更する方法はありません。オブジェクトを取得してコンテナーに格納するには、上記の注釈。たとえば、猫はネズミを食べ、ネズミはネズミの餌として使われますが、ネズミやネズミを改造することはできませんが、ネズミを餌とする猫を返したいと思います。

Mouse.java

package com.zt.config;

public class Mouse {
    private String name;

    public Mouse() {
    }

    public Mouse(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Mouse{" +
                "name='" + name + '\'' +
                '}';
    }
}

Cat.java

package com.zt.config;

public class Cat {
    private String name;
    private Mouse mouse;

    public Cat() {
    }

    public Cat(String name, Mouse mouse) {
        this.name = name;
        this.mouse = mouse;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Mouse getMouse() {
        return mouse;
    }

    public void setMouse(Mouse mouse) {
        this.mouse = mouse;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", mouse=" + mouse +
                '}';
    }
}

TestConfig.java

package com.zt.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TestConfig {

    @Bean
    public Mouse mouse(){
        return new Mouse("jerry");
    }

    @Bean
    public Cat cat(Mouse mouse){
        return new Cat("Tom",mouse);
    }
}

テスト:

import com.zt.config.Cat;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.zt.config.TestConfig;
public class TestClassConfig {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
        Cat cat = context.getBean(Cat.class);
        System.out.println(cat);
    }
}

アノテーションとxml構成ファイルについて話す:何年も前、業界は一般に、構成ファイルを使用するとプログラムの分離を完了することができると信じていました。プロジェクトは最終的にクラス+構成ファイルにパッケージ化されるため、直接変更することが非常に重要です。ソースコードは非現実的なものなので、構成ファイルを変更することでプロジェクトを変更できます(接続プールの置き換えなど)。ただし、構成ファイルの方法では、プロジェクト全体が多数の構成ファイルに圧倒されます。したがって、現在の主流はDocumentedを構成することです。つまり、ほぼ固定された使用法の注釈、頻繁に変更される可能性がある、またはより柔軟なものについては、構成ファイルが引き続き使用され、構成ファイルが簡素化されます。

 

おすすめ

転載: blog.csdn.net/qq_39304630/article/details/112368667