- 浏览: 31694 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
9976:
我是初学者,讲得挺详细深入的,对spring容器有点理解了。
剖析Spring容器的作用及实现方式 -
youjianbo_han_87:
我设置了 user-agent也被挡掉了。。。parser ...
设置User-Agent,防止自己的爬虫被拦截
Spring主要有两种注入方式:Setter注入和构造器注入。
使用Setter注入,可以注入很多类型。
(1) 注入基本类型:
可以使用Setter注入基本类型,如int、boolean等等,同时他们对应的封装类型,如Integer、Boolean等类型。
Company类定义如下:
package org.shirdrn.entity;
public class Company {
private int id;
private String name;
private Boolean chinese;
public Boolean getChinese() {
return chinese;
}
public void setChinese(Boolean chinese) {
this.chinese = chinese;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
对应的XML配置applicationContext.xml内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="companyBean" class="org.shirdrn.entity.Company"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="id">
<value>2008</value>
</property>
<property name="name">
<value>CNAET</value>
</property>
<property name="chinese">
<value>true</value>
</property>
</bean>
</beans>
测试的程序代码如下:
package org.shirdrn.main;
import org.shirdrn.entity.Company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
System.out.println("id = "+c.getId());
System.out.println("name = "+c.getName());
System.out.println("isChinese = "+c.getChinese());
}
}
测试输出结果如下所示:
id = 2008
name = CNAET
isChinese = true
(2) 注入引用类型
在Company类中添加一个属性,公司的CEO:
private Person CEO;
并且添加它的Setter和Getter方法。
Person类如下所示:
package org.shirdrn.entity;
public class Person {
private Integer id;
private String name;
private Integer age;
private String email;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
对应的XML文件applicationContext.xml配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="person" class="org.shirdrn.entity.Person" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>1001</value>
</property>
<property name="name">
<value>Shirdrn</value>
</property>
<property name="age">
<value>26</value>
</property>
<property name="email">
<value>shirdrn@hotmail.com</value>
</property>
</bean>
<bean id="companyBean" class="org.shirdrn.entity.Company"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="id">
<value>2008</value>
</property>
<property name="name">
<value>CNAET</value>
</property>
<property name="chinese">
<value>true</value>
</property>
<property name="CEO">
<ref bean="person" />
</property>
</bean>
</beans>
第一个bean元素配置person,第二个bean配置了companyBean,公司的详情,其中CEO引用了第一个bean,表示一个人的详细信息,关键的配置在于:
<property name="CEO">
<ref bean="person" />
</property>
ref元素指定了引用的bean的id。
测试的程序代码如下:
package org.shirdrn.main;
import org.shirdrn.entity.Company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
System.out.println("company's id = "+c.getId());
System.out.println("company's name = "+c.getName());
System.out.println("company is Chinese = "+c.getChinese());
System.out.println("--- the following is CEO's detail ---");
System.out.println("CEO's id = "+c.getCEO().getId());
System.out.println("CEO's name = "+c.getCEO().getName());
System.out.println("CEO's age = "+c.getCEO().getAge());
System.out.println("CEO's Email = "+c.getCEO().getEmail());
}
}
测试输出结果如下所示:
company's id = 2008
company's name = CNAET
company is Chinese = true
--- the following is CEO's detail ---
CEO's id = 1001
CEO's name = Shirdrn
CEO's age = 26
CEO's Email = shirdrn@hotmail.com
(3) 注入Properties:
Properties类型也是键值对,而且它的键、值都只能是String类型。
新建一个PropertiesBean类,如下所示:
package org.shirdrn.entity;
import java.util.Properties;
public class PropertiesBean {
Properties hibernate;
public Properties getHibernate() {
return hibernate;
}
public void setHibernate(Properties hibernate) {
this.hibernate = hibernate;
}
}
XML中配置详情如下:
<bean id="propertiesBean" class="org.shirdrn.entity.PropertiesBean"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="hibernate">
<props>
<prop key="connection.url">
jdbc:microsoft:sqlserver://localhost:1433;databasename=person
</prop>
<prop key="dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="connection.username">sa</prop>
<prop key="connection.password">111111</prop>
<prop key="show_sql">true</prop>
</props>
</property>
</bean>
测试程序代码如下:
package org.shirdrn.main;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import org.shirdrn.entity.PropertiesBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
PropertiesBean propertiesBean = (PropertiesBean)ctx.getBean("propertiesBean");
Properties hibernate = propertiesBean.getHibernate();
Set keySet = hibernate.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
String propKey = (String)it.next();
String value = (String)hibernate.get(propKey);
System.out.println(propKey+" : "+value);
}
}
}
测试输出结果如下:
connection.url : jdbc:microsoft:sqlserver://localhost:1433;databasename=person
connection.username : sa
dialect : org.hibernate.dialect.SQLServerDialect
show_sql : true
connection.password : 111111
(4) 注入集合类型:
集合类型主要包括:List、Set、Map。
<1> 注入List
在Company类中再增加一个属性:
private List employees;
同时添加对应的Setter和Getter方法。
添加两个bean,他们的id分别为person1Bean和person2Bean:
<bean id="person1Bean" class="org.shirdrn.entity.Person" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>2001</value>
</property>
<property name="name">
<value>张飞</value>
</property>
<property name="age">
<value>26</value>
</property>
<property name="email">
<value>zhangfei@live.cn</value>
</property>
</bean>
<bean id="person2Bean" class="org.shirdrn.entity.Person" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>2002</value>
</property>
<property name="name">
<value>John Allen Green</value>
</property>
<property name="age">
<value>28</value>
</property>
<property name="email">
<value>john@baidu.com</value>
</property>
</bean>
在applicationContext.xml中的id为companyBean的bean中添加属性employees,使用list元素,并且list中是引用类型,分别指向person1Bean和person2Bean:
<property name="employees">
<list>
<ref bean="person1Bean" />
<ref bean="person2Bean" />
</list>
</property>
测试的程序代码如下:
package org.shirdrn.main;
import java.util.List;
import org.shirdrn.entity.Company;
import org.shirdrn.entity.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
List employees = (List)c.getEmployees();
Person employee1 = (Person)employees.get(0);
Person employee2 = (Person)employees.get(1);
System.out.println("--- the following is Employee1's detail---");
System.out.println("employee1's id = "+employee1.getId());
System.out.println("employee1's name = "+employee1.getName());
System.out.println("employee1's age = "+employee1.getAge());
System.out.println("employee1's Email = "+employee1.getEmail());
System.out.println("\n--- the following is Employee2's detail---");
System.out.println("employee2's id = "+employee2.getId());
System.out.println("employee2's name = "+employee2.getName());
System.out.println("employee2's age = "+employee2.getAge());
System.out.println("employee2's Email = "+employee2.getEmail());
}
}
测试输出结果如下所示:
--- the following is Employee1's detail---
employee1's id = 2001
employee1's name = 张飞
employee1's age = 26
employee1's Email = zhangfei@live.cn
--- the following is Employee2's detail---
employee2's id = 2002
employee2's name = John Allen Green
employee2's age = 28
employee2's Email = john@baidu.com
<2> 注入Set
和注入List很相似,但是有细微的差别:
在配置bean元素的时候,在property元素内部使用set元素,同时set元素中可以使用value或ref节点;
Set集合中不允许存在重复的元素;
<3> 注入Map
由于Map存在键-值映射,所以配置不同于List和Set。
假设有一个Car类,两个属性为id和name,如下所示:
package org.shirdrn.entity;
public class Car {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
一个公司Company有多辆公用Car,而且是用Map定义的,键为Car对象,值为String类型,描述Car的用途。在Company类中添加属性:
private Map cars = new HashMap(0);
同时添加对应的Setter和Getter方法。
配置文件applicationContext.xml中,增加两个bean分别为car1Bean和car2Bean:
<bean id="car1Bean" class="org.shirdrn.entity.Car" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>JL001</value>
</property>
<property name="name">
<value>宝马7系</value>
</property>
</bean>
<bean id="car2Bean" class="org.shirdrn.entity.Car" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>BJ007</value>
</property>
<property name="name">
<value>劳斯莱斯</value>
</property>
</bean>
同时在id为company的bean中增加如下属性配置,使用map元素:
<property name="cars">
<map>
<entry>
<key>
<ref bean="car1Bean" />
</key>
<value>出差专用</value>
</entry>
<entry>
<key>
<ref bean="car2Bean" />
</key>
<value>旅行专用</value>
</entry>
</map>
</property>
map元素的子元素entry表示一个键值对,其中entry的子元素key表示键,value表示值。
一共有4中组合方式:
键为value类型,值为value类型;
键为ref类型,值为value类型;
键为value类型,值为ref类型;
键为ref类型,值为ref类型。
如果想要获取公司的公用车辆对象,同时获取它的用途,可以编写如下测试程序,代码如下:
package org.shirdrn.main;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.shirdrn.entity.Car;
import org.shirdrn.entity.Company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
Map cars = c.getCars();
Set keySet = cars.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
Car car = (Car)it.next();
String value = (String)cars.get(car);
System.out.println("the car "+car.getName()+"'s value is: "+value);
}
}
}
测试输出结果如下所示:
the car 宝马7系's value is: 出差专用
the car 劳斯莱斯's value is: 旅行专用
注意:
如果使用entry元素的属性配置,则注入Map的配置更加简洁,上面的Map注入只需要使用如下两行:
<entry key-ref="car1Bean" value="出差专用" />
<entry key-ref="car2Bean" value="旅行专用" />
让键使用ref类型,而值使用refref,配置bean如下:
<bean id="companyBean" class="org.shirdrn.entity.Company"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="cars">
<map>
<entry>
<key>
<ref bean="car1Bean" />
</key>
<ref bean="car1Bean" />
</entry>
<entry>
<key>
<ref bean="car2Bean" />
</key>
<ref bean="car2Bean" />
</entry>
</map>
</property>
</bean>
测试程序代码如下:
package org.shirdrn.main;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.shirdrn.entity.Car;
import org.shirdrn.entity.Company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
Map cars = c.getCars();
Set keySet = cars.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
Car car = (Car)it.next();
Car value = (Car)cars.get(car);
System.out.println("the "+car+" car's value(id) is: "+value.getId());
System.out.println("the "+car+" car's value(name) is: "+value.getName());
}
}
}
测试结果输入如下:
the org.shirdrn.entity.Car@fa7e74 car's value(id) is: JL001
the org.shirdrn.entity.Car@fa7e74 car's value(name) is: 宝马7系
the org.shirdrn.entity.Car@183f74d car's value(id) is: BJ007
the org.shirdrn.entity.Car@183f74d car's value(name) is: 劳斯莱斯
只不过,此时Map的值是一个对象,根据Map的键,是一个对象,获取此键对应的值,就能够获取一个对象的相信信息。
使用Setter注入,可以注入很多类型。
(1) 注入基本类型:
可以使用Setter注入基本类型,如int、boolean等等,同时他们对应的封装类型,如Integer、Boolean等类型。
Company类定义如下:
package org.shirdrn.entity;
public class Company {
private int id;
private String name;
private Boolean chinese;
public Boolean getChinese() {
return chinese;
}
public void setChinese(Boolean chinese) {
this.chinese = chinese;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
对应的XML配置applicationContext.xml内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="companyBean" class="org.shirdrn.entity.Company"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="id">
<value>2008</value>
</property>
<property name="name">
<value>CNAET</value>
</property>
<property name="chinese">
<value>true</value>
</property>
</bean>
</beans>
测试的程序代码如下:
package org.shirdrn.main;
import org.shirdrn.entity.Company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
System.out.println("id = "+c.getId());
System.out.println("name = "+c.getName());
System.out.println("isChinese = "+c.getChinese());
}
}
测试输出结果如下所示:
id = 2008
name = CNAET
isChinese = true
(2) 注入引用类型
在Company类中添加一个属性,公司的CEO:
private Person CEO;
并且添加它的Setter和Getter方法。
Person类如下所示:
package org.shirdrn.entity;
public class Person {
private Integer id;
private String name;
private Integer age;
private String email;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
对应的XML文件applicationContext.xml配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="person" class="org.shirdrn.entity.Person" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>1001</value>
</property>
<property name="name">
<value>Shirdrn</value>
</property>
<property name="age">
<value>26</value>
</property>
<property name="email">
<value>shirdrn@hotmail.com</value>
</property>
</bean>
<bean id="companyBean" class="org.shirdrn.entity.Company"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="id">
<value>2008</value>
</property>
<property name="name">
<value>CNAET</value>
</property>
<property name="chinese">
<value>true</value>
</property>
<property name="CEO">
<ref bean="person" />
</property>
</bean>
</beans>
第一个bean元素配置person,第二个bean配置了companyBean,公司的详情,其中CEO引用了第一个bean,表示一个人的详细信息,关键的配置在于:
<property name="CEO">
<ref bean="person" />
</property>
ref元素指定了引用的bean的id。
测试的程序代码如下:
package org.shirdrn.main;
import org.shirdrn.entity.Company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
System.out.println("company's id = "+c.getId());
System.out.println("company's name = "+c.getName());
System.out.println("company is Chinese = "+c.getChinese());
System.out.println("--- the following is CEO's detail ---");
System.out.println("CEO's id = "+c.getCEO().getId());
System.out.println("CEO's name = "+c.getCEO().getName());
System.out.println("CEO's age = "+c.getCEO().getAge());
System.out.println("CEO's Email = "+c.getCEO().getEmail());
}
}
测试输出结果如下所示:
company's id = 2008
company's name = CNAET
company is Chinese = true
--- the following is CEO's detail ---
CEO's id = 1001
CEO's name = Shirdrn
CEO's age = 26
CEO's Email = shirdrn@hotmail.com
(3) 注入Properties:
Properties类型也是键值对,而且它的键、值都只能是String类型。
新建一个PropertiesBean类,如下所示:
package org.shirdrn.entity;
import java.util.Properties;
public class PropertiesBean {
Properties hibernate;
public Properties getHibernate() {
return hibernate;
}
public void setHibernate(Properties hibernate) {
this.hibernate = hibernate;
}
}
XML中配置详情如下:
<bean id="propertiesBean" class="org.shirdrn.entity.PropertiesBean"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="hibernate">
<props>
<prop key="connection.url">
jdbc:microsoft:sqlserver://localhost:1433;databasename=person
</prop>
<prop key="dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="connection.username">sa</prop>
<prop key="connection.password">111111</prop>
<prop key="show_sql">true</prop>
</props>
</property>
</bean>
测试程序代码如下:
package org.shirdrn.main;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import org.shirdrn.entity.PropertiesBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
PropertiesBean propertiesBean = (PropertiesBean)ctx.getBean("propertiesBean");
Properties hibernate = propertiesBean.getHibernate();
Set keySet = hibernate.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
String propKey = (String)it.next();
String value = (String)hibernate.get(propKey);
System.out.println(propKey+" : "+value);
}
}
}
测试输出结果如下:
connection.url : jdbc:microsoft:sqlserver://localhost:1433;databasename=person
connection.username : sa
dialect : org.hibernate.dialect.SQLServerDialect
show_sql : true
connection.password : 111111
(4) 注入集合类型:
集合类型主要包括:List、Set、Map。
<1> 注入List
在Company类中再增加一个属性:
private List employees;
同时添加对应的Setter和Getter方法。
添加两个bean,他们的id分别为person1Bean和person2Bean:
<bean id="person1Bean" class="org.shirdrn.entity.Person" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>2001</value>
</property>
<property name="name">
<value>张飞</value>
</property>
<property name="age">
<value>26</value>
</property>
<property name="email">
<value>zhangfei@live.cn</value>
</property>
</bean>
<bean id="person2Bean" class="org.shirdrn.entity.Person" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>2002</value>
</property>
<property name="name">
<value>John Allen Green</value>
</property>
<property name="age">
<value>28</value>
</property>
<property name="email">
<value>john@baidu.com</value>
</property>
</bean>
在applicationContext.xml中的id为companyBean的bean中添加属性employees,使用list元素,并且list中是引用类型,分别指向person1Bean和person2Bean:
<property name="employees">
<list>
<ref bean="person1Bean" />
<ref bean="person2Bean" />
</list>
</property>
测试的程序代码如下:
package org.shirdrn.main;
import java.util.List;
import org.shirdrn.entity.Company;
import org.shirdrn.entity.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
List employees = (List)c.getEmployees();
Person employee1 = (Person)employees.get(0);
Person employee2 = (Person)employees.get(1);
System.out.println("--- the following is Employee1's detail---");
System.out.println("employee1's id = "+employee1.getId());
System.out.println("employee1's name = "+employee1.getName());
System.out.println("employee1's age = "+employee1.getAge());
System.out.println("employee1's Email = "+employee1.getEmail());
System.out.println("\n--- the following is Employee2's detail---");
System.out.println("employee2's id = "+employee2.getId());
System.out.println("employee2's name = "+employee2.getName());
System.out.println("employee2's age = "+employee2.getAge());
System.out.println("employee2's Email = "+employee2.getEmail());
}
}
测试输出结果如下所示:
--- the following is Employee1's detail---
employee1's id = 2001
employee1's name = 张飞
employee1's age = 26
employee1's Email = zhangfei@live.cn
--- the following is Employee2's detail---
employee2's id = 2002
employee2's name = John Allen Green
employee2's age = 28
employee2's Email = john@baidu.com
<2> 注入Set
和注入List很相似,但是有细微的差别:
在配置bean元素的时候,在property元素内部使用set元素,同时set元素中可以使用value或ref节点;
Set集合中不允许存在重复的元素;
<3> 注入Map
由于Map存在键-值映射,所以配置不同于List和Set。
假设有一个Car类,两个属性为id和name,如下所示:
package org.shirdrn.entity;
public class Car {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
一个公司Company有多辆公用Car,而且是用Map定义的,键为Car对象,值为String类型,描述Car的用途。在Company类中添加属性:
private Map cars = new HashMap(0);
同时添加对应的Setter和Getter方法。
配置文件applicationContext.xml中,增加两个bean分别为car1Bean和car2Bean:
<bean id="car1Bean" class="org.shirdrn.entity.Car" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>JL001</value>
</property>
<property name="name">
<value>宝马7系</value>
</property>
</bean>
<bean id="car2Bean" class="org.shirdrn.entity.Car" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="id">
<value>BJ007</value>
</property>
<property name="name">
<value>劳斯莱斯</value>
</property>
</bean>
同时在id为company的bean中增加如下属性配置,使用map元素:
<property name="cars">
<map>
<entry>
<key>
<ref bean="car1Bean" />
</key>
<value>出差专用</value>
</entry>
<entry>
<key>
<ref bean="car2Bean" />
</key>
<value>旅行专用</value>
</entry>
</map>
</property>
map元素的子元素entry表示一个键值对,其中entry的子元素key表示键,value表示值。
一共有4中组合方式:
键为value类型,值为value类型;
键为ref类型,值为value类型;
键为value类型,值为ref类型;
键为ref类型,值为ref类型。
如果想要获取公司的公用车辆对象,同时获取它的用途,可以编写如下测试程序,代码如下:
package org.shirdrn.main;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.shirdrn.entity.Car;
import org.shirdrn.entity.Company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
Map cars = c.getCars();
Set keySet = cars.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
Car car = (Car)it.next();
String value = (String)cars.get(car);
System.out.println("the car "+car.getName()+"'s value is: "+value);
}
}
}
测试输出结果如下所示:
the car 宝马7系's value is: 出差专用
the car 劳斯莱斯's value is: 旅行专用
注意:
如果使用entry元素的属性配置,则注入Map的配置更加简洁,上面的Map注入只需要使用如下两行:
<entry key-ref="car1Bean" value="出差专用" />
<entry key-ref="car2Bean" value="旅行专用" />
让键使用ref类型,而值使用refref,配置bean如下:
<bean id="companyBean" class="org.shirdrn.entity.Company"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="cars">
<map>
<entry>
<key>
<ref bean="car1Bean" />
</key>
<ref bean="car1Bean" />
</entry>
<entry>
<key>
<ref bean="car2Bean" />
</key>
<ref bean="car2Bean" />
</entry>
</map>
</property>
</bean>
测试程序代码如下:
package org.shirdrn.main;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.shirdrn.entity.Car;
import org.shirdrn.entity.Company;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Company c = (Company)ctx.getBean("companyBean");
Map cars = c.getCars();
Set keySet = cars.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
Car car = (Car)it.next();
Car value = (Car)cars.get(car);
System.out.println("the "+car+" car's value(id) is: "+value.getId());
System.out.println("the "+car+" car's value(name) is: "+value.getName());
}
}
}
测试结果输入如下:
the org.shirdrn.entity.Car@fa7e74 car's value(id) is: JL001
the org.shirdrn.entity.Car@fa7e74 car's value(name) is: 宝马7系
the org.shirdrn.entity.Car@183f74d car's value(id) is: BJ007
the org.shirdrn.entity.Car@183f74d car's value(name) is: 劳斯莱斯
只不过,此时Map的值是一个对象,根据Map的键,是一个对象,获取此键对应的值,就能够获取一个对象的相信信息。
相关推荐
Java 开发学习(六)----DI 依赖注入之 setter 及构造器注入解析 本文将详细介绍 Java 中的依赖注入(Dependency Injection,简称 DI),特别是 setter 注入和构造器注入两种方式的使用和实现。 一、DI 依赖注入 ...
Java Spring 框架是企业级Java应用开发的首选框架之一,其核心特性之一就是依赖注入(Dependency Injection,简称DI)。依赖注入是一种设计模式,它允许我们解耦组件,提高代码的可测试性和可维护性。Spring框架通过...
在Java世界中,Spring框架是应用最广泛的轻量级框架之一,它以其强大的依赖注入(Dependency Injection,简称DI)特性而闻名。依赖注入是面向切面编程(AOP)的一个重要概念,它允许我们解耦组件,使得代码更加灵活...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它允许对象之间的耦合性降低,使得代码更易于测试和维护。依赖注入的核心思想是将一个对象依赖的其他对象通过构造函数、setter方法...
Spring依赖注入是Spring框架的核心特性之一,它使得对象之间的依赖关系得以解耦,增强了代码的可测试性和可维护性。依赖注入(Dependency Injection,简称DI)的理念是,一个对象不应该负责寻找并创建它所依赖的对象...
Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...
Spring框架的Dependency Injection(DI,依赖注入)是其核心特性之一,它允许开发者在运行时通过容器来管理对象及其依赖关系,而不是硬编码这些依赖。这样可以提高代码的可测试性和可维护性,降低了组件之间的耦合度...
Spring4的依赖注入是其核心功能之一,通过构造器、setter方法或属性注解实现。它提高了代码的可读性、可测试性和可维护性。在实际开发中,结合注解和XML配置,可以灵活应对各种复杂的依赖关系。理解并熟练运用依赖...
其中,IoC和依赖注入(Dependency Injection, DI)是Spring框架最核心的部分之一。 #### 二、IoC容器概述 在传统的Java应用程序中,对象的创建和管理通常由程序员来完成。这种方式会导致代码之间存在高度耦合,难以...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的三种依赖注入方式,并结合源码分析其工作...
Spring框架的依赖注入(Dependency Injection,简称DI)是其核心特性之一,它使得应用程序的组件之间可以松散耦合,增强了代码的可测试性和可维护性。在Spring框架中,DI通过控制反转(Inversion of Control,IoC)...
在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)容器。它极大地简化了组件之间的依赖管理,提高了代码的可测试性和可维护性。本篇文章将深入...
Spring框架是Java开发中广泛应用的一个轻量级容器,它的核心特性是依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)。这两个特性极大地简化了Java应用程序的开发和...
setter注入是Spring中最常用的注入方式之一。通过在类中定义setter方法,Spring容器可以在创建对象后,通过这些setter方法设置对象的属性值。以下是一个简单的例子: ```java public class User { private String ...
Spring依赖注入(Dependency Injection,简称DI)是Java应用开发中常用的设计模式,它极大地提高了代码的可测试性和可维护性。在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)...
Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的概念、工作原理以及如何在实际...
Spring框架是Java开发中...总之,"SpringDI.rar"是一个实践Spring依赖注入的宝贵资源,通过学习和运行这些例子,开发者能够更好地理解和掌握Spring框架的核心特性之一——依赖注入,从而提升其在实际项目中的应用能力。
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它极大地提高了代码的可测试性和可维护性。本篇学习笔记将深入剖析Spring依赖注入的原理,通过源码分析帮助我们理解这一核心机制。...
在Java开发中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)功能而闻名。依赖注入是一种设计模式,它允许我们解耦组件,使我们的应用程序更加灵活,易于测试和维护。本篇文章将深入探讨Spring框架...