主方法中获取Bean实例:
1
|
Person person=(Person) ctx.getBean( "person" ); |
运行后输出:
1 |
Person [name=Tom, age= 23 , car=Car [brand=Audi, corp=上海, price= 500000.0 , maxSpeed= 0 ]] |
5.2 内部Bean
当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean。 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里,不需要设置任何 id 或 name 属性。内部 Bean 不能使用在任何其他地方。
同实现上面的功能,在XML中进行配置:
1 2 3 4 5 6 7 8 9 10 11 |
<bean id= "person1" class = "com.java.spring.Person" > <property name= "name" value= "Tom" ></property> <property name= "age" value= "23" ></property> <property name= "car" > <bean class = "com.java.spring.Car" > <constructor-arg value= "Audi" index= "0" ></constructor-arg> <constructor-arg value= "长春一汽" index= "1" ></constructor-arg> <constructor-arg value= "500000.0000" index= "2" ></constructor-arg> </bean> </property> </bean> |
6.级联属性赋值
和 Struts、Hiberante 等框架一样,Spring 支持级联属性的配置。
1 2 3 4 5 6 7 8 9 10 11 |
<bean id= "car" class = "com.java.spring.Car" > <constructor-arg value= "Audi" index= "0" ></constructor-arg> <constructor-arg value= "上海" index= "1" ></constructor-arg> <constructor-arg value= "500000.0000" index= "2" ></constructor-arg> </bean> <bean id= "person" class = "com.java.spring.Person" > <property name= "name" value= "Tom" ></property> <property name= "age" value= "23" ></property> <property name= "car" ref= "car" ></property> <property name= "car.price" value= "300000.0000" ></property> </bean> |
使用级联属性赋值的前提是car中的price必须有setPrice()方法。
运行后输出:
1 |
[name=Tom, age= 23 , car=Car [brand=Audi, corp=上海, price= 300000.0 , maxSpeed= 0 ]] |
7.集合属性的配置
在 Spring中可以通过一组内置的 xml 标签(例如: <list>, <set> 或 <map>) 来配置集合属性。
7.1 配置 java.util.List 类型的属性, 需要指定 <list> 标签, 在标签里包含一些元素。这些标签可以通过 <value> 指定简单的常量值,通过 <ref> 指定对其他 Bean 的引用。 通过<bean> 指定内置 Bean 定义。通过 <null/> 指定空元素。 甚至可以内嵌其他集合。数组的定义和 List 一样, 都使用 <list>。
示例代码:
Person.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package com.java.spring; import java.util.List; public class Person { private String name; private int age; private List<Car> cars; 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<Car> getCars() { return cars; } public void setCars(List<Car> cars) { this .cars = cars; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]" ; } } |
在xml中进行配置:
1 2 3 4 5 6 7 8 9 10 |
<bean id= "person" class = "com.java.spring.Person" > <property name= "name" value= "Tom" ></property> <property name= "age" value= "23" ></property> <property name= "cars" > <list> <ref bean= "car" /> <ref bean= "car2" /> </list> </property> </bean> |
在主方法中获取Bean实例:
1 |
Person person=(Person) ctx.getBean( "person" ); |
运行后输出:
1 |
Person [name=Tom, age= 23 , cars=[Car [brand=Audi, corp=上海, price= 500000.0 , maxSpeed= 0 ], <br>Car [brand=Audi, corp=长春一汽, price= 0.0 , maxSpeed= 240 ]]] |
7.2 配置 java.util.Set 需要使用 <set> 标签,定义元素的方法与 List 一样。
7.3 Java.util.Map 通过 <map> 标签定义,<map> 标签里可以使用多个 <entry> 作为子标签。每个条目包含一个键和一个值,必须在 <key> 标签里定义键。因为键和值的类型没有限制, 所以可以自由地为它们指定 <value>, <ref>, <bean> 或 <null> 元素。可以将 Map 的键和值作为 <entry> 的属性定义: 简单常量使用 key 和 value 来定义; Bean 引用通过 key-ref 和 value-ref 属性定义。
Person.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package com.java.spring; import java.util.Map; public class Person { private String name; private int age; private Map<String,Car> cars; 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,Car> getCars() { return cars; } public void setCars(Map<String,Car> cars) { this .cars = cars; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]" ; } } |
在xml中进行配置:
1 2 3 4 5 6 7 8 9 10 |
<bean id= "person" class = "com.java.spring.Person" > <property name= "name" value= "Tom" ></property> <property name= "age" value= "23" ></property> <property name= "cars" > <map> <entry key= "A" value-ref= "car" ></entry> <entry key= "B" value-ref= "car2" ></entry> </map> </property> </bean> |
在主方法中获取Bean实例:
1 |
Person person=(Person) ctx.getBean( "person" ); |
运行后输出:
1 |
Person [name=Tom, age= 23 , cars={A=Car [brand=Audi, corp=上海, price= 500000.0 , maxSpeed= 0 ],<br>B=Car [brand=Audi, corp=长春一汽, price= 0.0 , maxSpeed= 240 ]}] |
7.4 使用 <props> 定义 java.util.Properties, 该标签使用多个 <prop> 作为子标签。每个 <prop> 标签必须定义 key 属性。
DataSource.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.java.spring; import java.util.Properties; public class DataSource { private Properties properties; public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this .properties = properties; } @Override public String toString() { return "DataSource [properties=" + properties + "]" ; } } |
在xml中进行配置:
1 2 3 4 5 6 7 8 9 10 |
<bean id= "datasource" class = "com.java.spring.DataSource" > <property name= "properties" > <props> <prop key= "user" >root</prop> <prop key= "password" > 1234 </prop> <prop key= "jdbcUrl" >jdbc:mysql: ///test</prop> <prop key= "driverClass" >com.mysql.jdbc.Driver</prop> </props> </property> </bean> |
在主方法中获取Bean实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.java.spring; import java.util.Properties; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args){ //1.创建spring的IOC对象 ApplicationContext ctx= new ClassPathXmlApplicationContext( "applicationContext.xml" ); //2.从IOC容器中获取bean实例 DataSource datasource= (DataSource) ctx.getBean(DataSource. class ); System.out.println(datasource); } } |
运行后输出:
1 |
DataSource [properties={driverClass=com.mysql.jdbc.Driver, user=root, password= 1234 , jdbcUrl=jdbc:mysql: ///test}] |
8.使用 utility scheme 定义集合
使用基本的集合标签定义集合时, 不能将集合作为独立的 Bean 定义, 导致其他 Bean 无法引用该集合, 所以无法在不同 Bean 之间共享集合。解决这个问题的方法是使用 util schema 里的集合标签定义独立的集合 Bean. 需要注意的是, 必须在 <beans> 根元素里添加 util schema 定义。使用前需要先导入util命名空间