spring的aop实现
2014-03-27 22:27
260 查看
Spring默认AspectJ切入点语法
引入:将方法或字段添加到被处理的类中。
目标对象: 包含连接点的对象。也被称作 被通知或被代理对象。
AOP代理:AOP框架创建的对象,对目标对象的加强。
织入:将增强处理添加到目标对象中,并创建一个被增强的对象的过程。
扫描加的注释和启动@Aspect所需要的jar包:
为了在Spring配置中使用@AspectJ切面,首先必须启用Spring对@AspectJ切面配置的支持,并确保自动代理(autoproxying)的bean是否能被这些切面通知。自动代理是指Spring会判断一个bean是否使用了一个或多个切面通知,并据此自动生成相应的代理以拦截其方法调用,并且确保通知在需要时执行。
通过在Spring的配置中引入下列元素来启用Spring对@AspectJ的支持:
配置文件
配置aop
UserDao.java
applicationContext.xml
使用
execution(public * *(..)) 所有的公共方法
execution(* set*(..)) 以set开头的任意方法
execution(* com.xyz.service.AccountService.*(..)) com.xyz.service.AccountService类中的所有的方法
execution(* com.xyz.service.*.*(..)) com.xyz.service包中的所有的类的所有的方法
execution(* com.xyz.service..*.*(..)) com.xyz.service包及子包中所有的类的所有的方法
execution(* cn.itcast.spring.sh..*.*(String,?,Integer)) cn.itcast.spring.sh包及子包中所有的类的有三个参数
第一个参数为String,第二个参数为任意类型,
第三个参数为Integer类型的方法
定义成一个切面
LogAspect.java
package net.csdn.www.aop;
import java.util.logging.Level;
import java.util.logging.Logger;
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;
//定义成一个切面
@Aspect
public class LogAspect {
//定义一个切入点 ,访问修饰符,包名,类名,方法名(参数,异常)
@Before("execution(* net.csdn.www.dao.*.save*(..))")
public void saveLog() {
Logger log = Logger.getLogger(LogAspect.class.getName());
log.log(Level.INFO, "信息被保存");
}
}
测试代码:
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao) context.getBean("userDao");
userDao.save();
运行结果:
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2014-3-27 21:35:00 net.csdn.www.aop.LogAspect saveLog
信息: 信息被保存
用户保存成功!
在UserDao.java中声明一个方法:
public void delete(){
int i= 5/0;
}
调用delete()方法后的运行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at net.csdn.www.dao.UserDao.delete(UserDao.java:15)
at net.csdn.www.dao.UserDao$$FastClassBySpringCGLIB$$c34aca31.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58)获取目标方法抛出的异常java.lang.ArithmeticException: / by zero
记录日志
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
at net.csdn.www.dao.UserDao$$EnhancerBySpringCGLIB$$d3fba046.delete(<generated>)
at net.csdn.www.test.Test.main(Test.java:14)
添加UserDao.java带返回值的方法
public String selectUser(String name){
System.out.println("用户信息查询成功");
return "success";
}
运行结果:
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2014-3-27 22:28:00 net.csdn.www.aop.LogAspect selectLog
信息: 信息被查询
用户信息查询成功
peitihuande zhi
引入:将方法或字段添加到被处理的类中。
目标对象: 包含连接点的对象。也被称作 被通知或被代理对象。
AOP代理:AOP框架创建的对象,对目标对象的加强。
织入:将增强处理添加到目标对象中,并创建一个被增强的对象的过程。
扫描加的注释和启动@Aspect所需要的jar包:
为了在Spring配置中使用@AspectJ切面,首先必须启用Spring对@AspectJ切面配置的支持,并确保自动代理(autoproxying)的bean是否能被这些切面通知。自动代理是指Spring会判断一个bean是否使用了一个或多个切面通知,并据此自动生成相应的代理以拦截其方法调用,并且确保通知在需要时执行。
通过在Spring的配置中引入下列元素来启用Spring对@AspectJ的支持:
<aop:aspectj-autoproxy/>
配置文件
xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
配置aop
增加验证验证文档 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop /spring-aop-4.0.xsd
UserDao.java
package net.csdn.www.dao; import org.springframework.stereotype.Component; @Component public class UserDao { public void save(){ 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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd" > <!-- 语言写入值xmlns:p --> <!-- xmlns:context扫描加的注释 --> <context:component-scan base-package="net.csdn.www.dao,net.csdn.www.aop"> <!-- 启动@Aspect支持 --> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan> <aop:aspectj-autoproxy/> </beans>
使用
execution切入点指示符
execution(public * *(..)) 所有的公共方法
execution(* set*(..)) 以set开头的任意方法
execution(* com.xyz.service.AccountService.*(..)) com.xyz.service.AccountService类中的所有的方法
execution(* com.xyz.service.*.*(..)) com.xyz.service包中的所有的类的所有的方法
execution(* com.xyz.service..*.*(..)) com.xyz.service包及子包中所有的类的所有的方法
execution(* cn.itcast.spring.sh..*.*(String,?,Integer)) cn.itcast.spring.sh包及子包中所有的类的有三个参数
第一个参数为String,第二个参数为任意类型,
第三个参数为Integer类型的方法
定义成一个切面
LogAspect.java
package net.csdn.www.aop;
import java.util.logging.Level;
import java.util.logging.Logger;
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;
//定义成一个切面
@Aspect
public class LogAspect {
//定义一个切入点 ,访问修饰符,包名,类名,方法名(参数,异常)
@Before("execution(* net.csdn.www.dao.*.save*(..))")
public void saveLog() {
Logger log = Logger.getLogger(LogAspect.class.getName());
log.log(Level.INFO, "信息被保存");
}
}
测试代码:
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao) context.getBean("userDao");
userDao.save();
运行结果:
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2014-3-27 21:35:00 net.csdn.www.aop.LogAspect saveLog
信息: 信息被保存
用户保存成功!
在UserDao.java中声明一个方法:
public void delete(){
int i= 5/0;
}
@AfterThrowing(throwing="rvt",pointcut="execution(* net.csdn.www.dao.*.delete*(..))") public void throwLog(Throwable rvt){ System.out.println("获取目标方法抛出的异常"+rvt); System.out.println("记录日志"); }
调用delete()方法后的运行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at net.csdn.www.dao.UserDao.delete(UserDao.java:15)
at net.csdn.www.dao.UserDao$$FastClassBySpringCGLIB$$c34aca31.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58)获取目标方法抛出的异常java.lang.ArithmeticException: / by zero
记录日志
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
at net.csdn.www.dao.UserDao$$EnhancerBySpringCGLIB$$d3fba046.delete(<generated>)
at net.csdn.www.test.Test.main(Test.java:14)
添加UserDao.java带返回值的方法
public String selectUser(String name){
System.out.println("用户信息查询成功");
return "success";
}
//定义一个Around的切入点 @Around("execution(* net.csdn.www.dao.*.select*(..))") public Object selectLog(ProceedingJoinPoint pj) throws Throwable{ Logger log = Logger.getLogger(LogAspect.class.getName()); log.log(Level.INFO, "信息被查询"); //System.out.println(pj.getArgs()+"--"); Object result= pj.proceed(new String[]{"peitihuande zhi"}); return "peitihuande zhi"; }
运行结果:
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2014-3-27 22:28:00 net.csdn.www.aop.LogAspect selectLog
信息: 信息被查询
用户信息查询成功
peitihuande zhi
相关文章推荐
- Spring AOP的底层实现技术---JDK动态代理
- Spring AOP的实现原理
- Spring实现AOP的4种方式
- Spring AOP之二 ——AOP的实现方式
- SSH集成框架下真正实现Spring AOP拦截功能
- springAop,注解annotation + redis 实现分布式锁
- SpringBoot中利用AOP实现拦截器效果
- Spring AOP(二、注解配置实现)
- Spring初学之xml实现AOP前置通知、后置通知、返回通知、异常通知等
- 【AOP系列】(四)—采用Spring的静态配置文件实现AOP
- 【Spring aop】Spring aop的XML和注解的两种配置实现
- spring AOP实现(Annotation方式/静态文件配置方式)
- spring aop实现日志管理
- Spring Xml文件配置实现AOP通知
- Spring-通过注解实现的AOP
- Spring-通过xml配置实现AOP
- spring+mybatis基于 AOP实现业务日志管理
- 从零开始学 Java - Spring AOP 实现用户权限验证
- spring源码学习之:springAOP实现底层原理
- java spring aop 的代理的简单实现