Spring中可以异步执行代码,注解方式是使用@Async注解。
原理、怎么使用,就不说了。
写2点自己遇到过的问题。
1.方法是公有的
// 通知归属人
@Async
public void notifyPusher(Project project) {
}
2.异步代码,需要放在外部单独的类中。
@Service("asyncBiz")
public class AsyncBiz {
@Async
public void notifyPusher(Project project) {
}
}
据说这是一个“常识”,外部方法才会被Spring拦截器拦截到额。
代码调用示例
@Service
public class ProjectServiceImpl implements ProjectService{
public void audit(long id, short status) {
if(project.getPusher() != null){
AsyncBiz asyncBiz = SpringContextUtil.asyncBiz();
asyncBiz.notifyPusher(project);
asyncBiz.notifyCare(project);
}
}
}
一个工具类
@Component
public class SpringContextUtil implements ApplicationContextAware{
private static ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.ctx = applicationContext;
}
public static ApplicationContext getCtx(){
return ctx;
}
public static Object getBean(String name) throws BeansException {
return ctx.getBean(name);
}
public static AsyncBiz asyncBiz() throws BeansException {
return (AsyncBiz) ctx.getBean("asyncBiz");
}
}
可以灵活手动获得Spring容器中的bean,也可以很好地解决循环依赖问题。