Spring学習(一)ioc理解

8796 ワード

Springについて知っていることはすべて知っているべきで、springは終始の2つの重要な思想を貫いて、1つはIOC(制御反転)、1つはDI(依存注入)で、初心者にとって、この2つの概念は比較的に理解しにくいので、私は自分の考えで説明します.
まず,プログラム開発においてspringフレームワークがなぜ使用されるのかを知る.
ここではまず2つの概念を導入する:結合性、侵入性.簡単に言えば、結合性はjavaの中でクラス間の関係として表現され、結合性が強いのはクラス間の依存関係が強いことを示している.侵入性:フレームワークのコードへの侵入、例えばあなたのプロジェクトはstruts 1を使って、フレームワークを変更する時に変更するものが多すぎることを発見して、例えばactionFormなど、struts 1のコードへの侵入性はとても高いです.従来のjava開発では高い結合性と侵入型を有する.1つのプロジェクトでは、一般的に1つのクラスが他の多くのクラスに依存して自分の操作を完了しなければならない.私たちはnewというクラスのオブジェクトを採用して彼の方法を呼び出すことが多い.このようにして、2つのクラスの依存関係が強すぎて、1つの場所を変えて、多くのクラスが大量のコードを巻き込むことが多い.侵入性の前段の例は分かる.もちろんEJBは結合性と侵入性の問題も解決できるが,ejbはサーバに依存しすぎてヘビー級のフレームワークに属する.このような背景の下で、springは運に応じて生まれ、軽量級の枠組みで、伝統的な企業開発の複雑さを解決したと言える.EJBテクノロジーの代わりに通常のjavaBeanを使用します.オブジェクトとオブジェクトの依存関係を管理することができ、私たちは自分でオブジェクトを構築する必要はありません.この仕事をすべてコンテナに渡して完成し、低い結合を持っていて、コードに侵略性がなく、サーバーに依存性の特徴のあるフレームワークがありません.この容器、すなわちIOC.
IOCの考えをどう理解するか.
とても流行している例で、私は言い方を変えて、このようにもっと理解します:彼女を探すように、普通の方法は私达が各种の関系に頼ってこの彼女(newの相手に相当します)を探し当てて、ある日别れて、以前のあれらの関系もなくて、新しい彼女を探し当てるために新しい関系に依存します(新たにnewの別の相手)では、この過程が面倒だと想像できます.そこで、新しい方法で相手を探すことができます.結婚相談所です.ここが私たちが言っているIOC方式です.あなたが要求した相手の特徴を結婚相談所に教えてください.彼は直接あなたに相手を見つけます.複雑な過程がなければ、あなたは付き合うことだけでいいです.newの過程は気にしないで、気にしないでください.どんな依存関係が必要でも、いつか交換して、必要な相手を結婚相談所に提出すればいいので、新しい相手を手に入れることができます.実際,ioc方式を用いてオブジェクトを作成する目的は,オブジェクト間の依存関係を「受動的」に形成するためである.従来の開発では、newでも通常の工場でも、ターゲットオブジェクトが必要な依存オブジェクトを自発的に作成し、積極的に検索する必要があり、ターゲットオブジェクトは不要な非ビジネスロジックに精力を分散させます.IOCは、DI(依存注入)を通じて設立された対象を対象に注入する.
Spring IOCは具体的にどのように実現しますか?
上記の結婚仲介所はioc管理オブジェクトのコンテナであり、実際にはxmlファイルであり、オブジェクトをxmlに配置しspringのファクトリクラスで解析し、「反射」でオブジェクトを作成する.Spring IOCコンテナのポイント:*管理されているオブジェクトをspringプロファイルに定義する必要があります*コンストラクション関数またはsetterメソッドを定義し、springがオブジェクトを注入するようにする必要があります.spring iocの実装は、以下の例で理解できます.この例ではspring 3.21を用いる.アプリケーションContextの構成xml
<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-3.2.xsd">
    <bean id="userDao4MySqlImpl" class="com.bjsxt.spring.dao.UserDao4MySqlImpl"/>
    <bean id="userDao4OracleImpl" class="com.bjsxt.spring.dao.UserDao4OracleImpl"/>
    <bean id="userManager" class="com.bjsxt.spring.manager.UserManagerImpl">
        <!--        <constructor-arg ref="userDao4OracleImpl"/> -->
         <!-- setter     -->
         <property name="userDao" ref="userDao4OracleImpl"/>
    </bean>
</beans>

2.注入されたクラス:
package com.bjsxt.spring.dao;

public interface UserDao {

    public void save(String username, String password);
}
package com.bjsxt.spring.dao;

public class UserDao4MySqlImpl implements UserDao {

    public void save(String username, String password) {
        System.out.println("--------UserDao4MySqlImpl.save()-------");
    }
}
package com.bjsxt.spring.dao;

public class UserDao4OracleImpl implements UserDao {

    public void save(String username, String password) {
        System.out.println("--------UserDao4OracleImpl.save()-------");
    }
}

3.注入されたクラス:
package com.bjsxt.spring.manager;

public interface UserManager {
    public void save(String username, String password);
}
package com.bjsxt.spring.manager;

import com.bjsxt.spring.dao.UserDao;

public class UserManagerImpl implements UserManager {
    /** *     :            ,       , *         settet  。 * */
    private UserDao userDao;

/* public UserManagerImpl(UserDao userDao) { this.userDao = userDao; } */

    public void save(String username, String password) {
        this.userDao.save(username, password);
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

4.テストクラス:
package com.bjsxt.spring.client;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bjsxt.spring.manager.UserManager;

public class Client {

    public static void main(String[] args) {
/*      new           * UserManager userManager = new UserManagerImpl(new UserDao4OracleImpl()); UserManager userManager = new UserManagerImpl(new UserDao4MySqlImpl()); userManager.save("  ", "123");*/
/** * IOC          xml  , “  ”       : */
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserManager userManager = (UserManager)factory.getBean("userManager");
        userManager.save("  ", "123");
/** * IOC          ,        setter          : */
// UserManagerImpl userManager = new UserManagerImpl();
// userManager.setUserDao(new UserDao4MySqlImpl());
// userManager.save("  ", "123");
    }
}

これでspring ioc思想が実現した.本文は完全に個人的に理解しており、間違ったところがあれば、指摘してください.