• Spring(六)AOP切入方式


    原文出自:http://www.cnblogs.com/liunanjava/p/4411234.html

    一、接口切入方式

    实现类

    package com.pb.entity;
    /**
     * 实体类
     */
    public class Hello {
        private String name;
        private String password;
        
        public void show(){
            System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
        
    
    }

    1.1、前置增强

    package com.pb.aop;
    
    import java.lang.reflect.Method;
    
    import org.springframework.aop.MethodBeforeAdvice;
    /**
     * 前置增强的Bean
     * @author Administrator
     *实现MethodBeforeAdvice接口
     */
    public class BeforeAdded implements MethodBeforeAdvice {
    
        @Override
        public void before(Method arg0, Object[] arg1, Object arg2)
                throws Throwable {
            System.out.println("====前置增强!=====");
    
        }
    
    }

    applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    <!--hello Bean  -->
    <bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="123qwe"/>
    <!--切入的Bean  -->
    <bean id="beforeAdd" class="com.pb.aop.BeforeAdded"/>
    <!--前置增强切入的Bean  -->
    <aop:config>
    <!-- 切入点 -->
    <aop:pointcut expression="execution(* com.pb.entity.Hello.*(..))" id="myPoint"/>
    <!-- 关联切入类和切入点 -->
    <aop:advisor advice-ref="beforeAdd" pointcut-ref="myPoint"/>
    </aop:config>
    </beans>

    1.2、后置增强

    package com.pb.aop;
    
    import java.lang.reflect.Method;
    
    import org.springframework.aop.AfterReturningAdvice;
    /**
     * 后置增强
     */
    public class AfterAdded implements AfterReturningAdvice {
    
        @Override
        public void afterReturning(Object arg0, Method arg1, Object[] arg2,
                Object arg3) throws Throwable {
            System.out.println("====这里是后置增强!====");
    
        }
    
    }

     applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    <!--hello Bean  -->
    <bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="123qwe"/>
    <!--切入的Bean  -->
    
    <!--后置增强切入的Bean  -->
    <bean id="afterAdd" class="com.pb.aop.AfterAdded"/>
    <aop:config>
    <!-- 切入点 -->
    <aop:pointcut expression="execution(* com.pb.entity.Hello.*(..))" id="myPoint"/>
    <!-- 关联后置增强切入类和切入点 -->
    <aop:advisor advice-ref="afterAdd" pointcut-ref="myPoint"/>
    </aop:config>
    <!--后置增强切入的Bean  -->
    
    </beans>

    1.3、异常增强

    实体类中增加异常

    package com.pb.entity;
    /**
     * 实体类
     */
    public class Hello {
        private String name;
        private String password;
        
        public void show(){
            System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());
            //加入异常
            System.out.println(1/0);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
        
    
    }
    package com.pb.aop;
    
    import java.lang.reflect.Method;
    
    import org.springframework.aop.ThrowsAdvice;
    /**
     * 异常增强类
     * @author Administrator
     *
     */
    public class ThrowingAdded implements ThrowsAdvice {
        //第一种写法
        public void afterThrowing(Exception ex){
            System.out.println("我是异常增强!,,没处理异常,有问题就找我");
            
        }
        //第二种写法
        public void afterThrowing(Method arg0, Object[] arg1, Object arg2,Exception ex){
            System.out.println("我是异常增强!,,没处理异常,有问题就找我");
            
        }
    
    }

     applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    <!--hello Bean  -->
    <bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="123qwe"/>
    <!--切入的Bean  -->
    
    <!--异常增强切入的Bean  -->
    <bean id="throwAdd" class="com.pb.aop.ThrowingAdded"/>
    <aop:config>
    <!-- 切入点 -->
    <aop:pointcut expression="execution(* com.pb.entity.Hello.*(..))" id="myPoint"/>
    <!-- 关联异常增强切入类和切入点 -->
    <aop:advisor advice-ref="throwAdd" pointcut-ref="myPoint"/>
    </aop:config>
    
    </beans>

    1.4、以上综合

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    <!--hello Bean  -->
    <bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="123qwe"/>
    <!--切入的Bean  -->
    <!--前置增强切入的Bean  -->
    <bean id="beforeAdd" class="com.pb.aop.BeforeAdded"/>
    
    <!--后置增强切入的Bean  -->
    <bean id="afterAdd" class="com.pb.aop.AfterAdded"/>
    <!--异常增强切入的Bean  -->
    <bean id="throwAdd" class="com.pb.aop.ThrowingAdded"/>
    <aop:config>
    <!-- 切入点 -->
    <aop:pointcut expression="execution(* com.pb.entity.Hello.*(..))" id="myPoint"/>
    <!-- 关联前置增强切入类和切入点 -->
    <aop:advisor advice-ref="beforeAdd" pointcut-ref="myPoint"/>
    <!-- 关联后置增强切入类和切入点 -->
    <aop:advisor advice-ref="afterAdd" pointcut-ref="myPoint"/>
    <!-- 关联异常增强切入类和切入点 -->
    <aop:advisor advice-ref="throwAdd" pointcut-ref="myPoint"/>
    </aop:config>
    
    </beans>

    1.5、环绕增强

    package com.pb.entity;
    /**
     * 实体类
     */
    public class Hello {
        private String name;
        private String password;
        
        public void show(){
            System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());
            //加入异常
            System.out.println(1/0);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
        
    
    }

    环绕增加Bean

    package com.pb.aop;
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    /**
     * 环绕增强
     * @author Administrator
     *实现接口MethodIntercepor
     */
    public class AroundAdded implements MethodInterceptor {
    
        @Override
        public Object invoke(MethodInvocation arg0) throws Throwable {
            Object result=null;
            try {
                System.out.println("环绕增强开始!");
                 result=arg0.proceed();
                System.out.println("环绕增强结束!");
            } catch (Exception e) {
                System.out.println("环绕增强异常!");
            }finally{
                System.out.println("环绕增强最终增强!");
            }
            
            return result;
        }
    
    }

     applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
        <!-- 关联Bean Hello -->
    <bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="qewr"/>
    <!--环绕增强的Bean  -->
    <bean id="aroundAdded" class="com.pb.aop.AroundAdded"></bean>
    
    <aop:config>
    <!--  切入点-->
    <aop:pointcut expression="execution(* com.pb.entity.*.*(..))" id="myPoint"/>
    <!--关联切入点  -->
    <aop:advisor advice-ref="aroundAdded" pointcut-ref="myPoint"/>
    </aop:config>
    </beans>

    二、注解方式

    package com.pb.entity;
    /**
     * 实体类
     */
    public class Hello {
        private String name;
        private String password;
        
        public void show(){
            System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());
            //加入异常
            System.out.println(1/0);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
        
    
    }

    aop的类

    package com.pb.aop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    /**
     * 注解的方式现实AOP
     * @author Administrator
     *
     */
    @Aspect
    public class MyAnnotionAOP {
        
        /*
         * 前置
         */
        @Before(value="execution(* com.pb.entity.*.*(..))")
        public void before(JoinPoint point){
            
            System.out.println("前置增强");
            System.out.println(point.getClass());
        }
        /*
         * 后置
         */
        @AfterReturning(value="execution(* com.pb.entity.*.*(..))")
        public void after(JoinPoint point){
            System.out.println("后置增强");
            //参数个数
            System.out.println(point.getArgs().length);
        }
        /*
         *异常 
         */
        @AfterThrowing(value="execution(* com.pb.entity.*.*(..))")
        public void afterThrowing(JoinPoint point){
            System.out.println("我是异常增强");
            System.out.println(point.getSignature().getName());
        }
        /**
         * 环绕
         */
        @Around(value="execution(* com.pb.entity.*.*(..))")
        public Object myAround(ProceedingJoinPoint point){
            Object result=null;
            
            try {
                System.out.println("环绕增强开始了");
                System.out.println(point.getKind()+point.getArgs());
                point.proceed();
                System.out.println("环绕增强后置增强了");
                System.out.println(point.getTarget()+""+point.getClass());
            } catch (Throwable e) {
                System.out.println("环绕增强,异常增强处理");
                e.printStackTrace();
            }finally{
                System.out.println("环绕增强最终增强");
            }
            
            return result;
            
        }
    }

    applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    <!-- 关联Bean Hello -->
    <bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="qewr"/>
    <!-- 切入 类 -->
    <bean id="myAnnAOP" class="com.pb.aop.MyAnnotionAOP" />
    <!--开启自动代理  -->
    <aop:aspectj-autoproxy/>
    
    </beans>

    三、Schema方式(推荐)

     Hello类同上

    package com.pb.entity;
    /**
     * 实体类
     */
    public class Hello {
        private String name;
        private String password;
        
        public void show(){
            System.out.println("姓名 :"+this.getName()+"密码: "+this.getPassword());
            //加入异常
            System.out.println(1/0);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
        
    
    }

    aop类

    package com.pb.aop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    
    
    /**
     * SCHEMA方式切入类
     * 
     * @author Administrator
     * 
     */
    public class MySchemaAOP {
    
        /**
         * 前置切入 可以有参数但是固定写法
         */
        public void before(JoinPoint point){
            System.out.println("这里是前置增强切入");
            System.out.println(point.getKind()+point.getArgs().toString());
        }
        /**
         * 后置切入
         */
        public void after(JoinPoint point){
            System.out.println("这里是后置增强切入");
            System.out.println(point.getTarget()+point.getSignature().getName());
        }
        /**
         * 异常切入
         */
        public void myException(JoinPoint point){
            System.out.println("这里是异常增强切入");
            System.out.println(point.getSourceLocation());
        }
        /**
         * 环绕增强切入
         */
        public Object myAround(ProceedingJoinPoint point){
            Object resut=null;
            try {
                System.out.println("环绕增强---前置增强");
                resut=point.proceed();
                System.out.println("环绕增强---后置增强");
            } catch (Throwable e) {
                System.out.println("环绕增强---异常增强");
                e.printStackTrace();
            }finally{
                System.out.println("环绕增强---最终增强");
            }
            return resut;
        }
    }

    applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    <!-- 关联Bean Hello -->
    <bean id="hello" class="com.pb.entity.Hello" p:name="张三" p:password="qewr"/>
    <!-- 切入 类 -->
    <bean id="mySchemaAOP" class="com.pb.aop.MySchemaAOP"/>
    
    <aop:config>
    <!--  切入点-->
    <aop:pointcut expression="execution(* com.pb.entity.*.*(..))" id="myPoint"/>
    <!--关联切入类、方法和切入点  -->
    <aop:aspect ref="mySchemaAOP">
    <!-- 切入 前置方法和切入点-->
    <aop:before method="before" pointcut-ref="myPoint"/>
    <!-- 切入 后置方法和切入点-->
    <aop:after method="after" pointcut-ref="myPoint"/>
    <!-- 切入 异常方法和切入点-->
    <aop:after method="myException" pointcut-ref="myPoint"/>
    <!-- 切入 环绕增加方法和切入点-->
    <aop:around method="myAround" pointcut-ref="myPoint"/>
    </aop:aspect>
    </aop:config>
    </beans>
  • 相关阅读:
    使用South时候由于两个相同id的文件引起的问题
    Python os模块
    Ubuntu的关机重启命令知识
    [BUGFIX]__import_pywin32_system_module__
    Django生产环境的部署-Apache-mod_wsgi
    我是如何将linux用在开发环境中的
    php抽奖概率算法
    PHP接收IOS post过来的json数据无法解析的问题
    python apache下出现The _imaging C module is not installed
    php 打印
  • 原文地址:https://www.cnblogs.com/vincent-blog/p/4415134.html
Copyright © 2020-2023  润新知