`
dannyhz
  • 浏览: 371691 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

spring 如何得到具体的实现类

 
阅读更多
引用


不用 spring 注入方式



package com.sunrun.console.service.impl;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.annotation.Resource;

import org.junit.Test;
import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sunrun.console.constant.SysCst;
import com.sunrun.console.service.ISettleService;
import com.sunrun.mpos.common.core.PropertiesHolder;

import org.junit.Assert;

public class SettleServiceImplTest{

	@Test
	public void suppose_bank_settle_no_is_null() throws Exception{
		
		ApplicationContext act = new ClassPathXmlApplicationContext(new String[]{"config/console-context.xml"});
		ISettleService settleService = (ISettleService)act.getBean(ISettleService.class);
		
		SettleServiceImpl ssi = (SettleServiceImpl)getTargetObject(settleService);;
		
		Method methodConfig = SettleServiceImpl.class.getMethod("configBankSettleNoAndName", StringBuffer.class);
		methodConfig.setAccessible(true); 
		
		StringBuffer result = new StringBuffer(""); 
				
		methodConfig.invoke(ssi, result);
		
		System.out.println(result.toString());
		
		System.out.println(PropertiesHolder.getValue(SysCst.SettleCst.SETTLE_BANK_NO));
		System.out.println(PropertiesHolder.getValue(SysCst.SettleCst.SETTLE_BANK_NAME));
		
		//String rs = "<bankSettleNo>888888888888</bankSettleNo><bankSettleName>中信银行上海分行营业部</bankSettleName>";
		String rs = "<bankSettleNo>7332410182600005752</bankSettleNo><bankSettleName>中信10321325</bankSettleName>";
		
		Assert.assertEquals(rs, result.toString());;
		
		
	}

	public static Object getTargetObject(Object proxy) throws Exception {

		if(!AopUtils.isAopProxy(proxy)) { //判断是否是代理类
			return proxy;
		}

		return getTargetObject(getProxyTargetObject(proxy));

	}


	private static Object getProxyTargetObject(Object proxy) throws Exception {
		Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
        h.setAccessible(true);
        AopProxy aopProxy = (AopProxy) h.get(proxy);
        Field advised = aopProxy.getClass().getDeclaredField("advised");
        advised.setAccessible(true);
        return  ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
	}
	
}






引用


spring 注入方式 , 继承 TestBase




package com.sunrun.tesbase;

import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import junit.framework.TestCase;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:config/console-context.xml" })
public class BaseTest extends TestCase {
    protected Logger logger = LoggerFactory.getLogger(getClass());

}
	


package com.sunrun.console.service.impl;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.annotation.Resource;

import org.junit.Test;
import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sunrun.console.constant.SysCst;
import com.sunrun.console.service.ISettleService;
import com.sunrun.mpos.common.core.PropertiesHolder;
import com.sunrun.tesbase.BaseTest;

import org.junit.Assert;

public class SettleServiceImplTestWithBase extends BaseTest{

	@Resource
	private ISettleService settleService;
	
	
	@Test
	public void suppose_bank_settle_no_is_null() throws Exception{
		
		SettleServiceImpl ssi = (SettleServiceImpl)getTargetObject(settleService);;
		
		Method methodConfig = SettleServiceImpl.class.getMethod("configBankSettleNoAndName", StringBuffer.class);
		methodConfig.setAccessible(true); 
		
		StringBuffer result = new StringBuffer(""); 
				
		methodConfig.invoke(ssi, result);
		
		System.out.println(result.toString());
		
		System.out.println(PropertiesHolder.getValue(SysCst.SettleCst.SETTLE_BANK_NO));
		System.out.println(PropertiesHolder.getValue(SysCst.SettleCst.SETTLE_BANK_NAME));
		
		//String rs = "<bankSettleNo>888888888888</bankSettleNo><bankSettleName>中信银行上海分行营业部</bankSettleName>";
		String rs = "<bankSettleNo>7332410182600005752</bankSettleNo><bankSettleName>中信10321325</bankSettleName>";
		
		Assert.assertEquals(rs, result.toString());;
		
		
	}

	public static Object getTargetObject(Object proxy) throws Exception {

		if(!AopUtils.isAopProxy(proxy)) { //判断是否是代理类
			return proxy;
		}

		return getTargetObject(getProxyTargetObject(proxy));

	}


	private static Object getProxyTargetObject(Object proxy) throws Exception {
		Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
        h.setAccessible(true);
        AopProxy aopProxy = (AopProxy) h.get(proxy);
        Field advised = aopProxy.getClass().getDeclaredField("advised");
        advised.setAccessible(true);
        return  ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
	}
	
}


分享到:
评论

相关推荐

    Spring实现AOP的四种方式

    2. 配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象 3. 通过来配置(纯POJO切面) 4. 通过来配置,使用AspectJ的注解来标识通知及切入点

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》第1版不仅在内容上获得了读者的广泛好评,而且在销量上也摘取了同类书的桂冠,曾经一度掀起Java类图书的销售热潮。第2版不仅继承了第1版在内容组织和写作...

    SPRING技术内幕:深入解析SPRING架构与设计原理

    本书第1版不仅在内容上获得了读者的广泛好评,而且在销量上也摘取了同类书的桂冠,曾经一度掀起Java类图书的销售热潮。第2版不仅继承了第1版在内容组织和写作方式上的优点,而且还根据广大读者的反馈改进了若干细节...

    spring.net中文手册在线版

    12.2.3.Spring.NET提供的切入点实现类 12.2.3.1.静态切入点 12.2.3.2.动态切入点 12.2.4.自定义切入点 12.3.Spring.NET的通知类型 12.3.1.通知的生命周期 12.3.2.通知类型 12.3.2.1.拦截环绕通知 12.3.2.2.前置通知 ...

    深入解析Spring架构与设计原理

    本书第1版不仅在内容上获得了读者的广泛好评,而且在销量上也摘取了同类书的桂冠,曾经一度掀起Java类图书的销售热潮。第2版不仅继承了第1版在内容组织和写作方式上的优点,而且还根据广大读者的反馈改进了若干细节...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) 决战大数据时代!IT技术人员不得不读! 计文柯 著

    本书第1版不仅在内容上获得了读者的广泛好评,而且在销量上也摘取了同类书的桂冠,曾经一度掀起Java类图书的销售热潮。第2版不仅继承了第1版在内容组织和写作方式上的优点,而且还根据广大读者的反馈改进了若干细节...

    Spring系统的安全管理

     Spring Security完成验证工作的主要类是AuthenticationManager,即上面介绍的过滤器。这个过程从AuthenticationProcessingFilter拦截HTTP请求开始,接着,会从HTTP请求中得到用户输入的用户名和密码,并将这些输入...

    spring入门 aware接口实现

    通过aware接口,可以对spring相应...首先创建一个类,实现ApplicationContextAware接口 , 该借口需要实现 setApplicationContext方法,该方法的参数由容器传递进来。 这样,bean 就获得了ApplicationContext这个资源

    Spring中文开发指南

    通常,模式书籍与wikis通常都列出了你可以获得的最佳实践,不过,希望你思考之后,在你自己的应用中 实现自己的模式。 Spring的IoC控件主要专注于如何利用classes、对象和服务去组成一个企业级应用,通过规范的...

    Spring攻略(第二版 中文高清版).part1

    第1章 Spring简介 1 1.1 实例化Spring IoC容器 1 1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用...

    Spring技术内幕:深入解析 Spring架构与设计原理

    本书第1版不仅在内容上获得了读者的广泛好评,而且在销量上也摘取了同类书的桂冠,曾经一度掀起Java类图书的销售热潮。第2版不仅继承了第1版在内容组织和写作方式上的优点,而且还根据广大读者的反馈改进了若干细节...

    spring源代码解析

    而一般的启动过程,Spring会使用一个默认的实现,XmlWebApplicationContext – 这个上下文实现作为在web容器中的根上下文容器被建立起来,具体的建立过程在下面我们会详细分析。 Java代码 public class ...

    spring+springmvc+mybatis的整合

    但是有一些部分自己没有能完成,主要是如何从spring容器里取出ApplicationContext,这个我的实现比较low,看了看讲义,才OK的。 我的实现: [java] view plain copy WebApplicationContext acc = ...

    Spring.net框架

    从中我们可以看出,我们实现了一个IocInCSharp.ConfigHandler类,用来处理配置文件中IocInCSharp\ objects结点中的内容。ConfigHandler类将根据该结点下的内容处理并创建一ConfigInfo对象(关于ConfigInfo、 ...

    spring security 参考手册中文版

    29.4实现类 223 29.4.1 LdapAuthenticator实现 224 通用功能 224 认证者 225 PasswordComparisonAuthenticator 225 29.4.2连接到LDAP服务器 225 29.4.3 LDAP搜索对象 225 FilterBasedLdapUserSearch中 225 29.4.4 ...

    Spring Security 中文教程.pdf

    19.4. 实现类 19.4.1. LdapAuthenticator实现 19.4.1.1. 常用功能 19.4.1.2. BindAuthenticator 19.4.1.3. PasswordComparisonAuthenticator 19.4.1.4. 活动目录认证 19.4.2. 链接到LDAP服务器 19.4.3...

    Spring技术内幕:深入解析Spring架构与设计原理

    本书第1版不仅在内容上获得了读者的广泛好评,而且在销量上也摘取了同类书的桂冠,曾经一度掀起Java类图书的销售热潮。第2版不仅继承了第1版在内容组织和写作方式上的优点,而且还根据广大读者的反馈改进了若干细节...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    第1版不仅在内容上获得了读者的广泛好评,而且在销量上也摘取了同类书的桂冠,曾经一度掀起Java类图书的销售热潮。第2版不仅继承了第1版在内容组织和写作方式上的优点,而且还根据广大读者的反馈改进了若干细节上的...

    Spring Framework 开发参考手册

    通常,模式书籍与wikis通常都列出了你可以获得的最佳实践,不过,希望你思考之后,在你自己的应用中 实现自己的模式。 Spring的IoC控件主要专注于如何利用classes、对象和服务去组成一个企业级应用,通过规范的...

Global site tag (gtag.js) - Google Analytics