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ファイル
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 Course 試験ユニット setXXX()方式 アプリケーションContext.xmlで構成するBean注入値 は全クラス名と同様に反射を用いてクラスオブジェクトを取得し,クラスオブジェクトによってオブジェクトを生成し,オブジェクトのsetXXXメソッドを呼び出してオブジェクトに値を付与する.(反射原理)上記コードは、 と簡単に理解できる.
コンストラクタ方式 P方式
注釈を使用した宣言トランザクションの実装 構築環境 spring-txトランザクション jdbc.JAr【データベース】 commons-dbcp.JAr接続プールからデータベース commons-pool.JAr接続プール spring-jdbc.JAr springのjdbc aopalliance.jar aop
メソッドの前に追加:
発展する
<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(依存注入)
依存注入の3つの方法
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 +
'}';
}
}
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);
}
}
<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>
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>
<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>
注釈を使用した宣言トランザクションの実装
@Transactional(readOnly = false,propagation = Propagation.REQUIRED)
ring-tx