javascript
[置顶] Spring中DI设置器注入
Java的反射機制可以說是在Spring中發揮的淋漓盡致,下面要看的代碼就是通過反射機制來實現向一個類注入其實際依賴的類型,這個過程的實現會交由Spring容器來幫我們完成。
JavaBean中針對屬性一般都有一組設置/獲取方法(setXXX/getXXX),這兩個方法可以由IDE給我們自動產生,當然你也可以手動進行編寫,這是你的自由,下面的例子就是Spring中利用setter方法來實現依賴注入。
?
源代碼如下:
package com.pp; //一個普通的JavaBean public class Person {//人的名字private String S_name;private String S_addr;private int age;//getter方法public int getS_Age() {return age;}//setter方法public void setS_Age(int age) {this.age = age;}//setter方法public String getaddr() {return S_addr;}//getter方法public void setaddr(String addr) {S_addr = addr;}//構造函數public Person(){}//getter方法public String getName() {return S_name;}//setter方法public void setName(String name) {S_name = name;}; }有了這個普通的JavaBean,我們要利用Spring容器來實現屬性的注入,這里就需要Spring的配置文件,Spring的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="sentence" class="com.pp.Sentence"/><bean id="person" class="com.pp.Person"><!-- 從這里可以看出的是屬性名是setter方法里去掉set的部分,即setXXX中的XXX而與具體的屬性無關 --><property name="name" value="pptest"></property><!-- 這里你完全可以把setaddr里的參數改成setaddr(String name),并不會報錯,因為判斷的依據是setXXX即XXX --><!-- 但如果你改成setS_addr這里就要錯了,不信你可以試,如果改成setS_addr,則下面的name需要改成S_addr --><property name="addr" value="Beijing"></property><!-- 這里就是上面的一個例子,類的屬性名為age,但這里的name卻為S_Age --><!-- 同時這里也要說明的一個問題是類里面為int,但這里卻是字符串類型,這個你不用擔心,Spring在進行注入時會自動根據參數的類型進行類型 的轉化 --><property name="S_Age" value="22"></property></bean> </beans>配置文件中我已經注釋的很清楚了,就不做說明了
下面是一個測試文件
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class MainTest { public static void main(String[] args) {BeanFactory factory=new XmlBeanFactory(new ClassPathResource("person.xml"));Person person=(Person)factory.getBean("person");System.out.println(person.getName());System.out.println(person.getaddr());System.out.println(person.getS_Age()); } }如果一切正常的話,應該會打印出如下的結果:
pptest
Beijing
22
?
上面向類里面注入的均是內置類型,其實不僅可以注入內置類型,還可以向里面注入外部類對象,下面就是一個例子,只顯示增加的部份,增加的部分,是假設每一個人均有說一句話,這句話的實際內容是由Sentence這個類決定的
源代碼:
//這是一個普通的類,當然這樣設計不好,在此僅為說明一下 public class Sentence{//類里面的方法,表示每一個人均說的是同樣的一句話public void say() {System.out.println("Hello");} }下面是在類Person使用剛才的Sentence這個類,以下只列出新增代碼
//代表要說的話private Sentence sce;//setter方法public Sentence getSce() {return sce;}//getter方法public void setSce(Sentence sce) {this.sce = sce;}以下是配置文件,同樣也只列出新增的一部份
?
<bean id="sentence" class="com.pp.Sentence"/><bean id="person" class="com.pp.Person"><!-- 從這里可以看出的是屬性名是setter方法里去掉set的部分,即setXXX中的XXX而與具體的屬性無關 --><property name="name" value="pptest"></property><!-- 這里你完全可以把setaddr里的參數改成setaddr(String name),并不會報錯,因為判斷的依據是setXXX即XXX --><!-- 但如果你改成setS_addr這里就要錯了,不信你可以試,如果改成setS_addr,則下面的name需要改成S_addr --><property name="addr" value="Beijing"></property><!-- 這里就是上面的一個例子,類的屬性名為age,但這里的name卻為S_Age --><!-- 同時這里也要說明的一個問題是類里面為int,但這里卻是字符串類型,這個你不用擔心,Spring在進行注入時會自動根據參數的類型進行類型 的轉化 --><property name="S_Age" value="22"></property><!-- 引入在外部定義的bean,這里就是上面的一個bean的id --><property name="Sce" ref="sentence"></property></bean>?
測試文件里里面只需填加一行即可:
person.getSce().say();最終的結果如下:
pptest
Beijing
22
Hello
上面的配置文件中,是用外部Bean注入的,我們也可以使用內部Bean注入,所謂內部Bean注入,是直接把Bean的定義寫在property屬性里,如下是更改后的配置文件
<!-- <bean id="sentence" class="com.pp.Sentence"/>--><bean id="person" class="com.pp.Person"><!-- 從這里可以看出的是屬性名是setter方法里去掉set的部分,即setXXX中的XXX而與具體的屬性無關 --><property name="name" value="pptest"></property><!-- 這里你完全可以把setaddr里的參數改成setaddr(String name),并不會報錯,因為判斷的依據是setXXX即XXX --><!-- 但如果你改成setS_addr這里就要錯了,不信你可以試,如果改成setS_addr,則下面的name需要改成S_addr --><property name="addr" value="Beijing"></property><!-- 這里就是上面的一個例子,類的屬性名為age,但這里的name卻為S_Age --><!-- 同時這里也要說明的一個問題是類里面為int,但這里卻是字符串類型,這個你不用擔心,Spring在進行注入時會自動根據參數的類型進行類型 的轉化 --><property name="S_Age" value="22"></property><!-- 引入在外部定義的bean,這里就是上面的一個bean的id <property name="Sce" ref="sentence"></property>--><property name="Sce"><!-- 內部的Bean不能被外部的Bean引用,因此在里面加入id屬性,是沒有什么用的,內部Bean只能供本類使用,這里就是Person類的一個對象 --><bean class="com.pp.Sentence"></bean></property></bean>測試文件可以不加任何改動,但最終的運行結果是一樣的
轉載于:https://www.cnblogs.com/jiangu66/p/3238854.html
總結
以上是生活随笔為你收集整理的[置顶] Spring中DI设置器注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: socket入门教程
- 下一篇: 提高你的Java代码质量吧:推荐在复杂字