如果项目中引入的是pagehelper-spring-boot-starter包,可能会遇到SqlSession拦截器执行顺序的问题。starter模式下,PageHelper在PageHelperAutoConfiguration里进行的配置,这样就不能手动设置拦截器的顺序。Mybatis拦截器是先添加的后执行,因此可以采用观察者模式在Spring容器初始化完成之后再添加自定义的拦截器。Spring提供了一个这样的接口:
在这里插入图片描述
自定义的Listener代码如下:

@Component
public class SqlSessionListener implements ApplicationListener<SqlSessionEvent> {

    @Autowired
    private List<SqlSessionFactory> sqlSessionFactoryList;

    @Override
    public void onApplicationEvent(SqlSessionEvent event) {
        for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
            sqlSessionFactory.getConfiguration().addInterceptor(new MyInterceptor());
        }
        System.out.println();
    }
}

这里需要自定义一个Event,这个Event要继承ApplicationEvent,代码如下:

public class SqlSessionEvent extends ApplicationContextEvent {

    /**
     * Create a new ContextStartedEvent.
     *
     * @param source the {@code ApplicationContext} that the event is raised for
     *               (must not be {@code null})
     */
    public SqlSessionEvent(ApplicationContext source) {
        super(source);
    }
}

这个Event通过ApplicationContext发布出去即可。

public class TestApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(TestApplication.class, args);
        context.publishEvent(new SqlSessionEvent(context));
    }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐