spring動態調用方法


有的時候為了程序的靈活性,需要根據參數動態的調用方法。代碼框架大致spring為主,下面是具體代碼:

接口:

 


實現類(實現類中有一個從spring容器中取的對象)

 


這是最初我直接用反射去調用的代碼:

Object obj = Class.forName("com.rw.article.service.pay.impl.WithdrawalsServiceProxyImpl").newInstance();
log.info("obj [ {} ] " ,obj);
obj.getClass().getDeclaredMethod("test",String.class).invoke(obj,"zs1");


打印結果如下:

 


可以看到直接用反射需要從spring容器獲取的那個對象是不能被注入的,那么只能換一種方式。

可以拿到值的方式:

Class c2 = Class.forName("com.rw.article.service.pay.IWithdrawalsProxyService");
Object obj = BeansUtils.getBean("withdrawalsServiceProxyImpl",c2 );
// Object obj = Class.forName("com.rw.article.service.pay.impl.WithdrawalsServiceProxyImpl").newInstance();
log.info("obj [ {} ] " ,obj);
obj.getClass().getDeclaredMethod("test",String.class).invoke(obj,"zs1");

再看看BeansUtils.java的代碼:

@Component
public class BeansUtils implements ApplicationContextAware {

private static ApplicationContext context;

public static <T> T getBean(Class<T> bean) {
return context.getBean(bean);
}
public static <T> T getBean(String var1, @Nullable Class<T> var2){
return context.getBean(var1, var2);
}

public static ApplicationContext getContext() {
return context;
}

@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
BeansUtils.context = context;
}
}

BeansUtils實現了ApplicationContextAware 接口,在spring容器初始化完成后,這個類就可以方便地獲得 ApplicationContext 中的所有bean。換句話說,就是這個類可以直接獲取Spring配置文件中,所有有引用到的bean對象。這個只要把class(Class c2 = Class.forName(“com.rw.article.service.pay.IWithdrawalsProxyService”);)傳過來也可以實現動態調用某個類里面的方法

然后看這次的測試結果:


測試結果是能夠使用注解從spring容器中拿到對象的,要先從spring容器中拿到的對象,spring的那套注解才生效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM