SpringのDIとIOCをどう理解しますか?

43309 ワード

Spring
発展する
  • 2002年Road Johnon発表
  • 2003年spring Aop Ioc(制御反転)【DI依存注入】
  • 現在:springmvc、spring data、springcloud、springbootなどのSpringファミリー
  • Springの初期化
  • 構築環境
  • springダウンロードURL
  • Springの開発に少なくとも必要なjarパッケージ
  • spring-core
  • spring-beans
  • spring-aop
  • spring-expression
  • spring-context
  • common-logging(サードパーティログ)
  • アプリケーション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.xsd">
       
    beans>
    

  • IoC(制御反転)とDI(依存注入)
  • IoC(inversion of Control,制御反転)
  • オブジェクトを取得するための一般的な方法はnew object()である.しかし、この方法の弊害は、オブジェクトを作成するたびにオブジェクトを作成する必要があることです.この方法は煩雑すぎて(結合を理解するために)、簡単な工場を導入し、取得するたびにgetObject()しか必要としない.
  • は、IoCを単純にスーパーファクトリとすることができ、オブジェクトを取得するたびにSpringコンテナにオブジェクトを入れ、getObject()を直接通過して取得するだけでよい.

  • DI(dependency injection,依存注入)
  • 以上の説明により、IoCとは何かを大まかに理解したが、理解には疑問が残っており、IoCのもう一つの解釈はDI(依存注入)である.
  • プロパティ値をプロパティに注入し、beanにプロパティを注入し、Springコンテナにbeanを注入します.オブジェクトの取得時にgetObject()で取得すればよい.

  • まとめ:IoCはDIと本質が同じで、呼び方が異なるだけで、IoCの記述があいまいであるため、DIという理解方式がある
  • .
    依存注入の3つの方法
  • 注入に依存して使用する底層原理は(反射)【反射はフレームワークの魂であり、反射を理解することは学習フレームワークに対して半分の仕事倍である】
  • 既存の2つのクラスStuentとCourseを容易に理解するために
  • Sudent
  • package cn.spring.bean;
    
    public class Student {
        private int stuNo;
        private String stuName;
        private int age;
    
        public Student() {
        }
    
        public Student(int stuNo, String stuName, int age) {
            this.stuNo = stuNo;
            this.stuName = stuName;
            this.age = age;
        }
    
        public int getStuNo() {
            return stuNo;
        }
    
        public void setStuNo(int stuNo) {
            this.stuNo = stuNo;
        }
    
        public String getStuName() {
            return stuName;
        }
    
        public void setStuName(String stuName) {
            this.stuName = stuName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "stuNo=" + stuNo +
                    ", stuName='" + stuName + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    
  • Course
  • package cn.spring.bean;
    
    public class Course {
        private String curName;
        private int curScore;
        private Student student;
    
        public Course() {
        }
    
        public Course(String curName, int curScore, Student student) {
            this.curName = curName;
            this.curScore = curScore;
            this.student = student;
        }
    
        public String getCurName() {
            return curName;
        }
    
        public void setCurName(String curName) {
            this.curName = curName;
        }
    
        public int getCurScore() {
            return curScore;
        }
    
        public void setCurScore(int curScore) {
            this.curScore = curScore;
        }
    
        public Student getStudent() {
            return student;
        }
    
        public void setStudent(Student student) {
            this.student = student;
        }
    
        @Override
        public String toString() {
            return "Course{" +
                    "curName='" + curName + '\'' +
                    ", curScore=" + curScore +
                    ", student=" + student +
                    '}';
        }
    }
    
    
  • 試験ユニット
  • package cn.spring.domain;
    
    import cn.spring.bean.Course;
    import cn.spring.bean.Student;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//  Ioc  
            Student student = (Student) context.getBean("student");//  Student
            System.out.println(student);
            Course course = (Course) context.getBean("course");//  Course
            System.out.println(course);
        }
    }
    
    
  • setXXX()方式
  • アプリケーションContext.xmlで構成するBean注入値
  • 
    <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="student" class="cn.spring.bean.Student">
            <property name="age" value="23"/>
            <property name="stuName" value="  "/>
            <property name="stuNo" value="1"/>
        bean>
        <bean id="course" class="cn.spring.bean.Course">
            <property name="curName" value="Spring"/>
            <property name="curScore" value="4"/>
            <property name="student" ref="student"/>
        bean>
    
    beans>
    
  • は全クラス名と同様に反射を用いてクラスオブジェクトを取得し,クラスオブジェクトによってオブジェクトを生成し,オブジェクトのsetXXXメソッドを呼び出してオブジェクトに値を付与する.(反射原理)上記コードは、
    Student student(id) = new Student();
    student.setAge(23);
    student.setStuName("  ");
    student.setStuNo("1");
    
  • と簡単に理解できる.
  • コンストラクタ方式
    
    <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="student" class="cn.spring.bean.Student">
            <constructor-arg name="stuNo" value="1"/>
            <constructor-arg name="stuName" value="zs"/>
            <constructor-arg name="age" value="23"/>
        bean>
        <bean id="course" class="cn.spring.bean.Course">
            <constructor-arg name="curName" value="Spring"/>
            <constructor-arg name="curScore" value="4"/>
            <constructor-arg name="student" ref="student"/>
        bean>
    
    beans>
    
  • P方式
    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p" 
           >
        
        <context:component-scan base-package="cn.spring.bean"/>
    
    beans>
    

    注釈を使用した宣言トランザクションの実装
  • 構築環境
  • spring-txトランザクション
  • jdbc.JAr【データベース】
  • commons-dbcp.JAr接続プールからデータベース
  • commons-pool.JAr接続プール
  • spring-jdbc.JAr springのjdbc
  • aopalliance.jar aop

  • メソッドの前に追加:
  •  @Transactional(readOnly = false,propagation = Propagation.REQUIRED)
    ring-tx