Spring框架(二)Spring依賴注入DI、Bean作用域、Bean的自動裝配
依賴注入(Dependency Injection,DI)
依賴 : 指Bean物件的建立依賴於容器,Bean物件的依賴資源
注入 : 指Bean物件所依賴的資源,由容器來設定和裝配
構造器注入
構造器注入:https://www.cnblogs.com/luoxiao1104/p/14886712.html
set注入 (重點)
要求被注入的屬性 , 必須有set方法
一、建立實體類
package com.study.pojo; public class Address { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }
package com.study.pojo; import java.util.*; public class Student { private String name; private Address address; private String[] books; private List<String> hobbys; private Map<String, String> card; private Set<String> games; private String wife; public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public String[] getBooks() { return books; } public void setBooks(String[] books) { this.books = books; } public List<String> getHobbys() { return hobbys; } public void setHobbys(List<String> hobbys) { this.hobbys = hobbys; } public Map<String, String> getCard() { return card; } public void setCard(Map<String, String> card) { this.card = card; } public Set<String> getGames() { return games; } public void setGames(Set<String> games) { this.games = games; } public String getWife() { return wife; } public void setWife(String wife) { this.wife = wife; } public Properties getInfo() { return info; } public void setInfo(Properties info) { this.info = info; } private Properties info; @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", address=" + address.toString() + ", books=" + Arrays.toString(books) + ", hobbys=" + hobbys + ", card=" + card + ", games=" + games + ", wife='" + wife + '\'' + ", info=" + info + '}'; } }
1、常量注入
<bean id="student" class="com.study.pojo.Student">
<property name="name" value="小明"/>
</bean>
2、Bean注入
注意:物件是一個引用,ref
<bean id="addr" class="com.study.pojo.Address"> <property name="address" value="廣西"/> </bean> <bean id="student" class="com.sutdy.pojo.Student"> <property name="name" value="小明"/> <property name="address" ref="addr"/> </bean>
3、陣列注入
<bean id="student" class="com.study.pojo.Student">
<property name="name" value="小明"/>
<property name="address" ref="addr"/>
<property name="books">
<array>
<value>西遊記</value>
<value>紅樓夢</value>
<value>水滸傳</value>
</array>
</property>
</bean>
4、List注入
<property name="hobbys">
<list>
<value>聽歌</value>
<value>看電影</value>
<value>爬山</value>
</list>
</property>
5、Map注入
<property name="card">
<map>
<entry key="中國郵政" value="456456456465456"/>
<entry key="建設" value="1456682255511"/>
</map>
</property>
6、set注入
<property name="games">
<set>
<value>LOL</value>
<value>BOB</value>
<value>COC</value>
</set>
</property>
7、Null注入
<property name="wife"><null/></property>
8、Properties注入
<property name="info">
<props>
<prop key="學號">20190604</prop>
<prop key="性別">男</prop>
<prop key="姓名">小明</prop>
</props>
</property>
完整版
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--1、常量注入-->
<!--<bean id="student" class="com.study.pojo.Student">
<property name="name" value="小明"/>
</bean>-->
<!--2、bean注入-->
<bean id="address" class="com.study.pojo.Address">
<property name="address" value="廣西"/>
</bean>
<!--2、陣列注入-->
<bean id="student" class="com.study.pojo.Student">
<property name="name" value="張三"/>
<property name="address" ref="address"/>
<property name="books">
<array>
<value>紅樓夢</value>
<value>西遊記</value>
<value>水滸傳</value>
<value>三國演義</value>
</array>
</property>
<!--3、List注入-->
<property name="hobbys">
<list>
<value>唱</value>
<value>跳</value>
<value>rep</value>
<value>籃球</value>
</list>
</property>
<!--4、Map注入-->
<property name="card">
<map>
<entry key="身份證" value="123"/>
<entry key="學生證" value="456"/>
</map>
</property>
<!--3、Set注入-->
<property name="games">
<set>
<value>LOL</value>
<value>COC</value>
<value>BOB</value>
</set>
</property>
<!--3、null注入-->
<property name="wife">
<null/>
</property>
<!--3、Properties注入-->
<property name="info">
<props>
<prop key="學號">456</prop>
<prop key="username">張三</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
</beans>
二、編寫測試類
import com.study.pojo.Student;
import com.study.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = context.getBean("student", Student.class);
System.out.println(student.toString()
);
}
三、列印結果
拓展注入實現
一、編寫實體類: 【注意:這裡沒有有參構造器!】
package com.study.pojo;
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
二、編寫spring配置檔案【userbeans.xml】
1、P名稱空間注入 : 需要在標頭檔案中假如約束檔案
**匯入約束 : xmlns:p="http://www.springframework.org/schema/p"
<!--P(屬性: properties)名稱空間 , 屬性依然要設定set方法-->
<bean id="user" class="com.study.pojo.User" p:name="張三" p:age="18"/>
2、c 名稱空間注入 : 需要在標頭檔案中假如約束檔案
**匯入約束 : xmlns:c="http://www.springframework.org/schema/c"
<!--C(構造: Constructor)名稱空間 , 屬性依然要設定set方法-->
<bean id="user" class="com.study.pojo.User" c:name="李四" c:age="18"/>
三、編寫測試類
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
User user = context.getBean("user2", User.class);
System.out.println(user);
}
測試結果:
Bean的作用域
在Spring中,那些組成應用程式的主體及由Spring IoC容器所管理的物件,被稱之為bean。簡單地講,bean就是由IoC容器初始化、裝配及管理的物件.
類別 | 說明 |
---|---|
singleton | 在Spring IOC容器中僅存在一個Bean例項(單例),Bean以單例方式存在,預設值 |
prototype | 每次從容器中呼叫Bean時,都返回一個新的例項,即每次呼叫getBean時,相當於執行new XxxBean() |
request | 每次HTTP請求都會建立一個新的Bean,該作用域僅適用於WebApplicationContext環境 |
seesion | 同一個HTTP Session共享一個Bean,不同Session使用不同Bean,僅適用於WebAppcationContext環境 |
幾種作用域中,request、session作用域僅在基於web的應用中使用(不必關心你所採用的是什麼web應用框架),只能用在基於web的Spring ApplicationContext環境。
1、Singleton
當一個bean的作用域為Singleton,那麼Spring IoC容器中只會存在一個共享的bean例項(單例),並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一例項。
<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">
2、 Prototype
當一個bean的作用域為Prototype,表示一個bean定義對應多個物件例項。
<bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>
或者
<bean id="account" class="com.foo.DefaultAccount" singleton="false"/>
3、Request
當一個bean的作用域為Request,表示在一次HTTP請求中,一個bean定義對應一個例項;即每個HTTP請求都會有各自的bean例項,它們依據某個bean定義建立而成。
<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
4、Session
當一個bean的作用域為Session,表示在一個HTTP Session中,一個bean定義對應一個例項。
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
Bean的自動裝配
自動裝配是使用spring滿足bean依賴的一種方法
spring會在應用上下文中為某個bean尋找其依賴的bean。
Spring的自動裝配需要從兩個角度來實現,或者說是兩個操作:
- 元件掃描(component scanning):spring會自動發現應用上下文中所建立的bean;
- 自動裝配(autowiring):spring自動滿足bean之間的依賴,也就是我們說的IoC/DI;
推薦不使用自動裝配xml配置 , 而使用註解。
環境搭建
1、新建兩個實體類,Cat Dog 都有一個叫的方法
package com.study.pojo;
public class Cat {
public void shout(){
System.out.println("miao~");
}
}
package com.study.pojo;
public class Dog {
public void shout(){
System.out.println("wang~");
}
}
2、新建一個使用者類 User
package com.study.pojo;
public class People {
private Cat cat;
private Dog dog;
private String name;
}
3、 編寫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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dog" class="com.study.pojo.Dog"/>
<bean id="cat" class="com.study.pojo.Cat"/>
<bean id="user" class="com.study.pojo.User">
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
<property name="str" value="zhangsan"/>
</bean>
</beans>
4、測試
public class MyTest {
@Test
public void testMethodAutowire() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user");
user.getCat().shout();
user.getDog().shout();
}
}
5、列印結果
一、byName
autowire byName (按名稱自動裝配)
修改bean配置,增加一個屬性 autowire="byName"
<bean id="user" class="com.study.pojo.User" autowire="byName">
<property name="str" value="zhangsan"/>
</bean>
二、byType
autowire byType (按型別自動裝配)
將user的bean配置修改一下 : autowire="byType"
<bean id="user" class="com.kuang.pojo.User" autowire="byType">
<property name="str" value="qinjiang"/>
</bean>