spring心得5--构造器注入@设置控制@案例加注解剖析

1.设置引用空对象的情况

设置null:

  <property name="barlist">

         <null/>

  </property>

    这种设置多出在一个bean实例引用另一个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"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean id="memberBean" class="www.csdn.spring.constructor.MemberBean">

      <!-- value="null" 这里给value赋的是一个空字符串,而不是一个null空值 -->

      <property name="name" value="null"/>

      <property name="member">

        <null/>

      </property>

   </bean>

 

</beans>

   测试类

package www.csdn.spring.constructor;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

public class TestMemberBean {

       

       @Test

       public void testBean(){

              ApplicationContext context = new ClassPathXmlApplicationContext("spring-null.xml");

         MemberBean member = context.getBean("memberBean",MemberBean.class);

         System.out.println(member.name);

         System.out.println(member.member);

       }

 

}


 

2.构造器注入

    构造器注入是Set注入的替代;set注入是一种直接方式缺点是它假设了所有的可变属性都可以通过set方法访问到。例如有些属性在创建时设置一次,以后不再改变。替代方式是通过构造函数设置一些属性值

    set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选的,构造注入的优势是通过构造强制依赖关系,不可能实例化不完全的或无法使用的bean

解决构造函数参数不确定性

    构造函数多或参数类型大都相同该如何处理?

    spring并不是按照参数的顺序来配置参数的。有三种方法来解决构造参数的不确定性:序号和类型,属性名字指明。<constructor-arg>有一个可选的index属性,可用来指定参数的顺序。

3.构造器案例剖析

配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans.xsd">

 

   <!-- 1、通过构造函数注入,采用默认配备方式注入值,这是最原始的方式 ,已由以下三种所代替 ;这里spring容器会去自动为你去匹配,但是会出现类型不匹配的错-->

   <bean id="employeeBean" class="www.csdn.spring.constructor.EmployeeBean">

      <constructor-arg value="杨凯" />

      <constructor-arg value="男" />

      <constructor-arg value="5000" />

      <constructor-arg ref="deptmentBean" />

   </bean>

 

   <!-- 1、根据构造器参数的类型 ;这里需要注意的是类类型的需要加上包名指明,基本类型的不需要;特殊的注意的是这里不会自动拆箱装箱;bean实例使用的是基本类型这里就用基本类型注入,

      使用额是基本类型对应的类类型就用加包名的类类型指明 -->

   <!-- <bean id="employeeBean" class="www.csdn.spring.constructor.EmployeeBean"> 

      <constructor-arg type="java.lang.String" value="杨凯" /> 

      <constructor-arg type="java.lang.String" value="男" /> 

      <constructor-arg type="double" value="5000.00" />

        <constructor-arg type="www.csdn.spring.constructor.DeptmentBean" ref="deptmentBean" />

   </bean> -->

 

   <!-- 3、根据索引index注入 -->

   <!-- <bean id="employeeBean" class="www.csdn.spring.constructor.EmployeeBean"> 

      <constructor-arg index="0" value="杨凯df"/> 

      <constructor-arg index="1" value="男"/> 

      <constructor-arg index="2" value="1000.00"/> 

      <constructor-arg index="3" ref="deptmentBean"/> 

   </bean> -->

 

   <!-- 4.根据属性名注入值,开发中最常用的一种构造器注入模式 -->

   <!-- <bean id="employeeBean" class="www.csdn.spring.constructor.EmployeeBean">

   <constructor-arg name="name" value="杨凯" />

   <constructor-arg name="sex" value="男" />

   <constructor-arg name="salary" value="5000.00" />

   <constructor-arg name="dept" ref="deptmentBean" />

    </bean> -->

 

   <bean id="deptmentBean" class="www.csdn.spring.constructor.DeptmentBean">

      <property name="name" value="开发部" />

      <property name="deptNo" value="001" />

   </bean>

 

</beans>

bean实例

package www.csdn.spring.constructor;

 

publicclass EmployeeBean {

   

   private String name;

   private String sex;

   privatedoublesalary;

   private DeptmentBean dept;

 

 

   public EmployeeBean(String name, String sex, double salary,

         DeptmentBean dept) {

      super();

      this.name = name;

      this.sex = sex;

      this.salary = salary;

      this.dept = dept;

   }

 

 

   @Override

   public String toString() {

      return"EmployeeBean [name=" + name + ", sex=" + sex + ", salary="

            + salary + ", dept=" + dept + "]";

   }

}

辅助bean实例

package www.csdn.spring.constructor;

 

publicclass DeptmentBean {

   

   private String name;

   private Integer deptNo;

   

   publicvoid setName(String name) {

      this.name = name;

   }

   publicvoid setDeptNo(Integer deptNo) {

      this.deptNo = deptNo;

   }

   @Override

   public String toString() {

      return"deptment [name=" + name + ", deptNo=" + deptNo + "]";

   }

 

}

测试类

package www.csdn.spring.constructor;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

public class TestEmployeeBean {

       

       @Test

       public void testBean(){

       ApplicationContext context = new ClassPathXmlApplicationContext("spring-constructor.xml");

       System.out.println(context.getBean("employeeBean",EmployeeBean.class).toString());

       }

}


 

你可能感兴趣的:(类,String,测试,杨凯专属频道,spring构造器注入)