插件代码
@Service
public class TService implements PService{
@Resource
private AService aService;
@Override
public String test(String name) {
System.out.println(name);
return name;
}
}
资源服务安装插件示例demo
spi协议实现
@Bean
public void install(){
Plugin plugin = new Plugin();
try {
plugin.setJarPath("D:\\00-project\\test\\plug-test\\target\\test-plug.jar");
File file = new File(plugin.getJarPath());
URLClassLoader classLoader = new URLClassLoader(new URL[]{file.toURI().toURL()});
ServiceLoader<PService> load = ServiceLoader.load(PService.class,classLoader);
PService next = load.iterator().next();
String a = next.test("a");
}catch (Exception e){
e.printStackTrace();
}
}
问题:获取到PService实现类注入spring容器方便管理。而PService依赖AService
非spi协议实现
Plugin plugin = new Plugin();
try {
plugin.setJarPath("D:\\00-project\\test\\plug-test\\target\\test-plug.jar");
File file = new File(plugin.getJarPath());
URLClassLoader classLoader = new URLClassLoader(new URL[]{file.toURI().toURL()});
Class<?> aClass = classLoader.loadClass("com.xiny.controller.TService");
Package aPackage = aClass.getPackage();
boolean assignableFrom = PService.class.isAssignableFrom(aClass);
}catch (Exception e){
e.printStackTrace();
}
spi 协议只加载规定目录下的字节码文件。有些时候不能按照spi协议去实现,比如需要动态加载卸载controller,service,甚至dao那么使用spi规定加载类很麻烦。所以我打算直接扫描jar下的所有bean然后进行依赖注入,发现controller注册到映射控制器
。求一个合理的解决方案,方法。