spring中使用autowire特性时注意


 spring中可以只用autowire="byName"或者"byType"来提供自动注入。但是大家有一点还需要注意,那就是它不支持基本数据类型(String,int,long等)的自动注入。例如
JAVA类:
  1. public class TestBean {
  2.     private String name;
  3.     private Long age;
  4.     private String fullName;
  5.     private TestBean2 testBean2;
  6.     
  7.     public void setTestBean2(TestBean2 testBean2) {
  8.         this.testBean2 = testBean2;
  9.     }
  10.     public TestBean2 getTestBean2() {
  11.         return testBean2;
  12.     }
  13.     public void setFullName(String fullName) {
  14.         this.fullName = fullName;
  15.     }
  16.     public String getFullName() {
  17.         return fullName;
  18.     }
  19.     
  20.     public void setAge(Long age) {
  21.         this.age = age;
  22.     }
  23.     
  24.     public Long getAge() {
  25.         return age;
  26.     }
  27.     public void setName(String name) {
  28.         this.name = name;
  29.     }
  30.     public String getName() {
  31.         return name;
  32.     }
  33. }
JAVA类2:
  1. public class TestBean2 {
  2.   public String getString(){
  3.       return "testB";
  4.   }
  5. }
配置文件:
  1. <beans default-autowire="byName">
  2.     <!--  login -->
  3.     <bean id="testBean" class="TestBean">
  4.         <property name="fullName">
  5.             <value>fullName</value>
  6.         </property>
  7.     </bean> 
  8.     <bean id="name" class="java.lang.String">
  9.         <constructor-arg>
  10.             <value>hell</value>
  11.         </constructor-arg>
  12.     </bean>
  13.     <bean id="age" class="java.lang.Long">
  14.         <constructor-arg>
  15.             <value>20</value>
  16.         </constructor-arg>
  17.     </bean>
  18.     <bean id="testBean2" class="TestBean2"/>
  19. </beans>
测试类:
  1. import org.springframework.context.support.ClassPathXmlApplicationContext;
  2. public class Test {
  3.     public static void main(String[] args) {
  4.         ClassPathXmlApplicationContext t = new ClassPathXmlApplicationContext(
  5.                 "test.xml");
  6.         TestBean bean = (TestBean) t.getBean("testBean");
  7.         System.out.println("name:" + bean.getName() + "  age:" + bean.getAge()
  8.                 + " fullName :" + bean.getFullName() + "  testBean2"
  9.                 + bean.getTestBean2().getString());
  10.     }
  11. }
输出的结果是:
name:null age:null fullName :fullName  testBean2:testB


spring源码中排除基本类型的代码(源码来自:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory类)在:
  1.  protected String[] unsatisfiedNonSimpleProperties(AbstractBeanDefinition mbd, BeanWrapper bw) {
  2.   Set result = new TreeSet();
  3.   PropertyValues pvs = mbd.getPropertyValues();
  4.   PropertyDescriptor[] pds = bw.getPropertyDescriptors();
  5.   for (int i = 0; i < pds.length; i++) {
  6.    if (pds[i].getWriteMethod() != null && !isExcludedFromDependencyCheck(pds[i]) &&
  7.      !pvs.contains(pds[i].getName()) && !BeanUtils.isSimpleProperty(pds[i].getPropertyType())) {
  8.     result.add(pds[i].getName());
  9.    }
  10.   }
  11.   return StringUtils.toStringArray(result);
  12.  }
  13.   

请注意以上紫色部分。而这个 unsatisfiedNonSimpleProperties方法都是在自动注入时调用。所以基本类型不会被注入。

你可能感兴趣的:(spring)