有些时候可能需要动态调用spring方法,比如定时执行任务,自定义job 需要调用spring的函数
需要调用动态调用
思路:
1.通过springbean的name获取springbean
2.通过class获取方法
3.反射方式调用
我写了一个例子 亲测可用
/**
* 注解包含 @Service、@Repository、@Controller
* @ComponentScan(basePackages = "com.example.demo.dao")
@MapperScan(basePackages = "com.example.demo.dao")
* @author 周勇
*
*/
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableAutoConfiguration
public class Demo1 {
private static Logger log = LoggerFactory.getLogger(MyAspect.class);
public static void main(String[] args) {
log.debug("===============");
ConfigurableApplicationContext ac = SpringApplication.run(Demo1.class, args);
MyDao myDao = (MyDao) ac.getBean("myDao");
System.out.println("mydao="+myDao);
String result = myDao.query("111");
System.out.println("spring 调用返回="+result);
System.out.println(".................");
testSpringReflect();
}
public static void testSpringReflect(){
Object bean = SpringBootContextUtil.getBean("myDao");
try {
Method method = bean.getClass().getMethod("query", new Class[]{String.class});
Object result = method.invoke(bean, "1");
System.out.println("spring 反射调用返回="+result);
} catch (Exception e) {
e.printStackTrace();
}
}
@Component("springContextUtil")
public class SpringBootContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext; // Spring应用上下文环境
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringBootContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) applicationContext.getBean(name);
}
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<?> clz) throws BeansException {
return (T) applicationContext.getBean(clz);
}
}