目錄直通車
本文主要從bean的配置由繁到簡。學習需要花費時間,這是筆者花費非常多的時間做出來的,靜下心來閱讀你會有大收穫!有問題歡迎留言!
1、 本文實驗環境
文件目錄
首先新建一個 TestConstructor 的bean。
public class TestConstructor {
/**
* 一個汽車的例子
*/
private String brand;
private String province;
private double price;
private int maxSpeed;
public TestConstructor(String brand, String province, double price) {
super();
this.brand = brand;
this.province = province;
this.price = price;
}
public TestConstructor(String brand, double price, int maxSpeed) {
super();
this.brand = brand;
this.price = price;
this.maxSpeed = maxSpeed;
}
@Override
public String toString() {
return "TestConstructor{" +
"brand='" + brand + '\'' +
", province='" + province + '\'' +
", price=" + price +
", maxSpeed=" + maxSpeed +
'}';
}
}
在 constructorContext.xml 中添加以下代碼對構造器注入
<!-- 構造器注入 -->
<bean id="testConstructor1" class="com.spring.beans.ConstructorInject.TestConstructor">
<constructor-arg name="brand" value="Audi"> </constructor-arg>
<constructor-arg name="province" value="Beijing"> </constructor-arg>
<constructor-arg name="price" value="300000" type="double"> </constructor-arg>
</bean>
<!-- 根據XML的語法,若需要帶符號需要加上<![CDATA[]]>,如:<![CDATA[<Shanghai>]]> -->
<bean id="testConstructor2" class="com.spring.beans.ConstructorInject.TestConstructor">
<constructor-arg name="brand" value="BaoMa" type="java.lang.String"> </constructor-arg>
<constructor-arg name="price" value="300000" type="double"> </constructor-arg>
<constructor-arg name="maxSpeed" value="200" type="int"> </constructor-arg>
</bean>
2、 bean與bean之間相互訪問
新建一個名爲Person的 bean
public class Person {
private String name;
private int age;
private TestConstructor car;
public Person() {
}
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 TestConstructor getCar() {
return car;
}
public void setCar(TestConstructor car) {
this.car = car;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", car=" + car +
'}';
}
}
組成應用程序的Bean 經常需要相互協作來完成應用程序的功能,所以要使得Bean能夠相互訪問,就必須在配置文件中指定對Bean的應用。通過ref元素爲bean的屬性或構造器參數指定對Bean的引用。有以下三種寫法:
1)
<property name="car" ref="testConstructor2"> </property>
2)
<property name="car">
<ref bean="testConstructor2"/>
</property>
3)內部bean(可給bean賦值),但不能用外部bean使用,只能內部使用。
<property name="car">
<bean class="com.spring.beans.ConstructorInject.TestConstructor">
<constructor-arg name="brand" value="Ford"> </constructor-arg>
<constructor-arg name="price" value="200000"> </constructor-arg>
<constructor-arg name="maxSpeed" value="200"> </constructor-arg>
</bean>
<!-- 將car賦值爲null,下面是null的轉悠標記 -->
<!--<null/>-->
</property>
3、配置集合屬性 List
新建一個名爲PersonList的bean
import java.util.List;
public class PersonList {
private String name;
private int age ;
private List<TestConstructor> car;
public PersonList() {
}
@Override
public String toString() {
return "PersonList{" +
"name='" + name + '\'' +
", age=" + age +
", 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 List<TestConstructor> getCar() {
return car;
}
public void setCar(List<TestConstructor> car) {
this.car = car;
}
}
在xml文件中配置上面剛剛添加的這個bean。
<bean id="personList" class="com.spring.beans.ConstructorInject.PersonList">
<property name="name" value="DJun"> </property>
<property name="age" value="22"> </property>
<property name="car">
<list>
<ref bean="testConstructor2"/>
<ref bean="testConstructor1"/>
</list>
</property>
</bean>
在Application執行類中添加代碼
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Application {
public static void main(String[] args) {
ApplicationContext applicationContext =new ClassPathXmlApplicationContext("com/spring/beans/ConstructorInject/ConstructorContext.xml");
Person person = (Person)applicationContext.getBean("person");
System.out.println("----- Person ------\n"+person);
PersonList personList = (PersonList) applicationContext.getBean("personList");
System.out.println("----- PersonList ------\n"+personList);
}
}
得到以下結果
4、 配置集合屬性Map
新建一個PersonMap
import java.util.Map;
public class PersonMap {
private String name;
private int age ;
private Map<String,TestConstructor> car;
public PersonMap() {
}
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 Map<String, TestConstructor> getCar() {
return car;
}
public void setCar(Map<String, TestConstructor> car) {
this.car = car;
}
@Override
public String toString() {
return "PersonMap{" +
"name='" + name + '\'' +
", age=" + age +
", car=" + car +
'}';
}
}
xml 添加如下代碼配置bean
<!-- 配置集合屬性 Map -->
<bean id="personMap" class="com.spring.beans.ConstructorInject.PersonMap">
<property name="name" value="DJun"> </property>
<property name="age" value="22"> </property>
<property name="car">
<map>
<entry key="AA" value-ref="testConstructor1"> </entry>
<entry key="BB" value-ref="testConstructor2"> </entry>
</map>
</property>
</bean>
在Application中添加
PersonMap personMap = (PersonMap) applicationContext.getBean("personMap");
System.out.println("----- PersonMap ------\n"+personMap);
5、 獲取配置信息
新建DataSource的bean
import java.util.Properties;
public class DataSource {
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public DataSource() {
}
@Override
public String toString() {
return "DataSource{" +
"properties=" + properties +
'}';
}
}
<!-- 通過props和prop 子節點來對properties來進行賦值 -->
<bean id="dataSource" class="com.spring.beans.ConstructorInject.DataSource">
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">root</prop>
<prop key="jdbcUrl"> jdbc:mysql://test</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
6、 配置單例集合bean以供多個 bean 進行過引用
其實運行完了上面的實例之後,發現每次都在使用testConstructor1和testConstructor2,單個bean使用的話,還沒有多大的感覺。但是如果像我上面那樣去寫就非常的臃腫。
請看下面這個解決方案:
在xml中添加以下內容
<util:list id="cars">
<ref bean="testConstructor1"/>
<ref bean="testConstructor2"/>
</util:list>
<bean id="singleList" class="com.spring.beans.ConstructorInject.PersonList">
<property name="name" value="DJun"/>
<property name="age" value="22"/>
<property name="car" ref="cars"/>
</bean>
<!-- 通過 p 爲bean 賦值 -->
<bean id="personP" class="com.spring.beans.ConstructorInject.Person"
p:name="DJun"
p:age="22"
p:car-ref="testConstructor1"/>
完整的Application代碼:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Application {
public static void main(String[] args) {
ApplicationContext applicationContext =new ClassPathXmlApplicationContext("com/spring/beans/ConstructorInject/ConstructorContext.xml");
Person person = (Person)applicationContext.getBean("person");
System.out.println("----- Person ------\n"+person);
PersonList personList = (PersonList) applicationContext.getBean("personList");
System.out.println("----- PersonList ------\n"+personList);
PersonMap personMap = (PersonMap) applicationContext.getBean("personMap");
System.out.println("----- PersonMap ------\n"+personMap);
DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
System.out.println("---------DataSource ----------\n "+dataSource);
PersonList personList1 = (PersonList) applicationContext.getBean("singleList");
System.out.println("------- PersonList -------\n" + personList1);
Person personP = (Person) applicationContext.getBean("personP");
System.out.println("------- personP -------\n" + personP);
}
}
完整的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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 構造器注入 -->
<bean id="testConstructor1" class="com.spring.beans.ConstructorInject.TestConstructor">
<constructor-arg name="brand" value="Audi"> </constructor-arg>
<constructor-arg name="province" value="Beijing"> </constructor-arg>
<constructor-arg name="price" value="300000" type="double"> </constructor-arg>
</bean>
<!-- 根據XML的語法,若需要帶符號需要加上<![CDATA[]]>,如:<![CDATA[<Shanghai>]]> -->
<bean id="testConstructor2" class="com.spring.beans.ConstructorInject.TestConstructor">
<constructor-arg name="brand" value="BaoMa" type="java.lang.String"> </constructor-arg>
<constructor-arg name="price" value="300000" type="double"> </constructor-arg>
<constructor-arg name="maxSpeed" value="200" type="int"> </constructor-arg>
</bean>
<!-- 屬性配置細節 -->
<bean id="person" class="com.spring.beans.ConstructorInject.Person">
<property name="name" value="DJun"> </property>
<property name="age" value="22"> </property>
<!--
組成應用程序的Bean 經常需要相互協作來完成應用程序的功能,
所以要使得Bean能夠相互訪問,就必須在配置文件中指定對Bean的應用。
通過ref元素爲bean的屬性或構造器參數指定對Bean的引用。
有以下三種寫法:
-->
<!-- 1. -->
<!--<property name="car" ref="testConstructor2"> </property>-->
<!-- 2. -->
<!--<property name="car">-->
<!--<ref bean="testConstructor2"/>-->
<!--</property>-->
<!-- 3.內部bean(可給bean賦值),但不能用外部bean使用,只能內部使用 -->
<property name="car">
<bean class="com.spring.beans.ConstructorInject.TestConstructor">
<constructor-arg name="brand" value="Ford"> </constructor-arg>
<constructor-arg name="price" value="200000"> </constructor-arg>
<constructor-arg name="maxSpeed" value="200"> </constructor-arg>
</bean>
<!-- 將car賦值爲null,下面是null的轉悠標記 -->
<!--<null/>-->
</property>
<!-- 級聯屬性 -->
<!--<property name="car.brand" value="300000"> </property>-->
</bean>
<!-- 配置集合屬性 List -->
<bean id="personList" class="com.spring.beans.ConstructorInject.PersonList">
<property name="name" value="DJun"> </property>
<property name="age" value="22"> </property>
<property name="car">
<list>
<ref bean="testConstructor2"/>
<ref bean="testConstructor1"/>
</list>
</property>
</bean>
<!-- 配置集合屬性 Map -->
<bean id="personMap" class="com.spring.beans.ConstructorInject.PersonMap">
<property name="name" value="DJun"> </property>
<property name="age" value="22"> </property>
<property name="car">
<map>
<entry key="AA" value-ref="testConstructor1"> </entry>
<entry key="BB" value-ref="testConstructor2"> </entry>
</map>
</property>
</bean>
<!-- 通過props和prop 子節點來對properties來進行賦值 -->
<bean id="dataSource" class="com.spring.beans.ConstructorInject.DataSource">
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">root</prop>
<prop key="jdbcUrl"> jdbc:mysql://test</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
<!--
配置單例集合bean,以供多個 bean 進行過引用
-->
<util:list id="cars">
<ref bean="testConstructor1"/>
<ref bean="testConstructor2"/>
</util:list>
<bean id="singleList" class="com.spring.beans.ConstructorInject.PersonList">
<property name="name" value="DJun"/>
<property name="age" value="22"/>
<property name="car" ref="cars"/>
</bean>
<!-- 通過 p 爲bean 賦值 -->
<bean id="personP" class="com.spring.beans.ConstructorInject.Person"
p:name="DJun"
p:age="22"
p:car-ref="testConstructor1"/>
</beans>