根据参数动态加载bean(一个接口多个实现的调用方法)

场景:先讲一下我的应用场景,避免大家看了半天跟自己的场景不同白白的浪费时间;

我使用动态加载bean是由于程序中有个接口需要根据不同的书商定制实现不同的导入图书功能,但接口定义都是一个,每个书商都去实现该接口,接口内部实现不同,再根据登录的书商不同去加载不同的方法。下面开始调用步骤:

以下只是我想到的办法,如有什么更好的方法可以私聊我,欢迎大家出谋献策,谢谢。

一、编写动态获取bean的工具类

package util;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import service.system.ImportExcelService;

/**
 * 动态加载bean util
 * 该类中主要作用:为书商批量导入图书和采集单所编写的不同的接口实现,根据书商的不同动态的加载不同的接口实现bean
 */
public class GetDynamicServiceUtil {

/**

* @param request
* @param companyId:需要动态导入bean的companyId,根据conpanyId加载不同的方法
* @return
*
*/
public static ImportExcelService getDynamicService(HttpServletRequest request,String companyId){
//serviceName 格式service.Impl.system.ImportExcelServiceImpl_3

//下面的PropertiesConfigManager.getInstance方法为获取.properties配置文件中的名字为serviceName的信息,“notFoun //d”为当找不到名字为serviceName的信息的默认值,可以在我的博客中找到读取.properties文件的方法

String serviceName = PropertiesConfigManager.getInstance(companyId+".properties").get("serviceName","notFound");
if("notFound".equals(serviceName)){
return null;
}

ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());  
ConfigurableApplicationContext context = (ConfigurableApplicationContext) ac;   
//Bean的实例工厂  
DefaultListableBeanFactory dbf = (DefaultListableBeanFactory) context.getBeanFactory();  
//Bean构建  要创建的Bean的Class对象  
BeanDefinitionBuilder dataSourceBuider = BeanDefinitionBuilder. genericBeanDefinition(serviceName);  
//拼接bean名字
String beanName = "importExcelService_"+companyId;
//将实例注册spring容器中    
dbf.registerBeanDefinition(beanName, dataSourceBuider.getBeanDefinition());  

//获取bean
ImportExcelService serviceImpl = (ImportExcelService)dbf.getBean(beanName); 
    
   return serviceImpl;     
}
}


二、测试

创建测试类,仅仅是做个栗子,实际上需要在controller层进行调用getDynamicService方法。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:spring-applicationContext.xml"})
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
@Transactional
public class TestOther {

@Test

public void testImport(){

//ImportExcelService 为接口,通过getDynamicService方法获取到的是该接口对用的实现类

//根据companyId动态的获取该书商所对应的解析excel表格的方法
ImportExcelService excelService = GetDynamicServiceUtil.getDynamicService(request,companyId);
List<Book> list = excelService.importBook(“此处为要导入的excel表格文件”);
//下面的importBook方法根据书商不同去调用不同的方法实现
  // List<Book> list=ExcelParse.importBook(file, request);//这里是解析excel文件
   
boolean result = bookManagerService.saveBookList(list,session.getAttribute("qrtraceName").toString(),Integer.parseInt(companyId),fileInfoTemp);
    

}

}

注:ImportExcelService 该接口的具体实现就不需要在此列出了。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值