spring 拦截器的实现

本文介绍 Spring AOP 框架中的拦截器功能,通过示例展示如何使用前置通知在方法调用前执行自定义行为。讨论了拦截器在日志处理、编码转换和权限检查等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  spring 拦截器是spring AOP体系下的一个重要的子功能。它类似于web中的filter,但又比filter灵活,强大得多。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。(见 Spring Framework 开发参考手册第6章),拦截功能是spring AOP实现面向切面编程的一个亮点,我们这里通过一个示例来看看如何使用拦截功能的:

这个例子是通过拦截指定的bean,在外部调用他们其中的方法被之前将触发拦截器。
首先,编写一个个拦截器:SpringAOPInterceptor.java
public class SpringAOPInterceptor implements MethodBeforeAdvice {

public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("The Interceptor method name is: "
+ method.getDeclaringClass().getName() + "."
+ method.getName());
String value = "";
for(int i=0;ilength;i++){
value += args[i].toString()+"&";
}
System.out.println( "The method parames is:" +value);
System.out.println( "The target class is:" + target.getClass().getName());
}
该拦截器使用的是前置通知(before advice),它可以在该切入点也就是调用该方法前执行自定义的行为,但不能在切入点处理完返回过程中执行拦截,也就没办法改变切入点的返回值.如果想使用其他切入点进行拦截,可以查看org.springframework.aop包(Spring的通知API)下的其他类.
随后,我们可以编写几个需要被拦截的类,这里,我不再提供了,大家随便写个test类吧^_^.
最后,需要把拦截器注册到bean容器(applicationcontext.xml)内.并把要拦截的bean一起注入到自动代理bean定义类org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator中.
例子如下:
<bean name="logger"  class="com.comwave.sc.form.ao010.test.SpringAOPInterceptor"method="dispose"
<bean name= "loggingAutoProxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
<property name= "beanNames"
    <value>userDAO</value><!-- 在这里可以声明多个需要拦截的bean -->
</property>
<property name= "interceptorNames"
  <list>
  <value>logger</value><!-- 同样,在这里可以声明多个拦截器,注意次序前后 -->
 </list>
</property>
</bean>

拦截器在spring中一般都是用来类似过滤器的功能,如日志处理、编码转换、权限检查等。以后仍会对spring的拦截器进行更加深入的研究。

 
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
### MyBatis-Plus 分页拦截器失效解决方案 #### 配置分页插件 为了使 MyBatis-Plus分页功能正常工作,确保正确配置 `MybatisPlusInterceptor` 插件。对于 PostgreSQL 数据库,应如下所示初始化并添加分页内嵌拦截器: ```java // 创建 Mybatis Plus 拦截器实例 MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加分页内嵌拦截器,并指定数据库类型为 PostgreSQL interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); sqlSessionFactory.setPlugins(new Interceptor[]{interceptor}); ``` 上述代码片段展示了如何针对特定类型的数据库(这是 PostgreSQL)设置分页插件[^4]。 #### 处理多数据源场景 当应用程序涉及多个数据源时,需特别注意分页插件的注册位置。如果仅在一个全局配置文件中声明了分页插件,则可能导致其他数据源未能应用此插件分页失败的情况。因此,在每个数据源对应的 SQL Session Factory 中都应当单独配置分页插件。 #### 自定义拦截器的影响 有时开发者可能会实现自己的自定义拦截器来增强某些特性或满足特殊需求。然而,这些额外的拦截器可能干扰到默认提供的 `PaginationInterceptor` 正常运作。特别是那些未充分考虑 SELECT COUNT(*) 查询逻辑的情况下,容易造成总记录数统计错误等问题。建议仔细审查任何入的应用程序级别的SQL拦截机制,确认其会影响原有分页行为[^3]。 #### 测试与验证 完成以上调整之后,务必通过单元测试或其他方式验证分页查询能否按预期返回正确的结果集大小以及总数信息。这一步骤有助于及时发现问题所在并作出相应修正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值