コンピューター開発の歴史を振り返ってみましょう。最初のコンピューターは面積 170 平方メートル、重さ 30 トンでしたが、今日のパーソナル ノートブックの開発プロセスは次のとおりです。 Enterprise JavaBean (Enterprise JavaBean、EJB) は、最初に作成されたときに非常に成功しましたが、時間の経過とともに、より便利でシンプルで軽量なテクノロジ フレームワークの実装が追求されるようになりました。そこで Spring が誕生し、Spring は他の分野にも継続的に関与してきました (ここでは詳しく説明しません)。Spring の本質には制御反転と依存性注入が含まれます。
制御反転 (IOC) についての簡単な説明
まず、制御という言葉を理解しましょう。つまり、「順方向」制御の場合、リクエスト関数を持つシステムでは、少なくとも 2 つのクラスが連携して動作します。あるエントリ クラスの下で new キーワードを使用して、別のクラスのオブジェクト インスタンスを作成します。これは、オブジェクト指向プログラミングの考え方に似ており、このエントリ クラスでは、「I」がエントリ クラスとして機能します。食事のたびに割り箸を使う(使うたびに新しい) この関係では、「私」(発信者)は毎回「率先して」割り箸を買わなければなりません(別のカテゴリ)。箸、こっちに来て、正直に私の手を握ってください。まあ、このような制御と前進の関係では、それは現実の生活では間違いなく非現実的です、そして人々は常により便利なアイデアを生み出します。より正確な方法は、普通の箸 (使い捨てではない) を購入し、それをコンテナ (Spring コンテナでは IOC と呼ばれます) に入れて、それを使用する必要があるときに、そのコンテナに「IOC を使いたい」と言うだけです。箸を使用する (コンテナにリクエストを送信する) と、箸があなたの手に「注入」されます。このプロセスでは、あなたはもはや制御当事者ではなく、代わりに要求者に進化します (それでも呼び出し元ではあります)。 )、コンテナに依存してリソースを提供し、制御はコンテナ上にあるため、これは一般に制御の反転と呼ばれるものです。
依存性注入の最初の紹介
上の例を続けると、制御の反転の統一の下で、箸がどのようにして私の手に渡ったのか (つまり、要求されたクラスをどのように取得したのか)、これが依存関係のプロセスです。注射の。
またIOCとDIの話をしましょう
ハリウッドのデザイン原則には「私たちを探すな、私たちがあなたを探す」とありますが、百度百科のこの点の説明は「電話しないでください」となっています。 「私たち、私たちはあなたに電話します(電話しないでください、私たちがあなたに電話します)」は有名なハリウッドの原則です。ハリウッドでは、俳優会社に履歴書を提出したら、家に帰って待つだけです。舞台芸術会社はエンターテインメントプロジェクト全体を完全に管理しているため、俳優は会社の仕事を受動的に受け入れ、必要なときにのみパフォーマンスを完了することができます。これは IOC に完全に反映されており、IOC が重視しているのは、オブジェクトを新規作成するという従来の方法から、IOC コンテナに「履歴書」を送信して受動的に IOC コンテナを待つという設計概念です。リソースを返します。制御の反転とは、「エンターテイメント会社が俳優をコントロールする」ことを指し、依存性に関して言えば、「俳優は自分たちのために働くために会社を必要とする」ということを意味します。プロセスは依存関係の注入です。本質的に、IOCとDIは同じ考えの下で異なる次元を表現したものです。
コード実装
制御の反転においてリソースを取得する処理を依存性注入と呼ぶため、ここでのコード実装も依存性注入に焦点を当てています。依存性注入には、構築注入、設定注入、インターフェイス注入の 3 つの方法があります。
1.インターフェイスインジェクション:インターフェイスに注入する情報を定義し、インターフェイスを介してインジェクションを完了します。 (Spring はこの注入方法をサポートしていません - サポートしない理由は - Spring は非侵襲的であり、「このフレームワークがなくても動作できる」と主張しています。インターフェイス注入が使用されている場合、この原則に違反します)。コード実装の説明はここで行います。
2.セッター注入
まず Spring から離脱してセッターインジェクションを実装します
public interface UserDao{ addUser(String username); }
public class UserDaoImpl implements UserDao{ @Override public void addUser(String username) { System.out.println("添加用户:"+username); } }
public class UserMessage{ private UserDao userDao; //使用设值方式赋值 public void setUserDao(UserDaoImpl userDao) { this.userDao = userDao; } @Override public void addUser(String userName, String password) { userDao.addUser(userName, password); } }
実際、ここでのアプローチは基本的に UserDao userDao=new UserDaoImpl() と同じであることに注意してください。ここではポリモーフィズム、つまり親クラスについて言及する必要があります。サブクラス メソッドを参照できるため、ここで形成される効果の 1 つは、User Message と UserDao の間の結合を減らすことです。もう一度考えてみると、読者はそれは間違っていると言うかもしれません。あなたが言及した制御の反転と依存関係の注入には、コンテナからのリソースの要求が必要です。このコンテナは Spring でどのように行われるかを説明しましょう。
<!-- 使用spring管理对象的创建,还有对象的依赖关系 --> <bean id="userManager" class="scau.zzf.service.UserMessage"> <!-- (1)UserMessageImpl使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理--> <!-- (2)在UserMessageImpl中提供构造函数,让spring将UserDao实现注入(DI)过来 --> <!-- (3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中 --> <property name="userDao" ref="UserDao"></property> <!-- 构造注入 --> <!-- <constructor-arg ref="userDao"/> --> </bean> <bean id="UserDao" class="scau.zzf.Dao.UserDao"> </bean>
まず、Bean をアセンブルする必要があります。つまり、Spring コンテナ内で Bean を構成し、Bean オブジェクトのインスタンスを返す必要があります。 XmlBeanFactory を通じて XML ファイルを読み取り、関連する Bean 情報を取得できます。
public class test { public static void main(String[] args) throws Exception { BeanFactory factory=new XmlBeanFactory(new FileSystemResource("src/appllication.xml")); UserMessage userMessage=(UserMessage)factory.getBean("UserMessage"); userMessage.add("德玛西亚"); } }
実際のアプリケーションでは、 の情報を手動で読み取ることはありませんが、もちろん、そのようなプロセスを理解することは必要です。
それでは、アノテーションによるインジェクションの実装方法を簡単に説明しましょう。
@Configuration public class UserConfig { @Bean public UserDao getUserDao(){ return new UserDao(); } @Bean public UserMessage getUserMessage(){ return new UserMesssgae(getUserDao); } }
@Configuration の機能は、クラス全体を構成クラスにすることです。@Bean アノテーションは、このアノテーションの下のメソッドがオブジェクトを返すことを Spring に伝え、このオブジェクトは Spring アプリケーション コンテキストをディメンション化した Bean を登録する必要があります。デフォルトでは、Spring の Bean はシングルトンです。つまり、上記の例では、getUserDao() を何度使用しても、返されるオブジェクトは最初から最後まで同じです。 JavaConfig の構成の詳細については、著者の別の記事「SSH をよりエレガントに構成する」を参照してください。