詳解Spring框架---IOC裝配Bean
IOC裝配Bean
(1)Spring框架Bean實(shí)例化的方式提供了三種方式實(shí)例化Bean
- 構(gòu)造方法實(shí)例化(默認(rèn)無參數(shù),用的最多)
- 靜態(tài)工廠實(shí)例化
- 實(shí)例工廠實(shí)例化
下面先寫這三種方法的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的三種實(shí)例化方式=================== -->
<!-- 2.1 使用無參的構(gòu)造器 -->
<bean id="bean1" class="com.study.spring.b_instance.Bean1"></bean>
<!-- 2.2使用靜態(tài)工廠方法 factory-method 是工廠提供的靜態(tài)方法 -->
<bean id="bean2" class="com.study.spring.b_instance.Bean2" factory-method="createInstance"></bean>
<!-- 2.3配置實(shí)例化工廠的方法 -->
<bean id="bean3Factory" class="com.study.spring.b_instance.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"></bean>
<!-- end.Bean的三種實(shí)例化方式==================== -->
Bean1類
public class Bean1 {
//必須提供無參的構(gòu)造函數(shù) 系統(tǒng)有默認(rèn)無參的構(gòu)造函數(shù)
}
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();
}
}
測(cè)試類InstanceDemo
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InstanceDemo {
//實(shí)例化工廠方法
@Test
public void demo3(){
//加載配置文件 創(chuàng)建工廠
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Bean3 bean3 =(Bean3) applicationContext.getBean("bean3");
System.out.println(bean3);
}
//靜態(tài)工廠方法
@Test
public void demo2(){
//加載配置文件 創(chuàng)建工廠
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Bean2 bean2 =(Bean2) applicationContext.getBean("bean2");
System.out.println(bean2);
}
//構(gòu)造方法得到bean對(duì)象
@Test
public void demo1(){
//加載配置文件 創(chuàng)建工廠
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Bean1 bean1 =(Bean1) applicationContext.getBean("bean1");
System.out.println(bean1);
}
}
/*
* 這三個(gè)都得到類似于com.study.spring.b_instance.Bean1@7229c204 的內(nèi)存地址
*/
(2).Bean的其他配置:
一般情況下,裝配一個(gè)Bean時(shí),通過指定一個(gè)id屬性作為Bean的名稱
id 屬性在IoC容器中必須是唯一的
id 的命名要滿足XML對(duì)ID屬性命名規(guī)范 必須以字母開始,可以使用字母、數(shù)字、連字符、下劃線、句話、冒號(hào)
如果Bean的名稱中含有特殊字符,就需要使用name屬性 例如: <bean name="#person" class="cn.itcast.bean.Person"/>
因?yàn)閚ame屬性可以相同,所以后出現(xiàn)Bean會(huì)覆蓋之前出現(xiàn)的同名的Bean
id和name的區(qū)別:
id遵守XML約束的id的約束.id約束保證這個(gè)屬性的值是唯一的,而且必須以字母開始,可以使用字母、數(shù)字、連字符、下劃線、句話、冒號(hào)
name沒有這些要求
如果bean標(biāo)簽上沒有配置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 :單例的.(默認(rèn)的值.)
* prototype :多例的.
* request :web開發(fā)中.創(chuàng)建了一個(gè)對(duì)象,將這個(gè)對(duì)象存入request范圍,request.setAttribute();
* session :web開發(fā)中.創(chuàng)建了一個(gè)對(duì)象,將這個(gè)對(duì)象存入session范圍,session.setAttribute();
* globalSession :一般用于Porlet應(yīng)用環(huán)境.指的是分布式開發(fā).不是porlet環(huán)境,globalSession等同于session;
3.Bean屬性的依賴注入
前面已經(jīng)知道如何獲得對(duì)象,那我們接下來要知道如果給對(duì)象對(duì)象的屬性賦值。

下面通過舉例說明:
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測(cè)試類
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);
}
}
上面這幾個(gè)類都不是最主要的,我們主要是來看配置文件怎么寫,這才是最關(guān)鍵的:
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構(gòu)造器注入 -->
<bean id="car" class="com.study.spring.e_di.Car">
<!-- 方式一.根據(jù)索引的位置 -->
<!-- <constructor-arg index="0" value="保時(shí)捷"></constructor-arg>
<constructor-arg index="1" value="1500000"></constructor-arg> -->
<!-- 方式二.根據(jù)名字配置 -->
<!-- <constructor-arg name="name" value="寶馬"></constructor-arg>
<constructor-arg name="price" value="500000"></constructor-arg> -->
<!-- 方式三.根據(jù)類型配置 -->
<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表達(dá)式 -->
<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>
<!-- 復(fù)雜屬性的依賴注入 -->
<bean id="collectionBean" class="com.study.spring.e_di.CollectionBean">
<!-- 簡(jiǎn)單屬性的注入 -->
<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"/>
<!-- 這里導(dǎo)入是指如果在src下還有其它的beans.xml我們可以這樣去調(diào)用 -->
</beans>
有關(guān)applicationContext.xml這個(gè)配置文件里的內(nèi)容一定要看懂,我寫的還是比較基礎(chǔ)和全面的。
有關(guān)命名空間p的使用我這里在解釋下:
p:<屬性名>="xxx" 引入常量值
p:<屬性名>-ref="xxx" 引用其它Bean對(duì)象
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入理解Java設(shè)計(jì)模式之職責(zé)鏈模式
這篇文章主要介紹了JAVA設(shè)計(jì)模式之職責(zé)鏈模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解2021-11-11
解決Springboot get請(qǐng)求是參數(shù)過長的情況
這篇文章主要介紹了解決Springboot get請(qǐng)求是參數(shù)過長的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Spring運(yùn)行環(huán)境Environment的解析
本文主要介紹了Spring運(yùn)行環(huán)境Environment的解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
使用Sentinel滑動(dòng)窗口實(shí)現(xiàn)限流和降級(jí)
Sentinel 是一個(gè)開源的高可用性、高擴(kuò)展性的實(shí)時(shí)流量控制框架,它可以用于保護(hù)服務(wù)穩(wěn)定性,防止系統(tǒng)因?yàn)榱髁窟^大而崩潰,這篇文章我們所介紹的是滑動(dòng)窗口,它是 Sentinel 實(shí)現(xiàn)限流和降級(jí)的重要組件之一,感興趣的同學(xué)跟著小編來看看吧2023-09-09
idea?intellij快速修復(fù)if語句缺少大括號(hào)的問題
這篇文章主要介紹了idea?intellij快速修復(fù)if語句缺少大括號(hào)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java基礎(chǔ)之重載(Overload)與重寫(Override)詳解
這篇文章主要介紹了Java基礎(chǔ)之重載(Overload)與重寫(Override)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04

