`
gigi_112
  • 浏览: 114297 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

拦截类型的拦截器

阅读更多

 

先给大家介绍一种拦截方式:拦截类型的拦截器。故名思议:比如我想拦截所有com.xx.xx.ConsumerBean,要是单独拦截某些beanId会显的很笨重,那么提供一种拦截器,拦截类型。代码如下:

 

/**
 * Created by IntelliJ IDEA.
 * User: guzhen.cg
 * Date: 13-4-10
 * Time: 下午3:15
 * To change this template use File | Settings | File Templates.
 */


import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

import org.springframework.aop.TargetSource;
import org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.Assert;
import org.springframework.util.PatternMatchUtils;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.ContextLoaderListener;

/**
 * 类BeanTypeAutoProxyCreator.java的实现描述:使用配置类型代替Springframework中配置名称的实现
 *
 * @author guzhen.cg 2013-04-18  晚上11:40
 */
public class BeanTypeAutoProxyCreator extends BeanNameAutoProxyCreator implements InitializingBean, ApplicationContextAware  {

    private static final long  serialVersionUID = -9094985530794052264L;

    private Class<?>           targetBeanType;

    private ApplicationContext context;

    /**
     * @param targetClass the targetClass to set
     */
    public void setTargetBeanType(Class<?> targetClass) {
        this.targetBeanType = targetClass;
    }

    public void setApplicationContext(ApplicationContext context) {
        this.context = context;
    }

    /**
     * Return if the given bean name matches the mapped name.
     * <p>
     * The default implementation checks for "xxx*", "*xxx" and "*xxx*" matches, as well as direct equality. Can be
     * overridden in subclasses.
     *
     * @param beanName the bean name to check
     * @param mappedName the name in the configured list of names
     * @return if the names match
     * @see org.springframework.util.PatternMatchUtils#simpleMatch(String, String)
     */
    protected boolean isMatch(String beanName, String mappedName) {
        return PatternMatchUtils.simpleMatch(mappedName, beanName);
    }

    public void afterPropertiesSet() throws Exception {
        Assert.notNull(targetBeanType, "targetType cannot be null");
        String[] beanNames =context.getBeanNamesForType(targetBeanType, true, false);
//        String[] beanNames = context.getBeanNamesForType(targetBeanType);    //太坑爹,不要初始化bean
        if (beanNames == null) {
            logger.warn("can not found suit bean by " + targetBeanType );
            return ;
        }
        String[] result = new String[beanNames.length];
        for (int i = 0; i < beanNames.length; i++) {
            result[i] = beanNames[i].substring(1);      //截取第一个字符&
        }
        super.setBeanNames(result);
    }

}

  

 

    这个拦截器很简单,继承beanname自动拦截器,实现了ApplicationContextAware接口,获得程序中的context。这时走了一个很大的弯路,通过context获取需要拦截的beanID时,如果第三个参数allowEagerInit(渴望初始化)用默认值:true,则此时会去初始化部分bean,造成程序中出现其他拦截器失效的问题。

 

分享到:
评论

相关推荐

    MyBatis拦截器:给参数对象属性赋值的实例

    如果操作类型是这两种之一,拦截器就会继续进行属性赋值。否则,它会跳出循环,不进行额外操作。 在实际赋值部分,由于示例代码没有给出具体的赋值逻辑,通常这会涉及到反射(`java.lang.reflect.InvocationTarget...

    mybatis 分页拦截器及拦截器配置

    MyBatis 分页拦截器是实现数据库查询分页效果的一种高效解决方案。在传统的SQL查询中,我们通常需要手动编写分页语句,但这容易出错且不易维护。通过使用分页拦截器,我们可以将分页逻辑封装起来,使得在编写Mapper...

    拦截器和过滤器的区别

    ### 拦截器与过滤器的区别 #### 一、概念简介 在现代软件开发过程中,特别是Web应用程序中,为了实现灵活高效的业务逻辑处理及控制流管理,常常会使用到两种设计模式:拦截器(Interceptor)与过滤器(Filter)。...

    struts拦截器的例子

    Struts拦截器是Java Web开发中的重要概念,尤其在基于Struts 2框架的应用中扮演着核心角色。这个"struts拦截器的例子"提供了一个学习和理解拦截器工作原理的起点,非常适合对这一主题感兴趣的初学者。 Struts 2框架...

    struts2类型转换 拦截器 校验的例子

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括类型转换、拦截器和校验机制。本文将深入探讨这些关键知识点,并通过实际例子来帮助你理解它们的工作原理和应用。 首先,我们来看看**类型转换...

    spirngmvc拦截器,拦截处理body和表单值.rar

    在Spring MVC框架中,拦截器(HandlerInterceptor)是一种强大的机制,用于在请求处理前后执行自定义逻辑。它们在控制器方法执行之前和之后运行,提供了一种灵活的方式来添加全局行为,如认证、授权、日志记录、性能...

    java拦截器_类型转换_国际化

    在Java开发中,拦截器(Interceptor)是一种设计模式,它允许开发者在某个方法或运算执行前后插入自定义的行为。这通常用于实现日志记录、事务管理、权限验证等任务,而无需修改目标方法的源码。Java的拦截器机制...

    封包拦截器MiniSniffer 1.0

    封包拦截器MiniSniffer 1.0是一款专为网络数据包捕获和分析设计的强大工具。它的核心功能在于无需DLL注入就能实现对特定IP地址或特定端口的封包拦截,这为网络监控、故障排查和安全审计提供了极大的便利。 一、封包...

    struts2自定义类型转换、拦截器实例练习

    本实例练习旨在帮助你深入理解Struts2的工作原理,特别是自定义类型转换和拦截器的使用。 首先,让我们详细探讨Struts2的MVC架构。在MVC模式中,Model代表业务逻辑,View负责展示数据,而Controller则是两者之间的...

    CXF使用EndpointImpl发布WebService加入拦截器

    拦截器在CXF中的工作原理基于JAX-WS规范,可以分为两种类型:`InInterceptors`(入站拦截器)和`OutInterceptors`(出站拦截器)。入站拦截器处理从客户端到服务器的消息,而出站拦截器则处理从服务器返回到客户端的...

    Spring拦截器,高级参数绑定

    在Spring框架中,拦截器(Interceptor)是一种强大的工具,它允许开发者在请求处理前后执行自定义逻辑,例如日志记录、权限检查等。Spring MVC中的拦截器是基于AOP(面向切面编程)原理实现的,可以理解为对...

    Struts拦截器案例——登陆

    6. **结果类型和重定向**:根据拦截器的判断结果,可以设置不同的`Result`类型。例如,如果用户未登录,可以设置一个`登 录`的结果类型,将请求重定向到登录页面;如果验证成功,可以设置`success`结果类型,继续...

    文件拦截器

    1. 验证文件类型:拦截器可以检查上传的文件类型,防止不安全或不受支持的文件被上传。 2. 限制文件大小:通过拦截器,可以设置文件上传的最大尺寸,防止大文件上传导致服务器资源耗尽。 3. 安全检查:拦截器可以对...

    struts2内置拦截器简介

    此拦截器用于处理类型转换失败的情况。如果请求参数不能正确地转换为Action中的属性类型,那么将会触发此拦截器。它会将转换失败的信息存储到`ActionContext`中,可以通过`ActionFieldError`对象获取这些信息。 ###...

    网页封包拦截器

    网页封包拦截器是网页封包拦截的利器,是一款完全免费的绿色国产软件,能让您事半功倍,而且是为数不多的几款支持Win7的拦截软件。 网页封包拦截器支持: 2000/XP/2003/Vista/2008/Win7 全系列系统 网页封包拦截器...

    统计时间的拦截器

    ### 统计时间的拦截器 #### 背景与目的 在软件开发过程中,特别是Web应用开发领域,性能监控是十分重要的一个环节。通过监控应用程序的运行时长,可以帮助开发者定位性能瓶颈、优化系统效率。本文将详细介绍如何在...

    拦截器、过滤器、参数读取坑记录

    在Java Web开发中,拦截器(Interceptor)和过滤器(Filter)是两种常见的处理请求和响应的机制。它们都在请求到达目标Servlet之前进行介入,但各自有着不同的应用场景和功能特点。参数读取则是从客户端传递到服务器...

    Spring3_AOP四种创建通知(拦截器)类型

    Spring_AOP四种创建通知(拦截器)类型,介绍的比较详细,有实例

    java拦截器

    在描述中提到的"可以拦截不同的浏览器",这通常意味着拦截器可能用于识别用户使用的浏览器类型,然后根据浏览器特性提供特定的处理。例如,你可能需要在拦截器中检查`User-Agent`头来确定用户是使用了Chrome、Fire...

Global site tag (gtag.js) - Google Analytics