springmvc里的Aop

来源:互联网 发布:php跨域请求 编辑:程序博客网 时间:2024/05/15 10:37

通过代理对象来调用原对象的方法

代理对象方法前后都可以插入代码,这些代码就是增强处理

实现方法:动态代理设计模式

log4j.properties

#rootlogger是所有日志的根日志,修改该日志属性将对所有日志起作用

#下面的属性配置中,所有日志的输出级别是debug,输出源是console

log4j.rootLogger = debug,console

#定义输出源的输入位置是控制台

log4j.appender.console=org.apache.log4j.ConsoleAppender

#定义输出日志的布局采用的类

log4j.appender.console.layout=org.apache.log4j.PatternLayout

#定义日志输出布局

log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n


public  void testBiz() {

Logger logger = Logger.getLogger(TestBiz.class);
logger.debug("业务方法开始执行");
try {
System.out.println("执行业务逻辑");
dao.testDao();
throw new Exception("故意的!");
} catch (Exception e) {
logger.error("出错了!", e);
}
}


AOP相关术语
增强( Advice)
切入点( Pointcut)
连接点( Joinpoint)
切面( Aspect)
代理( Proxy)
目标对象( Target)
织入( Weaving)


增强+切入点=切面(织入的操作)

AspectJ
Jboss AOP
Spring AOP

Spring 提供了4种实现AOP的方式
基于代理的经典AOP
纯POJO切面 schema 普通的java类(struts里action)
@AspectJ注解驱动的切面
注入式AspectJ切面


为项目添加Spring的AOP支持
spring-aop-3.2.13.RELEASE.jar
aopalliance-1.0.jar
aspectjweaver-1.6.9.jar
cglib-nodep-2.1.3.jar(已内联在Spring core中)
编写目标方法和增强处理
在Spring配置文件中定义切入点
在切入点织入增强处理


切入点:简单的说,就是连接点的查询条件
表达式匹配规则举例
<aop:pointcut id="servicePointcut"
expression="execution(public * com.pb.service.*.*(..))" />
public * addUser(com.pb.entity.User)"*"表示匹配所有类型的返回值
public void *(com.pb.entity.User)"*"表示匹配所有方法名
public void addUser (..)".. "表示匹配所有参数个数和类型
* com.pb.service.*.*(..):匹配com.pb.service包下所有类的所有方法
* com.pb.service..*(..):匹配com.pb.service包及子包下所有类的所有方法


<!-- 增强 --> <bean id="TestLogger" class="com.beta.logger.TestLogger"/><aop:config><!-- 切点 --><aop:pointcut expression="execution(public * biz..*(..))" id="pointcut"/><aop:aspect ref="testLogger"><!-- 把什么的方法放到符合的表达式里  --><aop:before method="beforeLogger" pointcut-ref="pointcut"/><aop:after-returning method="afterLogger" pointcut-ref="pointcut"returning="result"/></aop:aspect></aop:config> 



public void beforeLogger(JoinPoint jp,Object result){logger.debug("begin.........");System.out.println("连接点对象:"+jp.getTarget().getClass().getSimpleName());System.out.println("连接点方法:"+jp.getSignature().getName());System.out.println("连接点参数:"+jp.getArgs());System.out.println("返回值:"+result);}

Spring AOP代理机制
JDK动态代理(面向接口的代理,必须是接口,创建快,运行慢)
java.lang.reflect.InvocationHandler
java.lang.reflect.Proxy
CGLib动态代理(创建慢,运行快,内存中继承父类)

<aop:config proxy-target-class="true">




对象的方法
通过代理对象来调用原
对象的方法
代理对象来调用原
对象的方法
0 0