(六)Spring AOP切入方式

一、接口切入方式

实现类

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>

  

 

posted @ 2018-08-10 18:35  跃小云  阅读(434)  评论(0编辑  收藏  举报