How does spring get the concrete implementation class

quote


No spring injection method



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>China CITIC Bank Shanghai Branch Business Department</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)) { //Determine whether it is a proxy class
			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();
	}
	
}






quote


Spring injection method, inherits 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>China CITIC Bank Shanghai Branch Business Department</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)) { //Determine whether it is a proxy class
			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();
	}
	
}


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326223427&siteId=291194637