java代碼注入 java注入是什么意思

java類注入到另一個(gè)

方法如下:

成都創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為朝陽(yáng)等服務(wù)建站,朝陽(yáng)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為朝陽(yáng)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

如果另一個(gè)類是在寫的java文件夾下,就直接new一個(gè)對(duì)象,然后調(diào)用方法就好,如果不是在本文件夾下,就需要在代碼最前面添加該包,然后new對(duì)象,最后調(diào)用方法。

如何通俗的理解java的依賴注入

假設(shè)你編寫了兩個(gè)類,一個(gè)是人(Person),一個(gè)是手機(jī)(Mobile)。

人有時(shí)候需要用手機(jī)打電話,需要用到手機(jī)的callUp方法。

傳統(tǒng)的寫法是這樣:

Java code

public class Person{

public boolean makeCall(long number){

Mobile mobile=new Mobile();

return mobile.callUp(number);

}

}

也就是說(shuō),類Person的makeCall方法對(duì)Mobile類具有依賴,必須手動(dòng)生成一個(gè)新的實(shí)例new Mobile()才可以進(jìn)行之后的工作。

依賴注入的思想是這樣,當(dāng)一個(gè)類(Person)對(duì)另一個(gè)類(Mobile)有依賴時(shí),不再該類(Person)內(nèi)部對(duì)依賴的類(Moblile)進(jìn)行實(shí)例化,而是之前配置一個(gè)beans.xml,告訴容器所依賴的類(Mobile),在實(shí)例化該類(Person)時(shí),容器自動(dòng)注入一個(gè)所依賴的類(Mobile)的實(shí)例。

接口:

Java code

public Interface MobileInterface{

public boolean callUp(long number);

}

Person類:

Java code

public class Person{

private MobileInterface mobileInterface;

public boolean makeCall(long number){

return this.mobileInterface.callUp(number);

}

public void setMobileInterface(MobileInterface mobileInterface){

this.mobileInterface=mobileInterface;

}

}

在xml文件中配置依賴關(guān)系

Java code

bean id="person" class="Person"

property name="mobileInterface"

ref local="mobileInterface"/

/property

/bean

bean id="mobileInterface" class="Mobile"/

這樣,Person類在實(shí)現(xiàn)撥打電話的時(shí)候,并不知道Mobile類的存在,它只知道調(diào)用一個(gè)接口MobileInterface,而MobileInterface的具體實(shí)現(xiàn)是通過(guò)Mobile類完成,并在使用時(shí)由容器自動(dòng)注入,這樣大大降低了不同類間相互依賴的關(guān)系。

java依賴注入的方法:set注入,構(gòu)造方法注入,接口注入。

如何利用Java實(shí)現(xiàn)資源注入

Java的功能強(qiáng)大,今兒博洋教育將給大家介紹。 需求:一個(gè)應(yīng)用有兩個(gè)數(shù)據(jù)庫(kù),分別為DB-A,DB-B。 假設(shè)持久層框架使用iBatis來(lái)實(shí)現(xiàn),那么SqlMapClient對(duì)象在創(chuàng)建時(shí),對(duì)于兩個(gè)不同的DB連接要有兩個(gè)不同的SqlMapClient對(duì)象, 假設(shè)我們有一個(gè)Service類為MyService.java,該類中有兩個(gè)SqlMapClient對(duì)象sqlMapA、sqlMapB分別對(duì)應(yīng)著DB-A、DB-B。 先看看我們的SqlMapClient.java類:(自定義SqlMapClient類,用來(lái)演示。) import java.util.Map; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; @SuppressWarnings("unchecked") public class SqlMapClient { public SqlMapClient(String s, String t) { sqlMap = s; type = t; } public SqlMapClient() { } private String type = null; private String sqlMap = null; // get、set方法 略 // 用于演示查詢后返回一個(gè)String的返回結(jié)果 public String selectForObject(String sql, Map in) { return this.toString(); } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)。append("sqlMap", sqlMap) .append("type", type)。toString(); } } MyService.java類實(shí)現(xiàn): import java.util.Map; @SuppressWarnings("unchecked") public class MyService { @DataSource(type="B", sqlMap="com/annotation/sql-map-config-B.xml") private SqlMapClient sqlMapB = null; @DataSource(type="A", sqlMap="com/annotation/sql-map-config-A.xml") private SqlMapClient sqlMapA = null; // get、set方法 略 // 模擬在DB-B數(shù)據(jù)庫(kù)取得數(shù)據(jù) public String selectForObjectFromB(String sql, Map in) { return sqlMapB.selectForObject("", null); } // 模擬在DB-A數(shù)據(jù)庫(kù)取得數(shù)據(jù) public String selectForObjectFromA(String sql, Map in) { return sqlMapA.selectForObject("", null); } } 接下來(lái)就是我們的注解類:DataSource.java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface DataSource { /** * Dao的類型 * @return */ String type() default "A"; // 連接的數(shù)據(jù)庫(kù)類型 A or B String sqlMap() default ""; // Sql-Map-Config文件的路徑,用于加載iBatis的SqlMapClient對(duì)象 } 定義資源注入的接口 IFieldWiring.java。 之所以這里要定義這個(gè)接口,是為了以后擴(kuò)展用,我們很方便的定義更多的自定義注解。 IFieldWiring.java import java.lang.annotation.Annotation; import java.lang.reflect.Field; public interface IFieldWiring { Class clazz = obj.getClass(); try { String methodname = "get" + StringUtils.capitalize(fieldName); Method method = clazz.getDeclaredMethod(methodname); method.setAccessible(true); return method.invoke(obj); } catch (Exception e) { try { Field field = clazz.getDeclaredField(fieldName); field.setAccessible(true); return field.get(obj); } catch (Exception e1) { e1.printStackTrace(); } } return null; } public static void setFieldValue(Object target, String fname, Class fieldClass, Object fieldObj) { if (!fieldClass.isAssignableFrom(fieldObj.getClass())) { return; } Class clazz = target.getClass(); try { Method method = clazz.getDeclaredMethod("set" + Character.toUpperCase(fname.charAt(0)) + fname.substring(1), fieldClass); method.setAccessible(true); method.invoke(target, fieldObj); } catch (Exception e) { try { Field field = clazz.getDeclaredField(fname); field.setAccessible(true); field.set(target, fieldObj); } catch (Exception e1) { e1.printStackTrace(); } } } } 已經(jīng)基本大功告成了,只要將我們的DataSourceWiring.java類使用起來(lái)即可。 MyAnnotationBeanProcessor.java,這個(gè)類主要用于為bean對(duì)象注入資源。 import java.lang.reflect.Field; public class MyAnnotationBeanProcessor { /** * 注入資源 * @param serviceObject * @param fieldAutoWirings // 所有實(shí)現(xiàn)IFieldWiring的接口的對(duì)象,我們可以在此擴(kuò)展 * @throws Exception */ public void wire(Object serviceObject, IFieldWiring fieldAutoWirings) throws Exception { Class cls = serviceObject.getClass(); for (Field field : cls.getDeclaredFields()) { for (IFieldWiring fieldAutoWiring : fieldAutoWirings) { if (field.isAnnotationPresent(fieldAutoWiring.annotationClass())) { fieldAutoWiring.wiring(serviceObject, field); break; } } } } } 好了,開始我們的測(cè)試類:FieldWiringTest.java public class FieldWiringTest { public static void main(String args[]) throws Exception { MyAnnotationBeanProcessor processor = new MyAnnotationBeanProcessor(); MyService b = new MyService(); processor.wire(b, new DataSourceWiring()); // 注入DataSource資源 System.out.println(b.selectForObjectFromB("", null)); System.out.println(b.selectForObjectFromA("", null)); } } 執(zhí)行結(jié)果: SqlMapClient[sqlMap=com/annotation/sql-map-config-B.xml,type=B] SqlMapClient[sqlMap=com/annotation/sql-map-config-A.xml,type=A] 由執(zhí)行結(jié)果可以說(shuō)明DataSource資源已經(jīng)被我們正確的注入了。 如果想擴(kuò)展的話,只需要新建一個(gè)類實(shí)現(xiàn)IFieldWiring接口即可。假設(shè)叫InParamWiring.java,實(shí)現(xiàn)了接口定義的兩個(gè)方法后,在使用的時(shí)候,只要用以下代碼便可將資源注入了: MyAnnotationBeanProcessor processor = new MyAnnotationBeanProcessor(); MyService b = new MyService(); processor.wire(b, new DataSourceWiring(), new InParamWiring()); // 注入DataSource、InParam資源. 更多Java學(xué)習(xí)技巧,盡在博洋教育。若您想了解java程序培訓(xùn)價(jià)格,歡迎向我們的在線老師進(jìn)行詳細(xì)了解。

java循環(huán)注入的問(wèn)題該怎么解決?

加AOP能解決spring IoC的循環(huán)引用。

循環(huán)引用是你配置bean的時(shí)候,構(gòu)建方式上出了錯(cuò)。比如,創(chuàng)建A對(duì)象的時(shí)候,你引用到了B,而創(chuàng)建B對(duì)象的時(shí)候,你又引用到了A。你仔細(xì)檢查下你的構(gòu)造器

循環(huán)依賴——在采用構(gòu)造器注入的方式配置bean時(shí),很有可能會(huì)產(chǎn)生循環(huán)依賴的情況。比如說(shuō),一個(gè)類A,需要通過(guò)構(gòu)造器注入類B,而類B又需要通過(guò)構(gòu)造器

注入類A。如果為類A和B配置的bean被互相注入的話,那么Spring IoC容器將檢測(cè)出循環(huán)引用,并拋出

BeanCurrentlyInCreationException異常。對(duì)于此問(wèn)題,一個(gè)可能的解決方法就是修改源代碼,將某些構(gòu)造器注入改為

setter注入。另一個(gè)解決方法就是完全放棄構(gòu)造器注入,只使用setter注入。換句話說(shuō),除了極少數(shù)例外,大部分的循環(huán)依賴都是可以避免的,不過(guò)采用setter注入產(chǎn)生循環(huán)依賴的可能性也是存在的。與通常我們見到的非循環(huán)依賴的情況有所不同,在兩個(gè)bean之間的循環(huán)依賴將導(dǎo)致一個(gè)bean在被完全初始化的時(shí)候被注入到另一個(gè)bean中。

分享題目:java代碼注入 java注入是什么意思
文章鏈接:http://muchs.cn/article4/doecsie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站企業(yè)網(wǎng)站制作、App設(shè)計(jì)品牌網(wǎng)站制作、虛擬主機(jī)用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司