可能标题不准确,描述一下问题:
有这么一个接口:
public interface InterceptorPredicate {
default boolean allowed(HttpServletRequest request) {
return true;
}
}
然后有个拦截器:
public class MyInterceptor implements HandlerInterceptor {
private InterceptorPredicate predicate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (predicate.allowed(request)) {
do something...
}
return true;
}
public MyInterceptor(InterceptorPredicate predicate) {
this.predicate = predicate;
}
}
我要怎么样做到说如果外部有实现了InterceptorPredicate
的bean,那么就用外部的,否则用默认的实现类?
就像DataSource
可以用spring自己默认的,也可以用自定义的一样。
这个可以用 FactoryBean 来解决
业务类依赖 FactoryBean, FactoryBean 里面的 getObject 方法根据实际情况构造需要的对象 (例如你可以在那里访问 ApplicationContext, 能捞得到对象就返回捞到的对象, 否则则自己 new 一个)
另外实际上 MyBatis 也用到了这个 (SqlSessionFactoryBean等等等)