通过代理对象来调用原对象的方法
代理对象方法前后都可以插入代码,这些代码就是增强处理
实现方法:动态代理设计模式
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">
通过代理对象来调用原
对象的方法
代理对象来调用原
对象的方法