導航:首頁 > 編程語言 > java代碼注入

java代碼注入

發布時間:2023-03-10 08:16:23

java循環注入的問題該怎麼解決

加AOP能解決spring IoC的循環引用。

循環引用是你配置bean的時候,構建方式上出了錯。比如,創建A對象的時候,你引用到了B,而創建B對象的時候,你又引用到了A。你仔細檢查下你的構造器

循環依賴——在採用構造器注入的方式配置bean時,很有可能會產生循環依賴的情況。比如說,一個類A,需要通過構造器注入類B,而類B又需要通過構造器
注入類A。如果為類A和B配置的bean被互相注入的話,那麼Spring IoC容器將檢測出循環引用,並拋出

異常。對於此問題,一個可能的解決方法就是修改源代碼,將某些構造器注入改為

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

⑵ java在抽象類中注入屬性架構設計

題主是在用spring做注入?

抽象類是可以用spring注入屬性的。我的代碼中有個這樣的例子:
<bean id="BaseEventAction" class="com.sinosig.evaluation.fcff.web.event.BasicEventAction"
abstract="true" parent="BaseAction">
<property name="rowFactory" ref="FcffCacheAdapter" />
<property name="caculate" ref="CaculateService" />
<property name="diffusion" ref="DeffusionService" />
</bean>

<bean id="MethodChangedAction"
class="com.sinosig.evaluation.fcff.web.event.MethodChagedAction"
scope="prototype" parent="BaseEventAction" />

public abstract class BasicEventAction extends BaseAction implements
EventAction {

……

}

public class MethodChagedAction extends BasicEventAction {
……

}

spring框架中的 abstract="true" 是告訴spring框架不要去實例化這個類而已。但是在spring的配置中,仍然會有相關的注入屬性的配置。子類的配置會繼承父類的配置,然後spring框架再根據子類的最終配置去實例化和注入。

⑶ 如何利用Java實現資源注入

Java的功能強大,今兒博洋教育將給大家介紹。 需求:一個應用有兩個資料庫,分別為DB-A,DB-B。 假設持久層框架使用iBatis來實現,那麼SqlMapClient對象在創建時,對於兩個不同的DB連接要有兩個不同的SqlMapClient對象, 假設我們有一個Service類為MyService.java,該類中有兩個SqlMapClient對象sqlMapA、sqlMapB分別對應著DB-A、DB-B。 先看看我們的SqlMapClient.java類:(自定義SqlMapClient類,用來演示。) 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方法 略 // 用於演示查詢後返回一個String的返回結果 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類實現: 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資料庫取得數據 public String selectForObjectFromB(String sql, Map in) { return sqlMapB.selectForObject("", null); } // 模擬在DB-A資料庫取得數據 public String selectForObjectFromA(String sql, Map in) { return sqlMapA.selectForObject("", null); } } 接下來就是我們的註解類: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"; // 連接的資料庫類型 A or B String sqlMap() default ""; // Sql-Map-Config文件的路徑,用於載入iBatis的SqlMapClient對象 } 定義資源注入的介面 IFieldWiring.java。 之所以這里要定義這個介面,是為了以後擴展用,我們很方便的定義更多的自定義註解。 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(); } } } } 已經基本大功告成了,只要將我們的DataSourceWiring.java類使用起來即可。 MyAnnotationBeanProcessor.java,這個類主要用於為bean對象注入資源。 import java.lang.reflect.Field; public class MyAnnotationBeanProcessor { /** * 注入資源 * @param serviceObject * @param fieldAutoWirings // 所有實現IFieldWiring的介面的對象,我們可以在此擴展 * @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; } } } } } 好了,開始我們的測試類: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)); } } 執行結果: SqlMapClient[sqlMap=com/annotation/sql-map-config-B.xml,type=B] SqlMapClient[sqlMap=com/annotation/sql-map-config-A.xml,type=A] 由執行結果可以說明DataSource資源已經被我們正確的注入了。 如果想擴展的話,只需要新建一個類實現IFieldWiring介面即可。假設叫InParamWiring.java,實現了介面定義的兩個方法後,在使用的時候,只要用以下代碼便可將資源注入了: MyAnnotationBeanProcessor processor = new MyAnnotationBeanProcessor(); MyService b = new MyService(); processor.wire(b, new DataSourceWiring(), new InParamWiring()); // 注入DataSource、InParam資源. 更多Java學習技巧,盡在博洋教育。若您想了解java程序培訓價格,歡迎向我們的在線老師進行詳細了解。

⑷ java類注入到另一個

方法如下:
如果另一個類是在寫的java文件夾下,就直接new一個對象,然後調用方法就好,如果不是在本文件夾下,就需要在代碼最前面添加該包,然後new對象,最後調用方法。

⑸ 什麼是 注入類、宿主類(java)

注入類是被引用的類,宿主類應該是引用注入類的類。一般用XML文件或Annotation調用,ejb3.0是使用這個比較多的框架,用這個就不用傳統的jndi了,其實原理是一樣的,只是現在的架構給封裝好了。好像是叫IOC模式,比較好用,可以省些代碼,不過引用的注入類必須是受容器管制類。

閱讀全文

與java代碼注入相關的資料

熱點內容
程序員面試學歷太重要了 瀏覽:418
excel轉pdf不全 瀏覽:507
命令任務管理器 瀏覽:206
phparrayrecursive 瀏覽:710
天狼程序麻將機app怎麼下載 瀏覽:893
多行文字命令里怎麼弄每行三個字 瀏覽:556
方舟mod伺服器是什麼 瀏覽:989
怎麼下載智悲佛網的app 瀏覽:33
android地面站 瀏覽:484
apexsteam伺服器連接失敗怎麼辦 瀏覽:79
空調制熱外機風扇轉的慢壓縮機響 瀏覽:78
單片機為什麼有蜂鳴聲 瀏覽:763
windowsdos目錄命令 瀏覽:38
html博客源碼下載 瀏覽:115
android內核版本獲取 瀏覽:224
省錢app怎麼樣 瀏覽:588
活塞式壓縮機的優點 瀏覽:173
Android登錄記住狀態 瀏覽:632
雲伺服器狀態異常 瀏覽:345
bock壓縮機 瀏覽:569