ディレクトリ
図9に示すように、制御の反転(IOC)、別名依存性注入ものです
10、たBeanFactoryとアプリケーションコンテキストの違いは何ですか?
13、シングルトンビーン春Frameworkは、スレッドセーフでありますか?
15、注釈アセンブリ(@Required注釈、@ Autowiredアノテーション、@修飾子アノテーション)
1、春原理構造
AOP技術
動的プロキシモードデザインモードで春AOP技術。実際の処理タスクによってオブジェクトのInvocationHandler引き継ぎプロキシすべての方法によって提供されるだけのInvocationHandler JDK動的プロキシインタフェース。
図9に示すように、制御の反転(IOC)、別名依存性注入ものです
春IOCに達成するための強力なJavaのリフレクションメカニズムを利用しています。すなわち、実行時にコンポーネント間の依存関係、いわゆる依存性注入は、コンテナによって決まります。前記注射依存二つの方法、コンストラクタによって注射、方法を注入することによってセットが存在します。
9. 春IOCコンテナとは何ですか?
春IOCのコンテナ管理Beanオブジェクトのライフサイクル全体。豆にその根底にあるのConcurrentHashMapを格納します。
10、たBeanFactoryとアプリケーションコンテキストの違いは何ですか?
たBeanFactory:
容器の単純な機能を提供するインターフェースの最低レベルであり、ばねは、オブジェクトのみとオブジェクト機能GETの例を提供します。
インスタンス化するために、豆を取る意志がある場合には、起動時にたBeanFactoryがコンテナから、ビーンインスタンス化に行くことはありません。
ApplicationContextの:
アプリケーション・コンテキスト、継承たBeanFactoryインタフェースは、春のより高度各容器であります
ApplicationContextのすべてのインスタンス化のすべての豆を入れて起動したとき。
具体的な実現(ClassPathXmlApplicationContext)
12、春には、いくつかの豆の範囲の解釈をサポートしています
Springフレームワークは、以下の5つのBeanのスコープをサポートしています。
-
シングルトン: 各容器IOCビーン唯一のインスタンス(デフォルト)春。
-
プロトタイプ: Bean定義は、複数のインスタンスを持つことができます。
-
要求は:すべてのHTTPリクエストがBeanを作成し、このスコープは、春のApplicationContextのWebベースの場合にのみ有効です。
-
セッション: HTTPセッション、Beanへの定義。春のApplicationContextのWebベースの場合のみ有効です。
-
グローバルセッション:グローバルHTTPセッション、Beanへの定義。春のApplicationContextのWebベースの場合のみ有効です。
13、シングルトンビーン春Frameworkは、スレッドセーフでありますか?
いいえ、春の豆フレームシングルトンスレッドセーフではありません。問題は、比較的安全でないスレッドが存在しない場合であるので、基本的にBeanは、存在していない動作を変更する、依存性注入を実施するために使用されます。
なぜBeanはシングルトンのですか?
初期化後にインスタンス化する場合にのみ、効率を向上させます。
これは、メモリのオーバーヘッドを削減します
14、豆のライフサイクル
オブジェクトの存続期間:(インスタンス化-初期化) -作成し使用する-破壊、春前といくつかの操作を行った後に、これらの三つのプロセス(インスタンス化、初期化、破壊)の開発を可能にする外部インタフェースの数を提供します。
春の豆では、インスタンス化は、(コンクリートがコンストラクタを呼び出すように理解することができる)、初期化が、(コンストラクタはまた、ステートメント属性を初期化する必要があり、プロパティ注射であるプロパティの初期化、あるBeanオブジェクトのためのスペースを開放することであるが、属していませんこの部分)、および注入がプロパティ設定メソッド(方法又は注釈Bean構成プロパティ属性の方法のいずれかによってプロパティに注入され、その本質は)プロパティ設定メソッドの実装によるものです。
15、注釈アセンブリ(@Required注釈、@ Autowiredアノテーション、@修飾子アノテーション)
@Required注:BeanはID(BYNAME)を指定し、組み立てられた注射
@Autowired注:自動組立のタイプ(byType)
@Qualifier注:@Autowiredノートで使用する、混乱の豆を避けるために
16、円形の依存関係を解決するための豆にスプリング
依存性注入はほとんどの注目は、循環依存が表示されます。
シーケンシャルビーン間の依存関係:BeanA - > BeanB - > BeanAの
例:
@Component
public class CircularDependencyA {
private CircularDependencyB circB;
@Autowired
public CircularDependencyA(CircularDependencyB circB) {
this.circB = circB;
}
}
@Component
public class CircularDependencyB {
private CircularDependencyA circA;
@Autowired
public CircularDependencyB(CircularDependencyA circA) {
this.circA = circA;
}
}
ファイル名を指定して実行SpringBootApplication:
@SpringBootApplication
@ComponentScan("com.example.circulardependency.constructor")
public class CirculardependencyApplication {
public static void main(String[] args) {
SpringApplication.run(CirculardependencyApplication.class, args);
}
}
エラー
BeanCurrentlyInCreationException: Error creating bean with name 'circularDependencyA': Requested bean is currently in creation: Is there an unresolvable circular reference?
ソリューション
循環依存関係は、あるため、設計上の問題が原因で発生最善のアプローチを再設計することです。
いくつかの救済策があるので、実際の開発では、多くの場合、ホイールが許可されていません再発明。
異なる注入とコンストラクタは、setter
必要に応じて注入し、従属オブジェクトのヌルを可能にされます。
@Component
public class CircularDependencyA {
private CircularDependencyB circB;
@Autowired
public void setCircB(CircularDependencyB circB) {
this.circB = circB;
}
public CircularDependencyB getCircB() {
return circB;
}
}
@Component
public class CircularDependencyB {
private CircularDependencyA circA;
private String message = "Hi!";
@Autowired
public void setCircA(CircularDependencyA circA) {
this.circA = circA;
}
public String getMessage() {
return message;
}
}
ユニットテストを追加します。
@RunWith(SpringRunner.class)
@SpringBootTest
@ComponentScan("com.example.circulardependency.setter")
public class CirculardependencyApplicationTests {
@Bean
public CircularDependencyB getDependencyB() {
return new CircularDependencyB();
}
@Bean
public CircularDependencyA getDependencyA() {
CircularDependencyA circularDependencyA = new CircularDependencyA();
circularDependencyA.setCircularDependencyB(getDependencyB());
return circularDependencyA;
}
@Test
public void contextLoads() {
System.out.println("Hello world.");
CircularDependencyA circularDependencyA = getDependencyA();
System.out.println(circularDependencyA.getCircularDependencyB().getMessage());
}
}
2. @Lazyコメント
@Lazy
遅延初期化。本実施形態では、CircularDependencyAは、最初のビルドが完了します後、その後、依存関係のサークルを壊し、CircularDependencyBを構築します。
@Component
public class CircularDependencyA {
private CircularDependencyB circB;
@Autowired
public CircularDependencyA(@Lazy CircularDependencyB circB) {
this.circB = circB;
}
}
3.使用ApplicationContextAware、InitializingBean
ローディングBeanのApplicationContextAware取得SpringContext; InitializingBeanはビーンプロパティを設定後の動作を定義します。
@Component
public class CircularDependencyA implements InitializingBean, ApplicationContextAware {
private CircularDependencyB circB;
private ApplicationContext context;
@Override
public void afterPropertiesSet() throws Exception {
this.circB = context.getBean(CircularDependencyB.class);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
public CircularDependencyB getCircularDependencyB() {
return circB;
}
}
原理:約とともにライフサイクルスプリングビーン:最初のインスタンス化され、次いで(setApplicationContextを呼び出す)、afterPropertiesSetは();従って、CircularDependencyBが完了した後にロードされて、その後CircularDependencyAを読み込みます。
CircularDependencyBがロードされていないが見つかり、ロードCircularDependencyBはまず、セットの特性circB、CircularDependencyAロードが、あれば完成する(CircularDependencyAがインスタンスこの時点で、それがスムーズに負荷することができるので、コンストラクタを呼び出す)CircularDependencyAインスタンス化コールafterPropertiesSetに()。
17、スプリングMVCフレームワーク
フロントおよびデータ処理要求の裏ページ