Spring依賴注入的兩種方式(根據例項詳解)
1,Set注入 2,構造注入
Set方法注入:
原理:通過類的setter方法完成依賴關係的設定
name屬性的取值依setter方法名而定,要求這個類裡面這個對應的屬性必須有setter方法。
Set方法注入時spring中配置檔案:
<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="car" class="org.spring01.Car">
<constructor-arg value="賓士"></constructor-arg>
<constructor-arg type="java.lang.String">
<value>土豪金</value>
</constructor-arg>
<constructor-arg value="高階轎車"></constructor-arg>
</bean>
<bean id="person" class="org.spring01.Person">
<property name="name" value="張三"></property>
<property name="age" value="11"></property>
<property name="car" ref="car"></property>
</bean>
</beans>
定義Car類:
package org.spring01;
public class Car {
private String name;//車名
private String color;//顏色
private String clas;//等級
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getClas() {
return clas;
}
public void setClas(String clas) {
this.clas = clas;
}
public Car(String name, String color, String clas) {
super();
this.name = name;
this.color = color;
this.clas = clas;
}
public Car() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Car [name=" + name + ", color=" + color + ", clas=" + clas
+ "]";
}
}
定義Person類:
package org.spring01;
public class Person {
private String name;//名字
private int age;//年齡
private Car car;//他的車
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public Person(String name, int age, Car car) {
super();
this.name = name;
this.age = age;
this.car = car;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
}
}
測試類:
package org.spring01;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest{
@Test
public void toGetPerson(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) context.getBean("person");
System.out.println(person);
}
@Test
public void toGetCar(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) context.getBean("car");
System.out.println(car);
}
}
使用單元測試(JUnit)測試toGetPerson()方法,結果為:
Person [name=張三, age=11, car=Car [name=賓士, color=土豪金, clas=高階轎車]]
構造方法注入:
原理:通過建構函式完成依賴關係的設定
構造注入指的是在接受注入的類中,定義一個構造方法,並在構造方法的引數中定義需要注入的元素,其中,index表示構造方法中的引數索引(第一個引數索引為0)。
構造方法注入時spring中配置檔案:
<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="car" class="org.spring02.Car">
<constructor-arg value="大眾"></constructor-arg>
<constructor-arg type="java.lang.String">
<value>白色</value>
</constructor-arg>
<constructor-arg value="中級轎車"></constructor-arg>
</bean>
<bean id="person" class="org.spring02.Person">
<constructor-arg index="0" value="李四"></constructor-arg>
<constructor-arg index="1" value="23"></constructor-arg>
<constructor-arg index="2" ref="car"></constructor-arg>
</bean>
</beans>
定義Car類:
package org.spring02;
public class Car {
private String name;//車名
private String color;//顏色
private String clas;//等級
public Car(String name, String color, String clas) {
super();
this.name = name;
this.color = color;
this.clas = clas;
}
public Car() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Car [name=" + name + ", color=" + color + ", clas=" + clas
+ "]";
}
}
定義Person類:
package org.spring02;
public class Person {
private String name;//名字
private int age;//年齡
private Car car;//他的車
public Person(String name, int age, Car car) {
super();
this.name = name;
this.age = age;
this.car = car;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
}
}
測試類:
package org.spring02;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest{
@Test
public void toGetPerson(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext01.xml");
Person person = (Person) context.getBean("person");
System.out.println(person);
}
@Test
public void toGetCar(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext01.xml");
Car car = (Car) context.getBean("car");
System.out.println(car);
}
}
使用單元測試(JUnit)測試toGetPerson()方法,結果為:
Person [name=李四, age=23, car=Car [name=大眾, color=白色, clas=中級轎車]]
上面的例子都採用了單元測試的方法檢測執行結果,需要導庫: JUnit
Demo的大體結構:
我們可以看到,set方法和構造方法都可以設值成功, 實際開發中最常用到的是set方法設值。但這兩種依賴注入的方式並沒有絕對的好壞,只是使用的場合不同。
使用構造注入可以在構建物件的同時完成依賴關係到的建立,所以如果要建立的物件的關係很多,使用構造注入會在構造方法上留下很多引數,可讀性極差,所以當物件的關係比較多的時候採用set方法注入。
使用set方法注入是通過類的setter方法完成依賴關係的設定的,所以不能保證相關的資料在執行時不被更改設定。所以如果想使一些資料變為只讀或者私有,就要採用構造注入了。
建議採用以set注入為主,構造注入為輔的注入策略。對於依賴關係無須變化的注入,儘量採用構造注入;而其他的依賴關係的注入,則考慮採用set注入。
相關文章
- SpringDI四種依賴注入方式詳解Spring依賴注入
- Spring的三種依賴注入的方式Spring依賴注入
- spring常用的三種依賴注入方式Spring依賴注入
- Spring的依賴注入的方式Spring依賴注入
- spring 詳細講解(ioc,依賴注入,aop)Spring依賴注入
- 從Hessian RPC 註解方式看Spring依賴注入RPCSpring依賴注入
- spring 的依賴注入Spring依賴注入
- Spring原始碼分析(二)bean的例項化和IOC依賴注入Spring原始碼Bean依賴注入
- 在 NgModule 裡透過依賴注入的方式註冊服務例項依賴注入
- Spring6框架中依賴注入的多種方式(推薦構造器注入)Spring框架依賴注入
- .NET控制檯獲取依賴注入例項依賴注入
- Spring 依賴注入 DISpring依賴注入
- Spring IOC——依賴注入Spring依賴注入
- Dependency Injection-依賴注入詳解依賴注入
- Angular 使用 Injector API 人工獲取依賴注入的例項AngularAPI依賴注入
- 依賴注入?依賴注入是如何實現解耦的?依賴注入解耦
- 詳解 Laravel 中的依賴注入和 IoCLaravel依賴注入
- Spring.Net 依賴注入Spring依賴注入
- Spring系列.依賴注入配置Spring依賴注入
- 大白話spring依賴注入Spring依賴注入
- ThinkPHP6 例項化 Http 類和依賴注入PHPHTTP依賴注入
- Gradle根據引數配置不同的依賴Gradle
- 如何用最簡單的方式解釋依賴注入?依賴注入是如何實現解耦的?(通俗易懂)依賴注入解耦
- Spring學習(三)依賴注入Spring依賴注入
- spring框架學習 依賴注入Spring框架依賴注入
- Spring 迴圈依賴的三種方式(三級快取解決Set迴圈依賴問題)Spring快取
- 設計模式例項講解 - 依賴倒置設計模式
- angularjs中控制檢視的控制器的兩種注入依賴項及服務的寫法AngularJS
- Spring原始碼解析——依賴注入(二)Spring原始碼依賴注入
- Spring 控制反轉和依賴注入Spring依賴注入
- 死磕Spring原始碼-依賴注入Spring原始碼依賴注入
- 一、.Net Core 依賴注入詳解及Autofac使用依賴注入
- 分散式定時器 Quartz 作業中注入 Spring 依賴項分散式定時器quartzSpring
- Spring學習:簡單實現一個依賴注入和迴圈依賴的解決Spring依賴注入
- Spring系列第八講 依賴注入之手動注入Spring依賴注入
- 詳解.NET依賴注入中物件的建立與“銷燬”依賴注入物件
- spring-boot-starter的依賴項Springboot
- Spring框架系列(8) - Spring IOC實現原理詳解之Bean例項化(生命週期,迴圈依賴等)Spring框架Bean
- 【半小時大話.net依賴注入】(下)詳解AutoFac+實戰Mvc、Api以及.NET Core的依賴注入依賴注入MVCAPI