导航:首页 > 编程语言 > java注入类

java注入类

发布时间:2022-08-25 02:39:28

‘壹’ 什么是 注入类、宿主类(java

注入类是被引用的类,宿主类应该是引用注入类的类。一般用XML文件或Annotation调用,ejb3.0是使用这个比较多的框架,用这个就不用传统的jndi了,其实原理是一样的,只是现在的架构给封装好了。好像是叫IOC模式,比较好用,可以省些代码,不过引用的注入类必须是受容器管制类。

‘贰’ javaee中的类想要注入到springmvc中如何做

指使用反射相于我自编写spring框架使用反射根据字节码class文件态java类象即创建实例实例象交给想给controll类概思路 ------希望采纳毕竟我纯手

‘叁’ 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循环注入的问题该怎么解决

加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也是基于反射的
解析xml 根据类路径得到class(Class.forName) 然后根据你给的property通过getField拿到Field
再实例化 再赋值

‘陆’ 求JAVA 注入进程的例子

此代码注入非依赖注入,是hack里的代码注入

场景是这样滴:

机器上有一个java进程,我不想停止它,但我想把一段代码植入进去,干

一些事情(获取一些信息,改变一些值,监控一些东西,或者其它猥琐的事情)

这个进程不能停,而且也没有预料到现在的事情,或者这个进程的代码完全不能修改。

好,这篇文章是要干这个事情,它基于jvm的jdi或者jvmti接口

这里用的jvmti,jdi也可以,麻烦不少

应该jdk1.5就有,需要用c写。1.6支持另一种方式,java也可以写

以前做过类似的事情,代码找不到了,现在有实现了一番。

直接上代码:

被注入的代码是这样滴:

while(true) {
System.out.println(System.currentTimeMillis());
Thread.sleep(1000);
}


每隔一秒输出当前时间,只是示意用。不管什么java程序都行

我要注入的类,那个方法是固定的:

package com.zms.inject;
import java.lang.instrument.Instrumentation;
public class MyAgent1 {
public static void premain(String s) {
premain(s, null);
}
public static void premain(String s, Instrumentation instru) {
System.out.println("I'm injected! 木哈哈哈哈哈");
System.out.printf("param: %s ", s);
}
public static void agentmain(String args, Instrumentation inst) {
premain(args, inst);
}
public static void agentmain(String args) {
premain(args);
}
}


编译,打入jar包

MANIFEST.MF

Manifest-Version:1.0

Created-By:1.6.0_26(AppleInc.)

Agent-Class:com.zms.inject.MyAgent1

Premain-Class:com.zms.inject.MyAgent1

操作代码:

import com.sun.tools.attach.*;
import com.sun.tools.attach.spi.AttachProvider;
VirtualMachine vm=VirtualMachine.attach("24862"); //target java process pid
System.out.println(vm);
vm.loadAgent("/Users/zms/workspace/mt/out/proction/agent1.jar","Powered by zms!");
Thread.sleep(1000);
vm.detach();

目标程序结果:

1317283652520

1317283653520

1317283654521

I'minjected!木哈哈哈哈哈

param:Poweredbyzms!

1317283655521

1317283656522

‘柒’ 如何利用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程序培训价格,欢迎向我们的在线老师进行详细了解。

‘捌’ 如何在Spring中注入Java集合类

//普通javabean
publicclassNotificationBean{
publicMaphobby;

publicMapgetHobby(){
returnhobby;
}

publicvoidsetHobby(Maphobby){
this.hobby=hobby;
}
}
<!--配置文件application-spring.xml-->
<beanid="notificationBean"class="com.straw.spring.beans.NotificationBean">
<propertyname="hobby">
<map>
<entrykey="a"value="a"/>
<entrykey="b"value="b"/>
</map>
</property>
</bean>
//java测试类
publicclassMainTest{
publicstaticvoidmain(String[]args){
=("application-spring.xml");
=(NotificationBean)ap.getBean("notificationBean");
Maphobby=notificationBean.getHobby();
Set<String>set=hobby.keySet();
for(Strings:set){
System.out.println(s+":"+hobby.get(s));
}
}
}
//运行结果
a:a
b:b

‘玖’ 如何通俗的理解java的依赖注入

假设你编写了两个类,一个是人(Person),一个是手机(Mobile)。
人有时候需要用手机打电话,需要用到手机的callUp方法。
传统的写法是这样:
Java code
public class Person{
public boolean makeCall(long number){
Mobile mobile=new Mobile();
return mobile.callUp(number);
}
}
也就是说,类Person的makeCall方法对Mobile类具有依赖,必须手动生成一个新的实例new Mobile()才可以进行之后的工作。
依赖注入的思想是这样,当一个类(Person)对另一个类(Mobile)有依赖时,不再该类(Person)内部对依赖的类(Moblile)进行实例化,而是之前配置一个beans.xml,告诉容器所依赖的类(Mobile),在实例化该类(Person)时,容器自动注入一个所依赖的类(Mobile)的实例。
接口:
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文件中配置依赖关系
Java code
<bean id="person" class="Person">
<property name="mobileInterface">
<ref local="mobileInterface"/>
</property>
</bean>
<bean id="mobileInterface" class="Mobile"/>
这样,Person类在实现拨打电话的时候,并不知道Mobile类的存在,它只知道调用一个接口MobileInterface,而MobileInterface的具体实现是通过Mobile类完成,并在使用时由容器自动注入,这样大大降低了不同类间相互依赖的关系。
java依赖注入的方法:set注入,构造方法注入,接口注入。

‘拾’ java类注入到另一个

方法如下:
如果另一个类是在写的java文件夹下,就直接new一个对象,然后调用方法就好,如果不是在本文件夹下,就需要在代码最前面添加该包,然后new对象,最后调用方法。

阅读全文

与java注入类相关的资料

热点内容
编译原理代码在哪里运行 浏览:584
解密摄影pdf 浏览:72
算法编程中级题目 浏览:249
c语言编译器毕业设计 浏览:715
医保卡申请app哪个好 浏览:944
阿里云服务器上传源码 浏览:602
营销管理科特勒pdf 浏览:696
愿望清单app哪个好 浏览:459
安卓外放声音怎么解决 浏览:195
脉脉app干什么用的 浏览:360
拽姐是哪个app 浏览:861
云服务器删除了还有吗 浏览:234
macbook可以用单片机嘛 浏览:309
南阳php招聘 浏览:818
去哪里找按摩师很漂亮的app 浏览:821
86x99用简便算法计算 浏览:833
php截图flash 浏览:276
卸载联想app哪个好 浏览:722
php文字转图片 浏览:332
豆客后台怎么加密码 浏览:577