初心者のWeb開発の簡単な要約(6)-SpringのIoCコンテナ

目次

I.はじめに

2つのIoCコンテナとは

3つの例

1.XMLを介してルールを構成します

2.注釈を渡します

3.Springの他のいくつかの注釈

JavaBeanライフサイクルの4つの監視

五数要約


I.はじめに

前の記事から続けて、初心者向けのWeb開発の簡単な要約(4つ)-Webアプリケーション開発のMVCは、IoCコンテナーの関連コンテンツを要約します。

IoCコンテナーは、Springフレームワークのコア機能です。コンテナを介してすべてのJavaBeanコンポーネントを管理し、コンポーネントのライフサイクル管理、構成とアセンブリ、AOPサポート、およびAOPに基づくステートメントトランザクションサービスを提供します。

2つのIoCコンテナとは

IoC(制御の反転)コンテナ

通常、Javaコンポーネントは、新しいインスタンスを使用してコンポーネント間の参照を実装します。コンポーネントの2つのインスタンスの両方に共有コンポーネントが含まれている場合、コンポーネントを共有することはできません。システムに多数のコンポーネントがある場合、コンポーネントのライフサイクルを維持するだけでなく、コンポーネント間の依存関係を維持する必要があります。これにより、システムが大幅に複雑になり、コンポーネントは次のようになります。これらの制御プロセスは完全に開発されており、人が自分で制御します。

IoCコンテナは、制御の権利を反転し、制御の権利をIoCコンテナに渡します。IoCコンテナは、コンポーネントの作成と構成を担当し、コンポーネントのライフサイクル管理を担当します。開発者は、次のことのみを行う必要があります。コンポーネントが構成の作成とコンポーネントの使用が分離されるように、アセンブリルールを定義します。また、コンポーネントの複数のインスタンスに共有コンポーネントがある場合は、複数回注入しなくても相互に共有できます。

SpringのIoCコンテナでは、すべてのコンポーネントはJavaBeanコンポーネントと呼ばれ、各コンポーネントはBeanです。

コンポーネントの構成ルールを定義するには、通常2つの方法があります。

  • (1)XML
  • (2)注釈

3つの例

簡単な例を通して、このJavaBeanコンポーネントが構成ルールをどのように定義するかを見てください。

1.XMLを介してルールを構成します

  • 1.プロジェクトpom.xmlにSpring-Context依存関係を導入します
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
  • 2.プロジェクトで使用する必要のあるJavaBeansを定義します

(1)RegisterServiceを定義します。入力した携帯電話番号とパスワードを使用してユーザーを登録し、登録が成功した後、成功した登録SMSをユーザーに送信します。

public class RegisterService {
    private MessageService messageService;

    public void setMessageService(MessageService service) {
        this.messageService = service;
    }

    public User register(String phone, String password) {
        User user = new User();
        user.phone = phone;
        user.password = password;
        //随机生成一个用户名
        user.name = "小刘";
        //需要将该信息写入数据库
        SqlDataBase sql = new SqlDataBase();
        sql.insert(user);
        //注册成功之后,给用户发送短息
        if (messageService == null) {
            System.err.println("还没有初始化MessageService");
            return user;
        }
        messageService.sendRegisterSuccessMessage(phone);
        return user;

    }

}

(2)MessageServiceの定義:ユーザーの携帯電話にSMSを送信します(ロジックは省略)

public class MessageService {
    /**
     * 发送短信
     *
     * @param phone
     */
    public void sendRegisterSuccessMessage(String phone) {
        String message = "您已经成功注册该网站账户";
        System.out.println(String.format("已经成功的向%s发送注册短信:%s", phone, message));
    }
}
  • 3.JavaBeansを構成するためのルールを定義します

(1)ソースディレクトリにapplication-context.xmlファイルを追加します

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="registerService" class="com.wj.spring.RegisterService">
        <property name="messageService" ref="messageService"/>
    </bean>

    <bean id="messageService" class="com.wj.spring.MessageService">
    </bean>
</beans>

idは、Beanの一意のIDです。MessageServiceの参照は、<property name = "messageService" ref = "messageService" />のメソッドを介してRegisterServiceに追加されます。実際、上記のXML構成の内容は次のようになります。次のJavaコード:

    MessageService messageService = new MessageService();
    RegisterService registerService = new RegisterService();
    registerService.setMessageService(messageService);
  • 4. XMLファイルを読み取って、IoCコンテナであるApplicationContextを取得します。
public class RegisterApplication {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("config/application-context.xml");
        RegisterService service = context.getBean(RegisterService.class);
        //RegisterService service = (RegisterService)context.getBean("registerService");
        User user = service.register("12345678901", "123456");
        System.out.println("注册之后的用户名为:" + user.name);      
    }
}

ClassPathXmlApplicationContextが渡されるときは、このapplication-context.xmlの相対パスです。このようにして、定義されたJavaBeanはcontext.getBean()を介して取得できます。実行中のプロジェクトは次のとおりです。

関連するコードがgithubにアップロードされていますhttps//github.com/wenjing-bonnie/build-spring.git:com / wj / springの下の対応するコード。

2.注釈を渡します

XMLファイルを使用すると、すべてのJavaBeanを1つずつ一覧表示でき、構成の挿入によって各JavaBeanの依存関係を直感的に理解できますが、欠点も明らかになります。この書き込み方法は非常に面倒であり、コンポーネントを1つずつ追加する必要があります。コンポーネントをXMLで追加します。したがって、このアノテーション方法があり、IoCコンテナがすべてのBeanを自動的にスキャンしてアセンブルできるようにします。

  • 1.上記1と同じ
  • 2.同じ定義は上記のJavaBeanと同じですが、@ ComponentアノテーションがJavaBeanに追加され、JavaBeanコンポーネントであることを示します。

(1)RegisterServiceを定義します

@Component
public class RegisterAnnotationService {
    //   @Autowired将指定类型的Bean直接注入到指定的字段
    @Autowired
    private MessageAnnotationService messageAnnotationService;

}

@Autowiredを介して、指定されたタイプのBeanを指定されたフィールドに直接注入します。もちろん、@ AutowiredはList <JavaBean>コレクションに注釈を付けることもできるため、同じタイプの追加のJavaBeanはすべて、IoCコンテナによってコレクションに自動的にアセンブルされます。JavaBeansがアセンブルされる順序を設定する場合は、@ Order(1)、@ Order(2)...を追加できます。

デフォルトでは、特定のフィールドが@Autowiredでマークされている場合、IoCコンテナが対応するJavaBeanを見つけられない場合、NoSuchBeanDefinitionExceptionがスローされるため、@ Autowired(required = false)を追加してこの例外を回避できます。

(2)MessageServiceを定義する

@Component
public class MessageAnnotationService {

}

上記の2つのアノテーションを追加することにより、JavaBeans間の構成ルールが完成します。

デフォルトでは、JavaBeanは@Componentとしてマークされ、IoCコンテナは自動的にシングルトンを作成します。つまり、JavaBeanはコンテナが初期化されるときに作成され、コンテナが破棄されると破棄されます。コンテナ操作全体で、getBean()はインスタンスを取得します。

実際、@ Scopeを使用してインスタンスのスコープをマークできます:@Scope(value = "singleton")または@Scope( "singleton")、値は4つのスコープに対応します

シングルトン:唯一のBeanインスタンスで、デフォルトはシングルトンです。つまり、getBean()が取得するのはインスタンスです。

プロトタイプ:コンテナが新しいインスタンスを返すたび。つまり、getBean()は新しいインスタンスを取得します。

リクエスト:Httpリクエストが行われるたびに新しいインスタンスが生成されます。これは、現在のリクエストでのみ有効です。

セッション:Httpリクエストが行われるたびに新しいインスタンスが生成されます。これは、現在のセッションでのみ有効です。

  • 3.注釈を読んでIoCコンテナを取得します
@Configuration  //用来标明是一个配置类,在创建AnnotationConfigApplicationContext,需要传入该类
@ComponentScan //用来告诉容器,自动扫描当前类所在的包以及子包,把所有标注为@Component的Bean都自动创建出来,并根据@Autowired进行装配
public class RegisterAnnotationApplication {

    public static void main(String[] args) {
       ApplicationContext context = new  AnnotationConfigApplicationContext(RegisterAnnotationApplication.class);
        RegisterAnnotationService service = context.getBean(RegisterAnnotationService.class);
        //RegisterService service = (RegisterService)context.getBean("registerService");
        User user = service.register("12345678901", "123456");
        System.out.println("注册之后的用户名为:" + user.name);
    }
}

XMLファイルを介した構成メソッドとは異なり、ApplicationContextを読み取るときは、クラスに@Configurationを追加して、それが構成クラスであることを示す必要があります(実際、@ Configurationは@Componentに置き換えることができます。つまり、このコンポーネントを区別することはできません特定の関数については、@ Componentを直接使用します。AnnotationConfigApplicationContextを作成するときは、このクラスを渡す必要があります。@ ComponentScanを追加して、現在のクラスが配置されているパッケージとサブパッケージ自動的にスキャンするようにコンテナーに指示します(注スコープがあること)、@ ComponentとしてマークされたすべてのBeanを配置すると、@ Autowiredに従って自動的に作成され、アセンブルされます。

プロジェクトを実行した結果は、上記と一致しています。関連するコードがgithubにアップロードされていますhttps//github.com/wenjing-bonnie/build-spring.git:com / wj / springannotationの下の対応するコード。

3.Springの他のいくつかの注釈

1.JavaBeanコンポーネントに関連するアノテーション

以前に印象的だった@Controller / @ RestController、@ Service、@ Respositoryなどの一部と同様に、これらはすべてJavaBeansに注釈を付けるために使用されますが、区別できない場合は、これは後でSpringMVCにいくつかの特別な関数を持つJavaBeanです。所属するコンポーネント。@ Componentを使用して直接注釈を付けます。

2.構成ファイル、リソースファイル、およびその他の関連ソリューションを読み取ります

  • (1)「リソース」の下にあるいくつかの一般的なファイルを読む

IoCコンテナを使用すると、これらのファイルを簡単にインポートできます。これは、プログラムが読み取るのに便利であり、InputStreamを取得するための面倒なコードを大幅に節約します。Mavenプロジェクトでは、これらのファイルは多くの場合Resourcesディレクトリに配置されるため、SpringフレームワークはファイルのInputStreamを直接読み取るためのorg.springframework.core.io.Resourceを提供します。

    @Value("readme.txt")
    private Resource readmeTxt;

次に、プロジェクトで、readmeTxt.getInputStream()を介してtxtinputstreamを取得できます。

  •  (2)リソースの下にあるいくつかのキー/値構造ファイルを読み取ります

多くの場合、一部の構成ファイルはキー/値形式で保存されます。上記の方法を使用するのは便利ではないため、IoCコンテナーはより便利な読み取り方法も提供します。@PropertySourceアノテーションを追加することで、キーに応じて対応する値を直接取得できます。たとえば、次のような構成ファイルconfig /application.propertiesがあります。

application.ipaddress = 192.168.110.118

構成ファイルを読み取る必要があるコンポーネントに@PropertySource( "config / application.properties")を追加するだけで、対応する値をキーで取得できます。

@Configuration
@PropertySource("config/application.properties")
public class ApplicationConfig {
    @Value("${application.ipaddress}")
    public String ipAddress;
}

 @Value( "$ {application.ipaddress}"):デフォルト値のない値です。デフォルト値を指定する場合は、@ Value( "$ {application.ipaddress:192.168.0.0}")です。

  • (3)他のコンポーネントで構成ファイルの関連コンテンツを参照する

上記の例でも、他の場所のconfig / application.propertiesの構成アイテムを参照する場合は、@ Value( "#{bean.property}")によって、対応する構成アイテムを直接取得できます。BeanはApplicationConfigです。インスタンスapplicationConfigのipAddress属性値(このインスタンスをインポートする必要はありませんが、コンポーネント名の最初の文字は小文字です)がOtherAnnotationにインポートされます。

@Component
public class OtherAnnotation {

    @Value("#{applicationConfig.ipAddress}")
    public String ipAddress;
}

このアノテーションメソッドを使用すると、OtherAnnotationにconfig / application.propertiesを導入しなくても、ApplicationConfigで定義された構成アイテムを読み取ることができます。(2)とは異なり、(2)では@Value( "$ {key:defaultValue}")を使用して構成ファイルの値を読み取りますが、OtherAnnotationでは@Value( "#{bean .property}")Read ApplicationConfigで読み取られる構成アイテム。

JavaBeanライフサイクルの4つの監視

JavaBeanをIoCコンテナに追加する場合、コンテナがJavaBeanを初期化するときにメッセージをリッスンし、コンテナが閉じられるときにリソースをクリーンアップする必要がある場合があります。次に、JavaBeanで2つのメソッドのみを定義し、プロジェクトにjavax.annotation依存関係を導入し、javax.annotationの@PostContructと@PreDestroyを上記の2つのメソッドに追加できます。プロセスは次のとおりです。

(1)pom.xmlにjavax.annotation依存関係を追加します

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>

(2)MessageAnnotationServiceで初期化と破棄を実行する必要があるメソッドに@PostContructと@PreDestroyを追加します

public class MessageAnnotationService {

    @PostConstruct
    public void init() {
        System.out.println("MessageAnnotationService init");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("MessageAnnotationService destroy");
    }
}

このように、IoCコンテナが初期化されて破棄されると、対応するメソッド呼び出しが表示されます。

五数要約

1. Springのコア機能はIoCコンテナーであり、コンポーネントの作成とアセンブリを提供します。構成ルールを定義するだけで、IoCコンテナーはすべてのプロセスを自動的に完了します。

2.コンポーネント間の構成ルールは、XMLファイルと注釈の2つの方法で定義できます。

3.最後に、プロジェクトにBean構成ファイルが非常に多い理由を理解しました。

4. @Componentを使用してクラスにコンポーネントとして注釈を付けると、IoCコンテナーはコンポーネントの開始時にコンポーネントを自動的に初期化します。

5. @Scopeを使用して、コンポーネントインスタンスのスコープを指定できます。これは、シングルトンであるか、毎回新しいインスタンスであるかを示します。

6. ApplicationContextはIoCコンテナーであり、対応するコンポーネントインスタンスはgetBean()を介してApplicationContextから取得できます。

7.コンポーネントが初期化または破棄されたときに、javax.annotationを使用して何かを実行します。

8. Resourceを使用して、リソースの下にあるファイルのinputStreamを簡単に取得できます。

9.構成ファイルのキー/値は、@ PropertySourceから簡単に取得できます。

10.以前に少し印象に残った@Controller / @ RestController、@ Service、@ Respositoryなどは、実際にはいくつかのコンポーネントですが、特別な機能を持ついくつかのコンポーネントです。

毎日少し進歩して、さあ!次回は、Xiaobai(7)の初心者Web開発の簡単な要約を見ていきます-データベースHSQLDB

おすすめ

転載: blog.csdn.net/nihaomabmt/article/details/113859017