您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Spring框架中如何使用IOC實現裝配Bean,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
IOC裝配Bean
(1)Spring框架Bean實例化的方式提供了三種方式實例化Bean
下面先寫這三種方法的applicationContext.xml配置文件:
<?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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Bean的三種實例化方式=================== --> <!-- 2.1 使用無參的構造器 --> <bean id="bean1" class="com.study.spring.b_instance.Bean1"></bean> <!-- 2.2使用靜態工廠方法 factory-method 是工廠提供的靜態方法 --> <bean id="bean2" class="com.study.spring.b_instance.Bean2" factory-method="createInstance"></bean> <!-- 2.3配置實例化工廠的方法 --> <bean id="bean3Factory" class="com.study.spring.b_instance.Bean3Factory"></bean> <bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"></bean> <!-- end.Bean的三種實例化方式==================== -->
Bean1類
public class Bean1 { //必須提供無參的構造函數 系統有默認無參的構造函數 }
Bean2類
public class Bean2 { private static Bean2 Bean2 = new Bean2(); private Bean2() { } public static Bean2 createInstance() { return Bean2; } }
Bean3類
public class Bean3 { }
Bean3Factory類
public class Bean3Factory { private Bean3Factory(){ } public Bean3 getInstance(){ return new Bean3(); } }
測試類InstanceDemo
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class InstanceDemo { //實例化工廠方法 @Test public void demo3(){ //加載配置文件 創建工廠 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean3 bean3 =(Bean3) applicationContext.getBean("bean3"); System.out.println(bean3); } //靜態工廠方法 @Test public void demo2(){ //加載配置文件 創建工廠 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean2 bean2 =(Bean2) applicationContext.getBean("bean2"); System.out.println(bean2); } //構造方法得到bean對象 @Test public void demo1(){ //加載配置文件 創建工廠 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean1 bean1 =(Bean1) applicationContext.getBean("bean1"); System.out.println(bean1); } } /* * 這三個都得到類似于com.study.spring.b_instance.Bean1@7229c204 的內存地址 */
(2).Bean的其他配置:
一般情況下,裝配一個Bean時,通過指定一個id屬性作為Bean的名稱
id 屬性在IoC容器中必須是唯一的
id 的命名要滿足XML對ID屬性命名規范 必須以字母開始,可以使用字母、數字、連字符、下劃線、句話、冒號
如果Bean的名稱中含有特殊字符,就需要使用name屬性 例如: <bean name="#person" class="cn.itcast.bean.Person"/>
因為name屬性可以相同,所以后出現Bean會覆蓋之前出現的同名的Bean
id和name的區別:
id遵守XML約束的id的約束.id約束保證這個屬性的值是唯一的,而且必須以字母開始,可以使用字母、數字、連字符、下劃線、句話、冒號
name沒有這些要求
如果bean標簽上沒有配置id,那么name可以作為id.
Bean的scope屬性
<!-- 3.Bean的scope屬性==================== --> <bean id="product" class="com.study.spring.c_scope.Product" scope="singleton"></bean> <!-- end.Bean的scope屬性=========== -->
* singleton :單例的.(默認的值.)
* prototype :多例的.
* request :web開發中.創建了一個對象,將這個對象存入request范圍,request.setAttribute();
* session :web開發中.創建了一個對象,將這個對象存入session范圍,session.setAttribute();
* globalSession :一般用于Porlet應用環境.指的是分布式開發.不是porlet環境,globalSession等同于session;
3.Bean屬性的依賴注入
前面已經知道如何獲得對象,那我們接下來要知道如果給對象對象的屬性賦值。
下面通過舉例說明:
Car 類
public class Car { private String name; private double price; public Car(String name, double price) { super(); this.name = name; this.price = price; } @Override public String toString() { return "Car [name=" + name + ", price=" + price + "]"; } }
Car2類
public class Car2 { private String name; private double price; public void setName(String name) { this.name = name; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Car2 [name=" + name + ", price=" + price + "]"; } }
CarInfo類
public class CarInfo { public String getName(){ return "哈弗H6"; } public double caculatePrice(){ return 110000; } }
CollectionBean類
import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class CollectionBean { private String name; private Integer age; private List<String> hobbies; private Set<Integer> numbers; private Map<String, String> map; private Properties properties; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public List<String> getHobbies() { return hobbies; } public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; } public Set<Integer> getNumbers() { return numbers; } public void setNumbers(Set<Integer> numbers) { this.numbers = numbers; } public Map<String, String> getMap() { return map; } public void setMap(Map<String, String> map) { this.map = map; } public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } @Override public String toString() { return "CollectionBean [name=" + name + ", age=" + age + ", hobbies=" + hobbies + ", numbers=" + numbers + ", map=" + map + ", properties=" + properties + "]"; } }
Employee類
public class Employee { private String name; private Car2 car2; public void setName(String name) { this.name = name; } public void setCar2(Car2 car2) { this.car2 = car2; } @Override public String toString() { return "Employee [name=" + name + ", car2=" + car2 + "]"; } }
TestDi測試類
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDi { @Test public void demo6() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean"); System.out.println(collectionBean); } @Test public void demo5() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Car2 car2 = (Car2) applicationContext.getBean("car2_2"); System.out.println(car2); } @Test public void demo4() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Employee e = (Employee) applicationContext.getBean("employee2"); System.out.println(e); } @Test public void demo3() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Employee e = (Employee) applicationContext.getBean("employee"); System.out.println(e); } @Test public void demo2() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Car2 car2 = (Car2) applicationContext.getBean("car2"); System.out.println(car2); } @Test public void demo1() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Car car = (Car) applicationContext.getBean("car"); System.out.println(car); } }
上面這幾個類都不是最主要的,我們主要是來看配置文件怎么寫,這才是最關鍵的:
applicationContext.xml
<?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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Bean的依賴注入=========== --> <!-- 4.1構造器注入 --> <bean id="car" class="com.study.spring.e_di.Car"> <!-- 方式一.根據索引的位置 --> <!-- <constructor-arg index="0" value="保時捷"></constructor-arg> <constructor-arg index="1" value="1500000"></constructor-arg> --> <!-- 方式二.根據名字配置 --> <!-- <constructor-arg name="name" value="寶馬"></constructor-arg> <constructor-arg name="price" value="500000"></constructor-arg> --> <!-- 方式三.根據類型配置 --> <constructor-arg type="java.lang.String" value="奔馳"></constructor-arg> <constructor-arg type="double" value="600000"></constructor-arg> </bean> <!-- 4.2setter方法中注入 --> <bean id="car2" class="com.study.spring.e_di.Car2"> <property name="name" value="雪佛蘭"></property> <property name="price" value="100000"></property> </bean> <bean id="employee" class="com.study.spring.e_di.Employee"> <property name="name" value="張三"></property> <property name="car2" ref="car2"></property> </bean> <!-- 引用p命名空間 --><!-- 如果要引用p命名,那在最上面sxd中就要配置 xmlns:p="http://www.springframework.org/schema/p"--> <bean id="car22" class="com.study.spring.e_di.Car2" p:name="寶馬" p:price="500000"> </bean> <bean id="employee2" class="com.study.spring.e_di.Employee" p:name="李四" p:car2-ref="car22"></bean> <!-- 引入spEL表達式 --> <bean id="carInfo" class="com.study.spring.e_di.CarInfo"></bean> <bean id="car2_2" class="com.study.spring.e_di.Car2"> <property name="name" value="#{carInfo.name}"></property> <property name="price" value="#{carInfo.caculatePrice()}"></property> </bean> <!-- 復雜屬性的依賴注入 --> <bean id="collectionBean" class="com.study.spring.e_di.CollectionBean"> <!-- 簡單屬性的注入 --> <property name="name" value="歸谷"></property> <property name="age" value="12"></property> <!-- 注入list集合 --> <property name="hobbies"> <list> <value>吃飯</value> <value>睡覺</value> <value>敲代碼</value> </list> </property> <!-- 注入set集合 --> <property name="numbers"> <set> <value>10</value> <value>20</value> <value>30</value> <value>40</value> <value>50</value> </set> </property> <!-- 注入map集合 --> <property name="map"> <map> <entry key="birthday" value="2017-1-1"></entry> <entry key="address" value="杭州西湖"></entry> <entry key="sex" value="female"></entry> </map> </property> <!-- 注入Properties --> <property name="properties"> <props> <prop key="compamy">杭州歸谷</prop> <prop key="pnum">200</prop> </props> </property> </bean> <!-- end Bean的依賴注入============ --> <import resource="classpath:bean1.xml"/> <import resource="classpath:bean2.xml"/> <!-- 這里導入是指如果在src下還有其它的beans.xml我們可以這樣去調用 --> </beans>
有關applicationContext.xml這個配置文件里的內容一定要看懂,我寫的還是比較基礎和全面的。
有關命名空間p的使用我這里在解釋下:
p:<屬性名>="xxx" 引入常量值
p:<屬性名>-ref="xxx" 引用其它Bean對象
看完上述內容,你們對Spring框架中如何使用IOC實現裝配Bean有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。