IoC思想的實現:依賴注入(一)
阿新 • • 發佈:2020-08-15
IoC介紹:
IoC是什麼?
IoC控制反轉(Inversion of control):是一種理論思想。其實就是把物件的建立、賦值和管理交給容器來實現。
為什麼要使用IoC?
1、為了使用較少的程式碼來實現相應的功能
2、解耦合。
IoC的技術實現——依賴注入:在程式中,我們只需要使用物件的名稱就可以了,至於物件的建立、賦值都不需要我們管。spring中實現DI(依賴注入)的方式主要有兩種:
1、使用XML的方式來實現
2、使用註解的方式
首先:使用XML的方式進行依賴注入
步驟:
1、加spring依賴
2、建立類檔案
public class Student {private String name; private int age; public void setName(String name) { System.out.println("name: "+name); this.name = name; } public String getName() { return name; } public int getAge() { return age; } public void setAge(int age) { System.out.println("age:"+age); this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
3、建立spring的xml配置檔案。
<!-- 簡單型別:spring中規定java的基本資料類行和字串都是簡單型別。 第一種給物件賦值,set注入也叫設值注入:spring呼叫類的set方法,在set方法中對物件的屬性進行賦值。 1、簡單型別的set注入 <bean id = "" class= ""> <property name = "屬性的名字" value = "此屬性的值"/> 一個property只能給一個屬性賦值。 </bean> 設值注入先使用不帶引數的構造方法,然後呼叫set方法。有set方法就可以執行。 xml的規則是值必須放在引號之中。--> <bean id="myStudent" class="com.kunkun.spring.ba01.Student"> <property name="name" value="lisi"></property> <property name="age" value="20"></property> </bean> <bean id="myDate" class="java.util.Date"> <property name="time" value="923230123"></property> </bean>
4、使用ApplicationContext介面getBean方法來獲取配置在bean標籤中的物件。
@Test public void test(){ String config = "ba01/applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(config); Student student = (Student) ac.getBean("myStudent"); System.out.println(student.toString()); Date date = (Date) ac.getBean("myDate"); System.out.println(date); }
上面介紹的是使用set方法來建立物件(在類中必須要有相應的set方法)。我們同樣也可以使用構造放發來給屬性賦值:
只需要在上面的第三步中改成:
<bean id="myStudent" class="com.kunkun.spring.ba03.Student"> <constructor-arg name="name" value="李四lisi"></constructor-arg> <constructor-arg name="age" value="12"></constructor-arg> <constructor-arg name="school" ref="school"></constructor-arg> </bean> <bean id="school" class="com.kunkun.spring.ba03.School"> <property name="name" value="北京大學"></property> <property name="address" value="海淀區"></property> </bean>
上面的程式碼:其中標籤屬性ref表示引用型別的屬性賦值。ref的值為另一個bean的id。
引用型別的自動注入
兩個注入規則:byType和byName。
spring這個框架可以根據默寫規則給引用型別自動賦值。
使用的規則最常用的是byName和byType
1、byName:按名稱注入。java類中引用型別的屬性名,和bean中id的名稱一樣且資料型別是一致的,這樣的話,spring可以給屬性自動賦值。
語法:<bean id ="" class = "" autowire="byName">
簡單型別屬性賦值
</bean>
2、byType:按型別注入。java中資料類行和配置檔案中宣告的bean中的class屬性是同源關係,自動賦值。
同源的意思就是:
(1)、同一種類型
(2)、Java中是父類,bean是子類。
(3)、java中是介面,bean是介面的實現。
語法:<bean id ="" class = "" autowire="byType">
簡單型別屬性賦值
</bean>
1、byName:在bean標籤中加入一個autowire的標籤屬性來確定注入規則。其中school中的id必須和類中的屬性是相同的名字。
2、byType:spring容器會在容器中找到同源的物件(子類、實現類和同類)。如果物件重複,就會報錯。
多個配置檔案
優勢:每個配置檔案都不大,效率高,避免多人競爭一個配置檔案帶來的衝突。
上面的配置表示引入以Spring_開頭的所有檔案,和被註釋掉的程式碼一個意思。
關鍵字:classpath:表示類路徑,在IDEA中類路徑表示為tar/classes。