[SXT][WY]Spring04 属性注入

普通属性注入

 

依赖对象的注入方式,可以采用:
 * ref属性
 * <ref>标签
 * 内部<bean>来定义

 

<?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:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
 
 <bean id="bean1" class="com.bjsxt.spring.Bean1">
  <property name="strValue" value="Hello"/>
  <!--
  <property name="intValue" value="123"/>
   -->
   <property name="intValue">
    <value>123</value>
   </property>
   <property name="listValue">
    <list>
     <value>list1</value>
     <value>list2</value>
    </list>
   </property>
   <property name="setValue">
    <set>
     <value>set1</value>
     <value>set2</value>
    </set>
   </property>
   <property name="arrayValue">
    <list>
     <value>array1</value>
     <value>array2</value>
    </list>
   </property>
   <property name="mapValue">
    <map>
     <entry key="k1" value="v1"/>
     <entry key="k2" value="v2"/>
    </map>
   </property>
   <property name="dateValue">
    <value>2008-08-15</value>
   </property>
 </bean>
 
 </beans>

 

public class Bean1 {
 
 private String strValue;
 
 private int intValue;
 
 private List listValue;
 
 private Set setValue;
 
 private String[] arrayValue;
 
 private Map mapValue;
 
 private Date dateValue; // 字符串转换成date类需要一个特定的转换器。下一个段落中介绍

...

}

 

public class InjectionTest extends TestCase {
 
 private BeanFactory factory;
 
 @Override // testcase 中的初始化方法
 protected void setUp() throws Exception {
  factory = new ClassPathXmlApplicationContext("applicationContext-*.xml"); 
 }

 public void testInjection1() {
  Bean1 bean1 = (Bean1)factory.getBean("bean1");
  
  System.out.println("bean1.strValue=" + bean1.getStrValue());
  System.out.println("bean1.intValue=" + bean1.getIntValue());
  System.out.println("bean1.listValue=" + bean1.getListValue());
  System.out.println("bean1.setValue=" + bean1.getSetValue());
  System.out.println("bean1.arrayValue=" + bean1.getArrayValue());
  System.out.println("bean1.mapValue=" + bean1.getMapValue());
  System.out.println("bean1.dateValue=" + bean1.getDateValue());
 }

}

 

自定义属性编辑器

 

 上面段落中的

   <property name="dateValue">
    <value>2008-08-15</value>
   </property>

中的字符串要转换成date类型,需要转换器的支持。

 

什么是属性编辑器,作用?
 * 自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入
 spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器
 
 * 如何定义属性编辑器?
  * 继承PropertyEditorSupport类,覆写setAsText()方法,参见:UtilDatePropertyEditor.java
  * 将属性编辑器注册到spring中,参见:applicationContext-editor.xml

 

UtilDatePropertyEditor.java

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * java.util.Date属性编辑器
 * @author Administrator
 *
 */
public class UtilDatePropertyEditor extends PropertyEditorSupport {

 private String format="yyyy-MM-dd";
 
 @Override
 public void setAsText(String text) throws IllegalArgumentException {
  System.out.println("UtilDatePropertyEditor.saveAsText() -- text=" + text);
  
  SimpleDateFormat sdf = new SimpleDateFormat(format);
  try {
   Date d = sdf.parse(text);
   this.setValue(d);
  } catch (ParseException e) {
   e.printStackTrace();
  }
 }

 public void setFormat(String format) {
  this.format = format;
 }

}

 

applicationContext-editor.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:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
     <!-- 定义属性编辑器 -->     
 <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
  <property name="customEditors">
   <map>
    <entry key="java.util.Date">
     <bean class="com.bjsxt.spring.UtilDatePropertyEditor">
      <property name="format" value="yyyy-MM-dd"/>
     </bean>
    </entry>
   </map>
  </property>
 </bean> 
 
 <!--
 <bean id="utilDatePropertyEditor" class="com.bjsxt.spring.UtilDatePropertyEditor"></bean>
  -->
</beans>

 

 

 

公共属性的注入

 

当几个bean有相同的属性结构时,可以缩减配置,抽取公共属性设置

 

下面bean3 bean4有公共的属性

 <bean id="bean2" class="com.bjsxt.spring.Bean2">
  <property name="bean3" ref="bean3"/>
  <property name="bean4">
   <ref bean="bean4"/>
  </property> 
  <property name="bean5" ref="bean5"/>
 </bean>
 
 <!--
 <bean id="bean3" class="com.bjsxt.spring.Bean3">
  <property name="id" value="1000"/>
  <property name="name">
   <value>Jack</value>
  </property>
  <property name="password" value="123"/>
 </bean>
 
 <bean id="bean4" class="com.bjsxt.spring.Bean4">
  <property name="id" value="1000"/>
  <property name="name" value="Jack"/>
 </bean>
  -->
 
 <bean id="bean5" class="com.bjsxt.spring.Bean5">
  <property name="age" value="20"/>
 </bean>

 

可以抽取相同属性:

在另一个单独的配置文件中配置

applicationContext-other.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:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
  
   <bean id="beanAbstract" abstract="true">
     <property name="id" value="1000"/>
     <property name="name" value="Jack"/>
   </bean>        
  
   <bean id="bean3" class="com.bjsxt.spring.Bean3" parent="beanAbstract">
     <property name="name" value="Tom"/>
     <property name="password" value="123"/>
   </bean>       
  
   <bean id="bean4" class="com.bjsxt.spring.Bean4" parent="beanAbstract"/>
</beans>

 

如何将公共的注入定义描述出来?
 * 通过<bean>标签定义公共的属性,指定abstract=true
 * 具有相同属性的类在<bean>标签中指定其parent属性
 
 参见:applicationContext-other.xml

你可能感兴趣的:(spring,AOP,bean,xml)