`

简单拦截器(spring aop)

阅读更多
1.applicationContext.xml
   <?xml version="1.0" encoding="UTF-8"?>
   <beans http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans"
                xmlns:http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance"
                xmlns:http://www.springframework.org/schema/p">http://www.springframework.org/schema/p"
                xmlns:http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop"
               xmlns:http://www.springframework.org/schema/tx">http://www.springframework.org/schema/tx"
              xsi:schemaLhttp://www.springframework.org/schema/beans">http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    <!--第一种配置数据源
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
   <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
   <property name="url" value="jdbc:mysql://localhost:3306/beian"/>
   <property name="username" value="root"/>
   <property name="password" value="root"/>
    </bean>
    -->
    <!-- 第二种方式配置数据源 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
          p:location="/WEB-INF/jdbc.properties" />
    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          p:driverClassName="${jdbc.driverClassName}"
          p:url="${jdbc.url}"
          p:username="${jdbc.username}"
          p:password="${jdbc.password}" />
    <bean id="sessionFactory"
               class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!-- 将数据库源导入到会话工厂的class类中去 -->
         <property name="dataSource">
                <ref bean="dataSource"/>
        </property>
        <property name="hibernateProperties">
            <props>
                <!-- 配置hibernate方言(mysql/orcle/sqlserver)-->
                <prop key="hibernate.dialect">
                           org.hibernate.dialect.MySQLDialect
                </prop>
            </props>
        </property>
        <property name="mappingResources">
            <list>
                <!-- 导入hibernate 中实体JavaBean 对应的配置文件 -->
                <value>com/edong/beian/model/Log.hbm.xml</value>
            </list>
        </property>
     </bean>
    <!-- 创建事务管理器 -->
    <!-- jdbc,ibtas 方式
    <bean id="jdbcTransaction"
               class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="dataSource"></property>
    </bean>
     -->
    <!-- hibernate 方式 -->
    <bean id="transactionManager"
                class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!--配置了事务拦截器-->
    <bean id="interceptorTrans"  class="org.springframework.transaction.interceptor.TransactionInterceptor">
         <!--根据需要进行事务切换-->
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                    <!--PROPAGATION_REQUIRED:
                        表示在当前运行的方法中:
                        如果没有事务环境,则添加:conn.setCommitAuto(false),且事务类型为:wr;
                        如果有事务环境,则把该事务类型改为:wr
                    -->
                    <!-- ServiceException 前面的符号的含义:
                        + 表示在当前运行的方法中,如果抛出该类型的异常,则强制提交事务,commmit();
                        _ 表示在当前运行的方法中,如果抛出该类型的异常,则回退事务,以前提交的数据rollback();
                    -->
                    <!-- 为以h开头的方法进行添加事务处理为以h开头的方法进行添加事务处理 -->
                <prop key="p*">
                            PROPAGATION_REQUIRED,-RuntimeException
                </prop>
              </props>
         </property>
      </bean>
      <!-- 配置DAO-->
      <bean id="logDAO" class="com.edong.beian.dao.LogDAO"/>
      <!-- 配置需要被代理的目标类 -->
      <bean id="logService" abstract="false"
                  lazy-init="default" autowire="default" dependency-check="default"
                 class="com.edong.beian.service.LogService">
                <!--在LogService 中注入LogDAO-->
               <property name="logDAO" ref="logDAO"/>
       </bean>
       <!--配置事务代理类-->
       <bean id="transactionProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
              <property name="beanNames">
              <list>
                <!--要对目标类DeptDAO进行自动事务处理,当调用该目标类中的方法??会给自动维护它的事务的统一性质-->
                <value>logService</value>
            </list>
           </property>
           <property name="interceptorNames">
                <list>
                   <value>interceptorTrans</value>
                </list>
           </property>
           <property name="optimize" value="true"/>
     </bean>
         <!-- 前置增强 -->
     <bean id="before" class="com.edong.beian.cglib.LogMethodBeforeAdvice"/>
         <!-- 后置增强 -->
     <bean id="after" class="com.edong.beian.cglib.LogAfterReturningAdvice"/>
         <!-- 前后增强 -->
     <bean id="around" class="com.edong.beian.cglib.LogMethodInterceptor"/>
         <!-- 异常增强-->
     <bean id="throw" class="com.edong.beian.cglib.ThrowExceptionAdvice"/>
     <!-- 返回代理对象 -->
     <bean id="proxy1" class="org.springframework.aop.framework.ProxyFactoryBean">
          <!--指定目标类-->
           <property name="target" ref="logService"/>
           <property name="proxyTargetClass" value="true"/>
           <!-- 前提: 不管用hibernate的HibernateTransactionManager事务管理类
                  还是用 jdbc,ibatis的DataSourceTransactionManager事务管理类来进行事务管理
                   1. 如果目标类实现了一个接口
                      1) 当 optimize=true 为cglib产生的事务代理对象
                      2) 当 optimize=false 或 默认时 则以为jdk产生动态代理对象
                   2.如果目标类不实现任何接口
                      1) 当 optimize=true 为cglib产生的事务代理对象
                      2) 当 optimize=false 或默认时 则以为jdk产生动态代理对象,但是会报异常
                        (原因是:由jdk产生的代理时目标类必须实现一个接口,而cglib既能代理接口也能代理类)
                      注意:
                        传入 Session 注入SessionFactory 要分清
                        1.如果以spring内置代理(包括事务代理)时, getHibernateTemplate()
                          方式获取的SessionFactory 永远为空.(原因她由spring内部通过new 创
                          建一全新的HibernateTemplate 实列, 并不是通过获取配置文件中注入的
                          SessionFactory)
                       2.如果在配置文件中配置自动管理目标类的事务机制时,该机制只能管理通过
                         getHibernateTemplate()获取对象中的事务和它的统一性. 不能管理
                         传入的Session 的事务和它的统一性.传入的Session的事务必须手动
                         开启和提交.
           -->
          <!--添加增强类-->
          <property name="interceptorNames">
               <list>
                   <value>before</value>
                  <value>after</value>
                  <value>around</value>
                  <value>throw</value>
              </list>
            </property>
     </bean>
</beans>

2. cglib:实现前增强,后增强,前后增强,异常增强 (四个单独的类)
     前增强
      import com.edong.ws.security.Login;
     import java.lang.reflect.Method;
     import java.util.Date;
     import org.springframework.aop.MethodBeforeAdvice;
     public class LogMethodBeforeAdvice implements MethodBeforeAdvice {
                  public void before(Method method, Object[] aobj, Object obj)
                                                         throws Throwable {
                             String date = (new Date()).toString();
                             Login login=null;
                             if(aobj.length>0){
                                  if(aobj[0] instanceof Login){
                                       login =(Login)aobj[0];
                                       System.out.println("信息:[" + date + "]用户 " +login.getUsername() + " 正在尝试登录陆系统...");
                                 }
                          }
     }
     后增强...  
     import com.edong.ws.security.Login;
     import java.lang.reflect.Method;
     import java.util.Date;
     import org.hibernate.Session;
     import org.hibernate.Transaction;
     import org.springframework.aop.AfterReturningAdvice;
     public class LogAfterReturningAdvice implements AfterReturningAdvice {
                  public void afterReturning(Object obj, Method method, Object[] aobj,
                            Object obj1) throws Throwable {
                 String date = (new Date()).toString();
           /    /防止其他方法进入:logService.getCount();方法中就没参数...所以不存在访问数组元素...就会报错..
                 if(aobj.length>0){
                      if(aobj[0] instanceof Login){
                                Login login=(Login)aobj[0];
                                System.out.println("信息:["+date+"]用户 "+login.getUsername()+" 成功登录系统.");
                     }
              }
     }
     前后增强
      import org.hibernate.Session;
     import org.hibernate.Transaction;
     import org.aopalliance.intercept.MethodInterceptor;
     import org.aopalliance.intercept.MethodInvocation;
     public class LogMethodInterceptor implements MethodInterceptor {
             public Object invoke(MethodInvocation methodInvocation) throws Throwable {
                     Object result = null;
                     Object[] args = methodInvocation.getArguments();//获取传入目标方法的参数列表
                     int length =args.length;
                    for (int i = 0; i <length; i++) {
                       if (args instanceof Session){//判断参数类型是否是 Session
                           Transaction trans=((Session)(args)).beginTransaction();
                           try {
                                trans.begin();
                               result = methodInvocation.proceed();//调用代理目标类的具体方法
                               trans.commit();
                               } catch (Exception e) {
                                  trans.rollback();
                                  e.printStackTrace();
                              }
                       }
                  }
                     return result;
            }
     }

     异常增强 :导包
      import java.lang.reflect.Method;
     import org.springframework.aop.ThrowsAdvice;
     public class ThrowExceptionAdvice implements ThrowsAdvice {
                 public void afterThrowing(Method method, Object[] args, Object target,Exception ex)throws Throwable {
                                System.out.println("用户登录过程中发生异常: "+target.getClass().getSimpleName());
                 }
      }


     测试类:导包
      import com.edong.beian.service.LogService;
     import com.edong.ws.security.Login;
     import org.springframework.context.ApplicationContext;
     import org.springframework.context.support.ClassPathXmlApplicationContext;
     public class Test{
                  public static void main(String[] args){
                       ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");//xml文件  放在src目录下
                      LogService logService = (LogService) ac.getBean("proxy1");
                      Login login=new Login();
                      login.setUsername("thh");
                     login.setPassword("aaa");
                     logService.clientLogin(login);
              }
     }
分享到:
评论

相关推荐

    springboot spring aop 拦截器注解方式实现脱敏

    这将设置Spring Web相关类的日志级别为DEBUG,以便我们能看到拦截器的执行过程。 启动类通常会包含`@SpringBootApplication`注解,该注解包含了`@EnableAutoConfiguration`,`@ComponentScan`和`@...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    例如,可能会有一个自定义的MyBatis拦截器用于分页查询,一个Spring AOP切面用于记录操作日志,Spring事务管理确保数据的一致性,而反射工具类可能用于动态加载配置或处理某些通用的反射任务。通过这些组件的组合,...

    spring aop 拦截器简单实现

    本例提供了一个简单的AOP拦截器实现,我们可以从这个基础出发,深入理解和探讨AOP的核心概念、工作原理以及其在实际开发中的应用。 首先,AOP的主要目标是解决程序中的横切关注点,如日志记录、事务管理、性能监控...

    Spring AOP 拦截器 Advisor

    Spring AOP 拦截器 Advisor 是 Spring 框架中的一个重要概念,它与切面编程密切相关,用于实现细粒度的控制和增强应用程序的行为。在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象...

    Spring Aop的简单实现

    在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...

    详解Spring AOP 拦截器的基本实现

    具体到Spring AOP拦截器的代码实现,本文通过创建TestInterceptor类来演示。这个类继承自HandlerInterceptorAdapter,然后重写其中的afterCompletion、postHandle等方法。在这个类中,可以在相应方法中添加自定义的...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

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

    ### Spring AOP 四种创建通知(拦截器)类型详解 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块,它提供了在应用代码中添加横切关注点的能力,如日志记录、事务管理、权限...

    struts2+spring4+mybatis3,登录jquery ajax,struts拦截器,springAOP的例子

    本项目示例涵盖了这些框架的整合使用,以及jQuery AJAX登录、Struts拦截器和Spring AOP(面向切面编程)的应用。 1. **Struts2**:Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它简化了...

    spring AOP依赖三个jar包

    Spring AOP和其他AOP框架(如AspectJ)都实现了这些接口,以实现方法拦截和通知机制。 2. aspectjweaver-1.7.0.jar:这是AspectJ的织入器,负责在运行时动态地将切面(aspect)织入到目标类中。AspectJ提供了一种...

    Spring使用AOP的三个jar包

    它定义了一些通用的AOP接口,比如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,使得不同的AOP框架(如Spring和AspectJ)可以共享相同的拦截器(interceptors)。...

    Spring aop 性能监控器

    在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...

    spring aop demo 两种实现方式

    在Spring中,我们可以使用`@Aspect`注解来定义一个切面,这个切面包含了多个通知(advice),即拦截器。例如: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* ...

    spring aop用到jar包.rar

    除此之外,Spring AOP的使用可能还需要其他相关库,比如`aspectjrt.jar`和`aspectjweaver.jar`,这两个是AspectJ运行时库和编织器,用于在运行时或编译时将切面织入到目标类中。如果涉及到XML配置,`spring-...

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    - **Interceptor(拦截器)**:一个实现了特定接口的类,用来包装目标方法并执行额外的动作。 - **Proxy(代理)**:在目标对象和执行动作之间创建的一个对象,用于实现AOP功能。 2. AOP的不同类型的通知 - **...

    springAOP 4个jar包

    比如,`org.aopalliance.intercept.MethodInterceptor`接口定义了拦截器的接口,Spring AOP的`MethodBeforeAdvice`、`AfterReturningAdvice`等通知类型都实现了这个接口。 了解这些jar包的作用后,我们可以看到...

    Spring AOP IOC源码笔记.pdf

    CGLIB是Spring AOP默认的代理库,用于生成目标类的子类,从而实现方法拦截。当目标类没有实现接口时,Spring会使用CGLIB。 8. Spring事务管理: Spring提供了声明式事务管理,通过@Transactional注解在方法级别声明...

    Spring AOP框架实现的结构分析

    许多 AOP 框架都以拦截器的形式来表现增强--所谓拦截器是这样的一个对象:当连接点被调用时,它会收到一个回调消息。基本的增强有前增强、后增强、环绕增强等。引介是为一个现有的 Java 类或接口添加方法或字段。...

    第四章:Spring AOP API 设计模式1

    7. **组合模式(Composite)**:在Spring AOP中,虽然没有直接的组合模式实现示例,但组合模式的思想体现在能够将多个拦截器(Interceptor)组合成一个链,每个拦截器都可以看作是树结构中的一个节点,共同完成一个...

Global site tag (gtag.js) - Google Analytics