(六)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>