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());
}
}
相關文章
- Spring注入:配置注入(set注入和構造器注入)與註解注入Spring
- Spring-註解注入Spring
- 【Spring實戰】—— 2 構造注入Spring
- Spring set注入和構造注入的區別Spring
- Spring配置使用註解注入beanSpringBean
- spring使用註解注入bean理解SpringBean
- Spring6框架中依賴注入的多種方式(推薦構造器注入)Spring框架依賴注入
- Spring原始碼--debug分析迴圈依賴--構造器注入Spring原始碼
- Spring系列之新註解配置+Spring整合junit+註解注入Spring
- spring註解開發(一)Bean注入SpringBean
- jQuery心得2--jQuery案例剖析1jQuery
- Spring定時器的配置(註解+xml)方式Spring定時器XML
- Spring-Aop註解形式案例Spring
- spring常用的一些註解以及註解注入總結Spring
- Spring進階案例之註解和IoC案例Spring
- iOS 構造三級控制器iOS
- 反射,註解,動態代理,依賴注入控制反轉反射依賴注入
- Solon Ioc 的魔法之註解注入器(也可叫虛空注入器)
- 【Spring註解驅動開發】使用@Scope註解設定元件的作用域Spring元件
- jQuery心得4--jQuery案例剖析2-開發實用案例jQuery
- spring定時任務註解Spring
- 【Scala之旅】控制結構和註解
- Spring 註解程式設計之模式註解Spring程式設計模式
- spring心得8--AOP各種通知案例講解.docSpring
- 省掉bean自定義spring mvc註解注入json值BeanSpringMVCJSON
- Spring實現無需註解實現自動注入Spring
- Java Spring各種依賴注入註解的區別JavaSpring依賴注入
- Java開發學習(六)----DI依賴注入之setter及構造器注入解析Java依賴注入
- 解構控制反轉(IoC)和依賴注入(DI)依賴注入
- spring中的控制反轉和依賴注入 --講解Spring依賴注入
- 從Hessian RPC 註解方式看Spring依賴注入RPCSpring依賴注入
- Spring @Autowired 註解自動注入流程是怎麼樣?Spring
- 構造器
- swoft2.0 原始碼剖析系列 01-註解器原始碼
- SpringAOP_構造注入實現Spring
- Spring 控制反轉和依賴注入Spring依賴注入
- spring心得4--setter注入集合(set、list、map、properties等多種集合,配有案例解析)@基本裝Spring
- 【Spring】Spring依賴注入與控制反轉理解Spring依賴注入