`
dannyhz
  • 浏览: 399371 次
  • 性别: 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();
	}
	
}


分享到:
评论

相关推荐

    springIoc实现原理

    依赖注入是IoC的一种具体实现方式,它允许对象在运行时动态地获得依赖。Spring支持三种类型的依赖注入: 1. **构造器注入**:通过构造函数传入依赖对象。 2. **设值注入**:使用setter方法注入依赖。 3. **接口注入...

    初探spring aop内部实现 java

    而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的实现。在Spring中,DataSource是用于存储和管理数据库连接的...

    Spring获取ApplicationContext对象工具类的实现方法

    在Spring中,典型的获取ApplicationContext对象的方式是使用ApplicationContext接口的一个实现类,如ClassPathXmlApplicationContext。这是一个根据给定XML文件的类路径的上下文实现。通常我们会在初始化Spring IoC...

    Spring3.0实现REST实例

    Spring框架,作为一个强大的Java企业级应用开发平台,自3.0版本开始,对RESTful服务的支持得到了极大的增强。本篇文章将深入探讨如何利用Spring 3.0来创建RESTful服务,并通过实例解析其核心概念和技术。 首先,...

    【42】使用dubbo、spring-boot等技术实现互联网后台服务项目架构视频教程 .txt

    - **服务提供者**:在Spring Boot项目中定义服务接口,并使用`@Service`注解标记服务实现类,再使用`@DubboService`注解暴露服务。 - **服务消费者**:同样在Spring Boot项目中定义服务接口,并使用`@Reference`注解...

    spring+rmi实现非本地部署

    4. 配置Spring:创建Spring配置文件,声明远程接口的bean,并设置其代理为RMI实现类。 客户端(client)则负责: 1. 获取远程对象:通过RMI的`lookup()`方法,根据远程接口的名称从RMI注册表获取远程对象。 2. 调用...

    Spring面试题大全

    而IoC的方法是只在类A中定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IoC的容器(Container)中,通过一定的配置由容器(Container)来实现类A与接口B的实现C的关联。 四、Spring对多种ORM框架...

    spring3.2 源码 jar包

    在本压缩包中,你将获得Spring 3.2版本的源码jar包,这对于开发者来说是一个宝贵的资源,可以深入理解Spring的工作原理,提高代码调试和优化的能力。 首先,让我们来了解一下Spring 3.2的主要特性: 1. **依赖注入...

    Spring boot实现用户登录,转盘,并将获得的奖励记录数据库的功能

    在本项目中,我们主要探讨如何使用Spring Boot框架来实现用户登录、转盘游戏功能以及相关的数据存储。Spring Boot以其简洁的配置和强大的依赖管理,成为现代Java Web开发的首选框架。下面我们将深入讨论这些关键知识...

    springboot spring aop 拦截器注解方式实现脱敏

    在Spring AOP中,我们可以定义一个`@Aspect`类,这个类包含若干个`@Before`,`@After`,`@Around`等注解的方法,这些方法会在相应的切点(pointcut)执行前、后或周围执行。在数据脱敏的场景下,我们可能需要在响应...

    Spring MVC jar包

    这表明我们不仅得到了Spring MVC的相关资源,还获得了Hibernate 3.6.8版本的资料,这是一个流行的Java对象关系映射(ORM)框架,用于简化数据库操作。 1. **Spring MVC**: - **基本概念**:Spring MVC提供了一个...

    spring揭秘(高清)

    总之,《Spring揭秘》是一本全面覆盖Spring框架各个方面的书籍,无论你是初学者还是经验丰富的开发者,都能从中获得宝贵的知识和实践经验,提升你的Spring技术水平。通过阅读这本书,你可以深入了解Spring的内在机制...

    Spring在应用中获得Bean的方法

    这通常用于实现类的懒加载或者运行时的选择。 6. **使用`ApplicationContextAware`接口** 实现`ApplicationContextAware`接口,可以获取到`ApplicationContext`的引用,然后通过它获取Bean。 ```java public ...

    spring 理解文件HibernateDaoSupport

    以上就是关于Spring与Hibernate集成的关键知识点,包括基本配置、HibernateDaoSupport与UserDaoHibernateImpl的区别,以及Spring+Struts+Hibernate集成的具体实现细节。这些内容有助于更好地理解和运用Spring框架与...

    spring-note spring 读书笔记

    Spring框架是Java开发中不可或缺的...通过这些笔记,开发者可以获得Spring框架的全面理解,并能熟练地将其与其他技术结合,构建高效且灵活的应用程序。学习和掌握这些内容将极大地提升Java开发者的技能和项目管理能力。

    Spring源代码解析(五):Spring_AOP获取Proxy.doc

    在Spring中,Advice可以是Before、AfterReturning、AfterThrowing以及MethodBeforeAdvice等接口的实现,它们分别代表在方法调用前、正常返回后、抛出异常后和方法调用前执行的额外行为。 2. **Pointcut**:切点,...

    spring4+hibernate4实现增删改查

    5. **服务层(Service Layer)**:在Spring框架中,我们创建服务接口和服务实现类。服务类将调用DAO层的方法,同时处理业务逻辑和异常。通过Spring的@Autowired注解,我们可以注入DAO实例,实现依赖注入。 6. **...

    最新spring官网下载jar包 spring-4.2.4(免费)

    Spring AOP(面向切面编程)是另一个关键特性,它允许开发者定义横切关注点,如日志记录、事务管理等,这些关注点可以跨多个类和方法应用。4.2.4版本的AOP支持更广泛的切面定义,包括基于注解的切面,使得代码更整洁...

    SpringBoot+SpringCloud面试题.doc

    - 通过继承`spring-boot-starter-parent`父项目,可以获得统一的版本管理和依赖管理。 - 导入`spring-boot-dependencies`作为依赖管理,简化项目构建配置。 7. **Spring Boot运行方式** - 打包成JAR/WAR运行,可...

    struts2与spring2的整合

    5. **Action类**:Action类需要实现Spring的`org.springframework.beans.factory.BeanNameAware`接口,以便在初始化时获取Bean的名字。此外,Action类无需包含构造函数,因为其实例化工作将由Spring完成。 6. **...

Global site tag (gtag.js) - Google Analytics