创建一个springbootUtil类获取springboot上下文,获取springboot上下文中的bean,在bean上执行具体的业务逻辑。
SpringBootUtil.java
package springBootPlugin;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringBootUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringBootUtil.applicationContext == null) {
SpringBootUtil.applicationContext = applicationContext;
}
}
//获取应用上下文。
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//按名称获取一个 bean。
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//按类获取一个bean。
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//按名称和 Clazz 返回指定的 bean。
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
创建一个可以处理任何业务逻辑的简单线程类。
ProjectRealTask.java
package springBootPlugin;
import org.springframework.stereotype.Component;
@Component
public class ProjectRealTask implements Runnable {
@Override
public void run() {
System.out.println("test ProjectRealTask");
}
}
创建一个主调用类,在调用类中获取springbootUtil中的bean,执行bean内部的业务逻辑,实现对业务逻辑的插件化管理。
ProjectThread.java
package springBootPlugin;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
@Component
public class ProjectThread {
//这里需要调用一些bean,第三方业务逻辑或者插件。
public void runThreadTaskLogic(){
//创建一个线程池。
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(10);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(100);
taskExecutor.setThreadNamePrefix("TestExecute_");
taskExecutor.initialize();
//按类名获取 bean。
ProjectRealTask realTask = SpringBootUtil.getBean(ProjectRealTask.class);
//具体的 bean 操作。
taskExecutor.submit(realTask);
}
}
这种方式非常适合多任务、多线程的业务逻辑场景,让bean的管理更加灵活方便。