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方法都是在自动注入时调用。所以基本类型不会被注入。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值