目录直通车
1、 本文实验环境
2、 bean与bean之间相互访问
3、配置集合属性 List
4、 配置集合属性Map
5、 获取配置信息
6、 配置单例集合bean以供多个 bean 进行过引用
本文主要从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>