序文
最も人気のある Java 開発テクノロジとして、Spring は優れた内部ソース コード設計を備えています。
Java 開発者にとって Spring という言葉はよく知られているはずで、おそらく毎日 Spring を使用し、Spring エコシステムが提供するサービスを楽しんでいるかもしれません。現在、多くのインターネット企業は、採用面接において Spring を最も重要な知識ポイントの 1 つとみなしています。
Java プログラマが一流工場に入りたいなら、Spring をマスターする必要があると言っても過言ではありません。
記事の最後には特典もございますよ~
プログラマーになるのは難しいですが、2020 年にはプログラマーになるのはさらに難しくなります。IT 人材がますます増えているため、競争圧力も高まっています。群衆の中で目立ちたいと思うなら、私たちは実際に自分たちの能力を調査しています。技術スタックの広さと深さ。
春の面接全般における 3 つの哲学的な質問は何ですか? なぜ?使い方?
春は底で何を見ているでしょうか?以下は Spring の核となる知識ポイントの要約です。Spring をマスターするのに役立つことを願って、それを共有します。
まず Spring の知識ポイントのマインド マップを全員で共有します
1. Springフレームワークの機能概要の紹介
スリングコアコンテナ
モジュールの役割: コア モジュールと Beans モジュールはフレームワークの基本部分であり、IoC (制御の反転) および依存関係注入機能を提供します。ここでの基礎となる概念は BeanFactory です。BeanFactory は、プログラムによるシングルトン パターンの必要性を排除するファクトリー パターンの古典的な実装を提供し、依存関係と構成をプログラム ロジックから分離できるようにします。
1.コア
これには主に Spring フレームワークの基本的なコア ツール クラスが含まれています。Spring の他のコンポーネントはこのパッケージ内のクラスを使用する必要があります。Core モジュールは他のコンポーネントの基本的なコアです。
2. Beans (BeanFacotry の役割)
構成ファイルへのアクセス、Bean の作成と管理、制御の反転 | 依存関係の実行について説明します。
インジェクション ( IoC/DI ) 操作に関連するすべてのクラス
3.コンテキスト
BeanFactory の処理は依然として ApplicationContext の役割です。
このモジュールは Core モジュールと Beans モジュールに基づいて構築されており、JNDI レジストリに似たフレームワークのようなオブジェクト アクセス メソッドを提供します。Context モジュールは Bean の特性を継承し、Spring コアに多数の拡張機能を提供し、国際化 (リソース バインディングなど)、イベント伝播、リソースの読み込み、および Context の透過的な作成のサポートを追加します。Context モジュールは J2EE の一部の機能もサポートしており、ApplicationContext インターフェイスが Context モジュールのキーです。
本質的な違い: (BeanFacotry を使用する Bean は遅延ロードされますが、ApplicationContext は非遅延ロードされます)
4.表現言語
モジュールは、実行時にオブジェクトをクエリおよび操作するための強力な式言語を提供します。これは、JSP 2.1 仕様で定義された統一式言語の拡張です。この言語は、プロパティ値の設定/取得、プロパティの割り当て、メソッドの呼び出し、配列のコンテキストへのアクセス、コンテナとインデクサー、論理演算子と算術演算子、名前付き変数、および名前によるオブジェクトの取得をサポートしています。また、リストの投影、選択、および一般的なリストの集計もサポートします。
2 つ目は、Spring IOC コンテナの下部でアノテーションを使用することです。
XML 構成ファイルの形式 VS 構成クラスの形式
1. XMLを基にBean情報を定義する
<?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的信息 -->
<bean id="car" class="com.demo.compent.Car"></bean>
</beans>
コンテナに移動して Bean を読み取ります
public static void main( String[] args )
{
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
System.out.println(ctx.getBean("person"));
}
2. 構成クラスの読み込み形式に基づいてBean情報を定義する
@Configuration
public class MainConfig {
@Bean
public Person person(){
return new Person();
}
}
コンテナに移動してBean情報を読み取ります(構成クラスに渡します)。
public static void main( String[] args )
{
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println(ctx.getBean("person"));
}
3、Spring Iocコンテナのソースコード分析
コンテナ作成の準備作業
1. AnnotationConfigApplicationContext の作成は何をもたらしましたか?
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);
(1) コンストラクタを見てみる
>i1:org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext
i2>org.springframework.context.support.GenericApplicationContext#GenericApplicationContext() は親クラスのコンストラクターを呼び出します
i3>org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext() 独自の構築メソッド
i3.1>org.springframework.context.annotation.AnnotatedBeanDefinitionReader#AnnotatedBeanDefinitionReader は Bean 定義リーダーに値を割り当てます
i3.1.1>org.springframework.context.annotation.AnnotatedBeanDefinitionReader#getOrCreateEnvironment 環境を作成する
i3.2>org.springframework.context.annotation.ConditionEvaluator は条件付き計算オブジェクトを作成します
i3.2.1>this.registry = registry; 初期条件計算機の Bean 定義レジスタ
i3.2.2> this.beanFactory = deduceBeanFactory(registry); Bean ファクトリを初期化します
i3.2.3>this.environment = (environment != null ?environment : deduceEnvironment(registry)); 環境オブジェクトに値を割り当てます
i3.2.4>this.resourceLoader = (resourceLoader != null ? resourceLoader :deduceResourceLoader(registry)); リソース ローダーに値を割り当てます
i3.3> AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); コンテナ内の Bean 登録システムの情報を定義します
i4>: this.scanner = new ClassPathBeanDefinitionScanner(this); クラスパスの下に Bean 定義スキャナーを作成します。
i4.1>:org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#registerDefaultFilters 登録パッケージ スキャンのデフォルト ルール
i4.2>:org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#setEnvironment 設定環境
i4.3>org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#setResour リソースローダーを設定する
i5>org.springframework.context.annotation.AnnotatedBeanDefinitionReader#register ステップ i3.1 で生成された Bean 定義リーダーを使用して構成クラスを登録します
4. Spring は循環依存関係をどのように解決するか
循環依存関係とは何ですか?
いわゆる循環依存関係とは、A が B に依存し、B が A に依存する、または A が B に依存し、B が C に依存し、C が A に依存することです。
1. コード例:
//getter/setter
public class InstanceA {
private InstanceB instanceB;
}
public class InstanceB {
private InstanceA instanceA;
}
<bean id="instanceA" class="com.tuling.circulardependencies.InstanceA">
<property name="instanceB" ref="intanceB"></property>
</bean>
<bean id="intanceB" class="com.tuling.circulardependencies.InstanceB">
<property name="instanceA" ref="instanceA"></property>
</bean>
2. 考えられる問題:
IOC コンテナが Bean を作成するとき、まず、instanceA を順番にインスタンス化します。その後、突然、インスタンス A がインスタンス B に依存していることがわかりました。
次に、IOC コンテナはインスタンス B をインスタンス化し、インスタンス A がインスタンス B に依存していることを検出します。コンテナがこれを処理しない場合、IOC はメモリ例外プログラムがクラッシュするまで上記のプロセスを無期限に実行します。
3. 解決策:
もちろん、スプリングはそれを許しません。コンテナは、BeanB が beanA に依存していることを検出すると、BeanA オブジェクトの初期参照 (初期参照) を取得し、この初期参照を beanB に注入して、beanB が最初にインスタンス化を完了できるようにします。beanB がインスタンス化されると、beanA は beanB の参照を取得でき、それに応じて beanA がインスタンス化されます。「早期参照」の意味がわからないかもしれませんが、心配しないでください...
5、Spring Aopのソースコード分析
AOPのコアコンセプト
1. 横断的な懸念事項 (どの手法に切り込むか)
どの方法で傍受するか、傍受後にどのように対処するか、これらの懸念は横断的懸念と呼ばれます
2. アスペクト(アスペクト、ビジネスロジックコードの中に元々混入していた非ビジネスコードを抽出し、同じ関数をクラスに入れてアスペクトを形成する)
クラスはオブジェクトの特性を抽象化したもので、アスペクトは横断的な関心事を抽象化したものです。
3. Joinpoint(ジョインポイント)(カットインが必要な点)
インターセプトされたポイント (Spring はメソッド型の接続ポイントのみをサポートしているため、Spring では接続ポイントはインターセプトされたメソッドを参照します。実際、接続ポイントはフィールドまたはコンストラクターにすることもできます)
4. エントリーポイント(ポイントカット)
ジョインポイントでのインターセプトの定義
5. 通知(アドバイス)
いわゆる通知は、接続ポイントをインターセプトした後に実行されるコードを指し、事前通知、事後通知、例外通知、最終通知、およびサラウンド通知の 5 つのカテゴリに分類されます。
6. 対象者
プロキシターゲット
7. 織ります
ターゲット オブジェクトにアスペクトを適用し、その結果プロキシ オブジェクトが作成されるプロセス
8. はじめに
コードを変更せずに、導入により実行時にいくつかのメソッドまたはフィールドをクラスに動的に追加できます。
6、Springトランザクションのソースコード分析
事業コンセプト分析
1. 物とは何ですか?
トランザクションは、すべてを実行するか、まったく実行しない実行ユニットの論理セットです。
2. 物の特性(ACID)
アシッドとは何ですか?
ACID はデータベース管理システムを指します。DBMS トランザクションには 4 つの特徴があります。
例: データベース システムでは、トランザクションは、銀行振込、元の口座からの金額の差し引き、対象口座の金額の増額など、完全な論理プロセスを形成するための一連のデータベース操作で構成されます。
(1) アトミック性[原子性]
アトミック性とは、操作を分割できないことを意味し、2 つの操作は同時に完了するか、まったく完了しません。トランザクションが失敗した場合、トランザクションは何も起こらなかったかのようにロールバックされます。
(2) 一貫性【一貫性】
整合性も比較的理解しやすいです。つまり、データベースは常に整合性のある状態でなければなりません。トランザクションが開始される前は整合性のある状態であり、トランザクションが終了した後は別の整合性のある状態になります。トランザクションは、データベースを整合性のある状態から転送します。状態を別の一貫した状態に変更します。
(3) 隔離【隔離】
いわゆる独立性とは、同時トランザクションが互いに影響を与えないことを意味します。あるトランザクションがアクセスするデータが別のトランザクションによって変更されている場合、他のトランザクションがコミットされていない限り、アクセスするデータは影響を受けません。コミットされていないトランザクションによる影響。つまり、トランザクションがコミットされるまで、トランザクションの効果は他のトランザクションには表示されません。
(4) 耐久性[持続性]
トランザクションが送信された場合、トランザクションはデータベースに永続的に保存されます。
この Spring コア ナレッジ ポイントには合計 176 ページの PDF ドキュメントがあり、内容が多すぎて 1 つずつ表示できません。
公式アカウントに注目してください: Programmer Chasing the Wind、008 に返信して Spring のコア知識ポイントの概要を入手してください
やっと
みなさんも一緒にコミュニケーションをとってください♪記事が気に入っていただけましたら、ぜひフォローと「いいね!」をお願いいたします。