長い間、私はあなたの目を閉じて、それについて考える、これら2つの非常に漠然とした概念の制御と依存関係の反転を注入する必要があり、めまい感が常にあります。しかし、良いのJavaエンジニアになるために、私はそれらの完全に明確な週を過ごしました。
01、密結合
私たちのコーディング時には、通常、相互の協力により、ビジネスロジックを実装するために2つの以上のクラスを必要とする、つまり、オブジェクトが取得プロセスは、独自の実装を必要とする場合、参照オブジェクトで動作するように取得する必要があり、コードの結合が高くなり、それらを維持するためのコストは比較的高いです。
私たちは、模擬戦闘を通してそれを来ります。ファラオは少林寺ホストされている場合、彼は小さな2人の僧達磨病院を掃引したかった、コードを達成することができます。
次のようにコードの小さな2つのタイプがあります。
public class Xiaoer {
public void saodi() {
System.out.println("小二我在扫达摩院的地");
}
}
ファラオクラスコードは次のよう:
public class Laowang {
public void mingling() {
new Xiaoer().saodi();
}
}
試験クラスコードを次のように
public class Test {
public static void main(String[] args) {
Laowang laowang = new Laowang();
laowang.mingling();
}
}
新しいキーワードを使用して、オブジェクトXiaoerクラスの混入方法Laowangクラスを作成します - コードのような結合が高く、それらを維持するためのコストは、なぜあなたは言う、非常に高いのですか?
ある日、ダルマの家庭や汚れ、およびファラオが主宰が易筋経を実践するために、小さな2人の僧侶、小さな2人の僧侶と思うので、誰がそれを掃除しようとしている、ファラオと思う小さな3人の僧侶を主宰し、上のようにLaowangクラス私は、次の新しいコマンドを持っていたので、コードは次のようになります。
public class Xiaosan {
public void saodi() {
System.out.println("小三我在扫达摩院的地");
}
}
public class Laowang {
public void mingling() {
new Xiaoer().saodi();
}
public void mingling1() {
new Xiaosan().saodi();
}
}
主要な3人の僧侶が水を運ぶためにした場合、おそらくファラオに地面を掃引する小型四僧達磨の病院にコマンドを主宰。このレートでは、Laowangこのクラスは怒ってます。
ファラオはさらに、次のコマンドなどのトラブルを席巻し、僧侶が威厳を感じセッションを主宰し、彼は非常に不快に感じました。
02、制御の反転
私たちは、ファラオは、右主宰のための方法を見つける必要がありますか?
良いことのファラオヤングラオス側に、この用事を掃引するように、老僧はファラオのコマンドを実行するには、2人の小さな3つまたは4つの小さな僧侶や僧侶が主宰プチに責任があります。コードを達成することができます。
次のように掃引僧・インターフェース・コードを定義します。
public interface Heshang {
void saodi();
}
コードの小さな二つのタイプは次のように変更します。
public class Xiaoer implements Heshang {
@Override
public void saodi() {
System.out.println("小二我在扫达摩院的地");
}
public boolean isYijinjing() {
// 星期三的时候小二和尚要练易筋经
return false;
}
}
:次のように三つの小さなコードの変更
public class Xiaosan implements Heshang {
@Override
public void saodi() {
System.out.println("小三我在扫达摩院的地");
}
}
ラオス側のクラスコードは次のよう:
public class Laofang {
public static Heshang getSaodiseng() {
Xiaoer xiaoer = new Xiaoer();
if (xiaoer.isYijinjing()) {
return new Xiaosan();
}
return xiaoer;
}
}
古い確認小さな2人の僧侶は、主要3人の僧侶と呼ば易筋経を、練習している場合。
ファラオクラスコードは次のように変更します。
public class Laowang {
public void mingling() {
Laofang.getSaodiseng().saodi();
}
}
次のようにテストクラスコードは、変更されません。
public class Test {
public static void main(String[] args) {
Laowang laowang = new Laowang();
laowang.mingling();
}
}
パロは今だけの責任であることを彼のダルマヤングラオス側で病院を掃引すると呼ばれる彼の指揮の下で、より多くのを心配されていません。
私たちは、ファラオのために、このアプローチは、(IOCと略す制御の反転)制御の反転と呼ばれ、それは技術が、アイデアはないと思う - 私たちは疎結合番組ガイドを設計します。
単語の意味から、制御の反転は、「コントロール」と、それを制御するために来るとき、「逆」に分割することができ、制御対象とオブジェクトを識別するために必要であり、それが逆になると、私たちはどのようなフォワードはい知っている必要があります。
彼らは新しいキーワードでオブジェクト依存(またはわずか2小さな3人の僧侶は僧侶)を作成する必要があるときは、ファラオの指揮下、密結合の場合には、参照、および制御の反転後、パロは彼によって抜本的な僧侶を探してヤングラオス側が担当し、ラオス側へのコントロールの上には、それを反転しませんか?
03、依存性注入
依存性注入は、(依存性注入は、DIを略す)の反転の制御を達成するための主な方法がある:クラスAのインスタンスが依存するオブジェクトBの作成時に作成されて、注入された異なる属性の異なるオブジェクトの種類または名前によって決定されます。フォームの実現に関する特定の3つがあります。
1)ベースのコンストラクタ。新しいオブジェクトが依存オブジェクト型で渡されたときに、特定のコンストラクタのパラメータを達成。
ファラオクラスコードは次のように変更します。
public class Laowang {
private Heshang saodiseng;
public Laowang(Heshang saodiseng) {
this.saodiseng = saodiseng;
}
public void mingling() {
this.saodiseng.saodi();
}
}
試験クラスコード次のように変更します。
public class Test {
public static void main(String[] args) {
Laowang laowang = new Laowang(new Xiaosan());
laowang.mingling();
}
}
このとき、制御はテストクラスの手の中にある、それは少し2少し3人の僧侶がファラオの抜本的なコマンドを実行するために僧送信することを決定しました。
2)セット法に基づきます。外部容器は、着信オブジェクト型が依存呼び出すように、特定の特性を達成するパブリック設定方法。
ファラオクラスコードは次のように変更します。
public class Laowang {
private Heshang saodiseng;
public Heshang getSaodiseng() {
return saodiseng;
}
public void setSaodiseng(Heshang saodiseng) {
this.saodiseng = saodiseng;
}
public void mingling() {
this.getSaodiseng().saodi();
}
}
試験クラスコード次のように変更します。
public class Test {
public static void main(String[] args) {
Laowang laowang = new Laowang();
Xiaosan xiaosan = new Xiaosan();
laowang.setSaodiseng(xiaosan);
laowang.mingling();
}
}
このとき、制御はテストクラスの手の中に残っている、それはわずか2小さな3人の僧侶がファラオの抜本的なコマンドを実行するために僧送信することを決定しました。
3)インターフェイスに基づきます。外部容器の注入のための特定のインタフェースを実装するために、このスキップ場合、より多くのコンストラクタメソッドは、より複雑で設定されたオブジェクトの種類に依存します。
一部の人々は、注射を依存性制御と同等の反転しますが、実際に、彼らは根本的に異なるがあります:制御の反転はアイデアで、依存性の注入は、逆転を達成するための制御の一形態です。
04、春のフレームワーク
我々がコントロールと依存性注入の反転の概念を理解するとき、あなたは有名なSpringフレームワークを渡すことで見ることができます。制御の逆転は、全体コアSpringフレームワークです。セット(値によって)モードとコンストラクタメソッド(参考):春の依存性注入は、2つの方法で実施しました。
まず、我々は次のようにコードがある、のpom.xmlファイルに春の依存関係を追加する必要があります。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
第二に、我々は次のように変更されたクラスをLaowangます。
public class Laowang {
private Heshang saodiseng;
public Laowang(Heshang saodiseng) {
this.saodiseng = saodiseng;
}
public void mingling() {
this.saodiseng.saodi();
}
}
その後、我々は、このような何かをSpring構成ファイルapplication.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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="laowang" class="com.cmower.java_demo.ioc.Laowang">
<constructor-arg ref="saodiseng" />
</bean>
<bean id="saodiseng" class="com.cmower.java_demo.ioc.Xiaosan" />
</beans>
要素は二つのオブジェクトで構成されていることにより、パロはファラオがホストコンストラクタパラメータとして小型三人の僧侶の要素を使用して、小型三人の僧侶主宰しました。
準備が完了した後、我々は、例は以下の通りであるコードをテストする必要があります。
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Laowang laowang = (Laowang) context.getBean("laowang");
laowang.mingling();
}
}
あなたは私たちがのIoCフレームワーク春の制御を引き渡すだろう、参照、そのコードはまた、完璧な密結合は、問題を解決することができます。
最終的には05、
要約すると:
1)制御の反転は、実行時に第三者によって判断され、第三者に制御を与える、ソフトウェアエンジニアリングの思想にデカップリングされたオブジェクト呼び出しクラスに「注入」は、特定のオブジェクトに依存するであろう。
一の実施反転制御として2)依存性注入、オブジェクトに渡されるインスタンス変数。
クラスAが依存強結合関係クラスBが血管を通って、実行時に確立することができる3)のIoCフレームワークでは、そのクラスAは、ちょうど使用することができ、容器Bを作成するための作業の転送の例です。