2. Spring 6 を始める

1. 環境要件

  • JDK: Java17+ (Spring6 では、最小 JDK バージョンが Java17 である必要があります)

  • メイブン:3.6+

  • スプリング:6.0.2

2. モジュールの構築

2.1 親モジュール spring6 をビルドする

「作成」をクリックします

 

2.2 サブモジュールをスプリングファーストでビルドする

 

「作成」をクリックして終了します。

3. プログラム開発

3.1 依存関係の導入

 

<dependencies>
    <!--spring context依赖-->
    <!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.11</version>
    </dependency>

    <!--junit5测试-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.1</version>
    </dependency>
</dependencies>

依存関係を表示します。

3.2 Javaクラスの作成

package com.jie.spring6;

/**
 * @author Administrator
 */
public class HelloWorld {

    public void sayHello() {
        System.out.println("helloworld");
    }
}

 

3.3 設定ファイルの作成

Spring 設定ファイル bean.xml をリソース ディレクトリに作成します (設定ファイルの名前は、spring.xml のように任意に付けることができます)。

 以前は、オブジェクトを作成する方法は次のとおりでした。

 HelloWorld helloWorld = new HelloWorld();

メソッドですが、オブジェクトを作成するプロセスを Spring で実装できるようになりました。

 

<?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">

    <!--
      配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理
      通过bean标签配置IOC容器所管理的bean
      属性:
          id:设置bean的唯一标识
          class:设置bean所对应类型的全类名
    -->
    <bean id="helloWorld" class="com.jie.spring6.HelloWorld"/>

</beans>

 3.4 テストクラスのテストを作成する

 

package com.jie.spring6;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author JIE
 * @version 1.0
 * @description: 测试类
 * @date 2023/8/30 9:20
 */
public class HelloWorldTest {

    @Test
    public void testHelloWorld() {
        // 创建一个ClassPathXmlApplicationContext对象,加载名为beans.xml的配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

        // 获取名为helloWorld的Bean
        HelloWorld helloworld = (HelloWorld) ac.getBean("helloWorld");

        // 调用sayHello方法
        helloworld.sayHello();
    }

}

3.5 テストプログラムを実行する

 

4. プログラムの分析

最初の質問: Spring の最下位層はどのようにしてオブジェクトを作成するのでしょうか? それはリフレクション メカニズムを通じてパラメーターなしのコンストラクターを呼び出しているのでしょうか?

まず HelloWorld クラスを変更します。

package com.jie.spring6;

/**
 * @author Administrator
 */
public class HelloWorld {

    public HelloWorld() {
        System.out.println("无参构造方法调用");
    }


    public void sayHello() {
        System.out.println("helloworld");
    }
}

 テスト結果を実行します。

テストの結果、オブジェクトの作成時にパラメーターなしのコンストラクターが実際に呼び出されたことが判明しました。

では、Spring はどのようにしてオブジェクトを作成するのでしょうか? 原理は何ですか?

テストクラスを開きます。

 

次に、bean.xml をクリックします。Spring は XML ファイルの内容をどのように解析するのでしょうか?

 

Bean タグには ID (一意の識別子) があり、class はクラスのフルパスです。

では、クラスの完全なパスを取得したら、次に何ができるでしょうか?

これは、リフレクションを使用してクラスのフルパスに基づいてオブジェクトを作成する 4 番目のステップです。
 

 Class clazz = Class.forName("com.jie.spring6.HelloWorld");
 //Object obj = clazz.newInstance();
 Object object = clazz.getDeclaredConstructor().newInstance();

次のステップは、オブジェクトを作成した後、オブジェクトはどこに保存されるかです。

Bean オブジェクトは最終的に Spring コンテナーに保存されます。Spring ソース コードの下部にはマップ コレクションがあり、Bean のマップは DefaultListableBeanFactory クラスに保存されます。

アイデアでシフトを2回押します。

 ポップアップ ウィンドウに「DefaultListableBeanFactory」と入力します。次に、DefaultListableBeanFactory.java を選択して DefaultListableBeanFactory クラスにジャンプします。このクラスには beanDefinitionMap プロパティがあります。

Spring コンテナが Bean クラスをロードすると、このクラスの説明情報が、パッケージ名にクラス名を加えた Map<String,BeanDefinition> の形式で beanDefinitionMap に格納されます。ここで、String はキーであり、デフォルトはクラス名の最初の文字が小文字の BeanDefinition 。格納されるのはクラスの定義 (説明情報) です。通常、BeanDefinition インターフェース、つまり Bean の定義オブジェクトと呼ばれます。

5. Log4j2 ロギング フレームワークを有効にする

5.1 Log4j2 ログの概要

プロジェクト開発においてログは非常に重要であり、稼働状況の記録やオンライン上の問題の発見など、ログの分析は切っても切れない関係にあります。

ログには、システム動作の時間、場所、ステータス、およびその他の関連情報が記録されます。これは、システムのステータスを理解して監視するのに役立ち、エラーが発生したり、危険な状態に近づいたときに、時間内に対処するよう思い出させてくれます。同時に、システムに問題が発生した場合に、問題を迅速に特定、診断、解決するのに役立ちます。

Apache Log4j2 は、広く使用されているオープン ソースのログ コンポーネントです。

このプロジェクトでは、System.out などの print ステートメントを使いやすく置き換えるもので、JAVA で最も人気のあるログ入力ツールです。

Log4j2 は主に、いくつかの重要なコンポーネントで構成されています。

  1. ログ情報の優先順位ログ情報の優先順位は高い順にTRACE < DEBUG < INFO < WARN < ERROR < FATALとなります。

    1. TRACE: 追跡は最も低いログ レベルであり、プログラムの実行の追跡と同等です。

    2. DEBUG: デバッグ。通常は開発中、最低のログ レベルに設定されます。

    3. INFO: 情報、重要な情報を出力、さらに使用

    4. WARN: 警告、警告情報を出力します

    5. ERROR: エラー、エラーメッセージを出力

    6. FATAL: 重大なエラー

  2. これらのレベルは、このログ情報の重要性を指定するために使用されます。高いレベルでは、低いレベルのログが自動的にシールドされます。つまり、WARN ログが設定されている場合、INFO および DEBUG ログ レベルのログは表示されません。

  3. ログ情報の出力先ログ情報の出力先では、ログをコンソールに出力するかファイルに出力するかを指定します。

  4. ログ情報の出力形式、および出力形式は、ログ情報の表示内容を制御します。

5.2 Log4j2 依存関係の導入

 <!--log4j2的依赖-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.20.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j2-impl</artifactId>
    <version>2.20.0</version>
</dependency>

 

5.3 ログ設定ファイルの追加

クラスのルート パスの下に log4j2.xml 構成ファイルを指定します (ファイル名は log4j2.xml に固定されており、ファイルはクラス ルート パスの下に配置する必要があります)。

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <loggers>
        <!--
            level指定日志级别,从低到高的优先级:
                TRACE < DEBUG < INFO < WARN < ERROR < FATAL
                trace:追踪,是最低的日志级别,相当于追踪程序的执行
                debug:调试,一般在开发中,都将其设置为最低的日志级别
                info:信息,输出重要的信息,使用较多
                warn:警告,输出警告的信息
                error:错误,输出错误信息
                fatal:严重错误
        -->
        <root level="DEBUG">
            <appender-ref ref="spring6log"/>
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="log"/>
        </root>
    </loggers>

    <appenders>
        <!--输出日志信息到控制台-->
        <console name="spring6log" target="SYSTEM_OUT">
            <!--控制日志输出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
        </console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
        <File name="log" fileName="F:/zuoMian/logs/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- 这个会打印出所有的信息,
            每次大小超过size,
            则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,
            作为存档-->
        <RollingFile name="RollingFile" fileName="F:/zuoMian/logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
            <!-- DefaultRolloverStrategy属性如不设置,
            则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>
</configuration>

このようなファイル コンテンツ形式はインターネット上に多数存在するため、直接検索してコピーして貼り付けることができます。

5.4 テスト

オリジナルのテストプログラムを実行する

 

オリジナルのテスト プログラムを実行し、Spring の印刷ログを追加します。

5.5 利用ログ
 

package com.jie.spring6;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Administrator
 */
public class HelloWorld {

    private Logger logger = LoggerFactory.getLogger(HelloWorldTest.class);

    public HelloWorld() {
        logger.info("无参构造方法调用");
    }


    public void sayHello() {
        logger.info("HelloWorld");
    }
}

 

おすすめ

転載: blog.csdn.net/weixin_53041251/article/details/132580777