场景:先讲一下我的应用场景,避免大家看了半天跟自己的场景不同白白的浪费时间;
我使用动态加载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 该接口的具体实现就不需要在此列出了。