Spring IOC(DI)原理

4681 ワード

注:本文は個人の観点で、もし間違いがあれば訂正を歓迎します
名詞解析:
1.IOCは一種の「逆転制御」思想である
以前はプログラムでオブジェクトを作成する必要があったとき、私たち自身が手動でnewに出てきたので、とても面倒で、オブジェクト管理に不利でした.さらにコードは低結合(結合:ユニットコードの緊密さ、1つのユニットコードの変更が別のユニットコードに与える影響)にこだわり、ioc思想を採用し、オブジェクトの作成、メンテナンス、破棄の制御権利をspringコンテナに渡した.
2.DIは依存注入であり、IOCの重要な実現である
あるオブジェクトの作成は、Aオブジェクトのメンバー変数がBオブジェクトの参照を持つなど、別のオブジェクトの作成に関連する可能性があります.これは依存です.AはBに依存し、springコンテナはオブジェクトAを作成するときにオブジェクトBを作成し、オブジェクトBをオブジェクトAに注入します.
 
二例説明:
その原理を例として説明します.
1.springに必要なjarパッケージを先に導入し、mavenであればpomに直接導入する.xml構成、そうでなければjarパッケージを手動で追加
2.UserDaoのようなDAOレイヤインタフェースを作成します.
public interface userDao{
  void addUser();
}

3.UserDaoインタフェースを実現し、UserDaoImplを生成する:
public class UserDaoImpl implements UserDao{
    void addUser(){
        System.out.println("  DAO      -addUser       ");
     }  
}

4.UserServiceImplインプリメンテーションを作成するUserServicewインタフェース、抽象メソッドdo()を作成します.
public class UserServiceImpl implement UserService{
  //       
    private UserDao userDao;
    
 public void setUserDao(UserDao userDao){
   this.userDao=userDao;
   }
 public void do(){
   System.out.println("        ")
   userDao.addUser();
   }
}

5.xmlプロファイル:spring-ico.xml

    
    
    
    
    
          
          
    

6.テスト:
@Test
public void testByXml() throws Exception {
    //      
   ApplicationContext applicationContext=
newClassPathXmlApplicationContext("spring/spring-ioc.xml");
    UserService userService= (UserService) applicationContext.getBean("userService");
    userService.do();
}

7:実行結果:
        
  DAO      -addUser       

8.分析:
  • 最初のステップは、ファクトリオブジェクトを生成します.指定したパスの下でbeanプロファイルをロードした後、フレームワークから提供されるc l a s p a t h X m l ApplicationContext APIを使用してファクトリbeanを生成します.ClasspathXmlApplicationContextは、XML beanプロファイル内のすべてのbeanなど、すべてのオブジェクトの生成と初期化を担当します.
  • 第2のステップは、第1のステップで生成されたコンテキスト内のgetBean()メソッドを用いて必要なbeanを得る.このメソッドは、プロファイル内のbean名によって本物のオブジェクトを返します.このオブジェクトが得られると、このオブジェクトを使用して任意のメソッドを呼び出すことができます.

  •  
    三.Springコンテナの依存注入(xml構成と注記に基づく)
    注入依存には2つの方法があります.1つは手動アセンブリ(xml構成、注記(@Resourceデフォルトは名前で注入)@AutoWiredデフォルトはタイプで、名前で使用する場合は通常@Qualifierを組み合わせます))、もう1つは自動アセンブリ(自動アセンブリは名前、タイプ、構築方法の3つに分けられます)です.
    オブジェクト依存注入の4つの方法(xml構成):
    1.set注入
    
    
    
    
    

    2.構造方法注入
    
    
    
    
    
    

    3.スタティックファクトリメソッドとインスタンスファクトリ
    3.1 beanオブジェクト
    class User{
    private String name;
    private int age;
    
    public void setName(String name){
    this.name=name;
       }
    public void setAge(int age){
    this.age=age;
       }
    }
    

    3.2工場類:
    public  class Factory{
    public static User add(){
      User user=new User();
      user.setName=("  ");
      user.setAge(18);
    }
    
    public User add2(){
      User user=new User();
      user.setName=("  ");
      user.setAge(20);
    }
    }

     
    3.3 xmlは次のように構成されています.
    
    
    
    
    
    

     
    4 beanオブジェクト注記スキャンに基づく
    上記からspringコンテナはオブジェクトの作成を制御します.xmlプロファイルで作成するオブジェクトを明記しますが、オブジェクトの作成が特に多い場合は複雑になる可能性があります.注記を使用すると便利です:@Repository(DAO層の実装層を明記)、@Service(ビジネス層の実装層を明記)、@Controller(制御層)、@Component;最後にxmlプロファイルにパッケージスキャンを追加する必要があります.これは、これらの注釈が存在する場所をスキャンすることです.