导航:首页 > 编程语言 > 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代码注入相关的资料

热点内容
海康摄像萤石云服务器 浏览:814
安卓手机怎么改安卓版名 浏览:147
雅思听力807词汇pdf 浏览:897
黄豆私人加密 浏览:192
java分钟转换小时 浏览:245
易语言服务器如何提高 浏览:591
网站主机服务器地址查看 浏览:859
算法学不会能当程序员吗 浏览:119
程序员技术交流研究 浏览:814
javaresponse文件 浏览:734
linuxrar压缩文件夹 浏览:218
魅蓝手机连接不上服务器怎么回事 浏览:379
工行app怎么改已绑定银行卡 浏览:533
oppo芯片程序员 浏览:602
oppok3应用怎么加密 浏览:327
电脑软盘怎么加密码 浏览:815
服务器光交换机有什么用 浏览:708
app上怎么拍蛙小侠 浏览:217
志高聊天app怎么下载 浏览:635
邮政app怎么不能扫付款码 浏览:559