Spring AOP ---------AspectJ 开发
1导的jar包和MyaspectJ包结构
2-log4j.properties
### \u914D\u7F6E\u6839 ###
log4j.rootLogger = error,console,
###,\u5176\u4ED6\u914D\u7F6EfileAppender,dailyRollingFile,ROLLING_FILE,MAIL,DATABASE
### \u8BBE\u7F6E\u8F93\u51FAsql\u7684\u7EA7\u522B\uFF0C\u5176\u4E2Dlogger\u540E\u9762\u7684\u5185\u5BB9\u5168\u90E8\u4E3Ajar\u5305\u4E2D\u6240\u5305\u542B\u7684\u5305\u540D ###
log4j.logger.org.springframework=error
#log4j.logger.java.sql.Connection=dubug
#log4j.logger.java.sql.Statement=dubug
#log4j.logger.java.sql.PreparedStatement=dubug
#log4j.logger.java.sql.ResultSet=dubug
### \u914D\u7F6E\u8F93\u51FA\u5230\u63A7\u5236\u53F0 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d %p [ %c] - %m %n %d
### \u914D\u7F6E\u8F93\u51FA\u5230\u6587\u4EF6 ###
log4j.appender.fileAppender = org.apache.log4j.FileAppender
log4j.appender.fileAppender.File = logs/log.log
log4j.appender.fileAppender.Append = true
log4j.appender.fileAppender.Threshold = DEBUG
log4j.appender.fileAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### \u914D\u7F6E\u8F93\u51FA\u5230\u6587\u4EF6\uFF0C\u5E76\u4E14\u6BCF\u5929\u90FD\u521B\u5EFA\u4E00\u4E2A\u6587\u4EF6 ###
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.File = logs/log.log
log4j.appender.dailyRollingFile.Append = true
log4j.appender.dailyRollingFile.Threshold = DEBUG
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### \u914D\u7F6E\u8F93\u51FA\u5230\u6587\u4EF6\uFF0C\u4E14\u5927\u5C0F\u5230\u8FBE\u6307\u5B9A\u5C3A\u5BF8\u7684\u65F6\u5019\u4EA7\u751F\u4E00\u4E2A\u65B0\u7684\u6587\u4EF6 ###
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
### \u914D\u7F6E\u8F93\u51FA\u5230\u90AE\u4EF6 ###
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
### \u914D\u7F6E\u8F93\u51FA\u5230\u6570\u636E\u5E93 ###
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
3配置文件 AspectJapplicationContext.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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.baidu"></context:component-scan>
<!--使注解和配置都生效-->
<context:annotation-config/>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="deptService" class="com.baidu.AspectJ.DeptServiceImp"></bean>
<bean id="myAspect" class="com.baidu.AspectJ.MyAspectJ"></bean>
</beans>
4接口DeptServiceI
package com.baidu.AspectJ;
public interface DeptServiceI {
void add();
void del();
String findName();
}
5实现类class DeptServiceImp
package com.baidu.AspectJ;
public class DeptServiceImp implements DeptServiceI{
@Override
public void add() {
System.out.println("add---");
}
@Override
public void del() {
System.out.println("del---");
}
@Override
public String findName() {
System.out.println(" findName");
//有异常时通知,无异常时不通知
//int i=1/0;
return "Lisi";
}
}
6测试类TestMyAspectJ
package com.baidu.AspectJ;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMyAspectJ {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("AspectJapplicationContext.xml");
DeptServiceI deptServiceI = (DeptServiceI)applicationContext.getBean("deptService");//
deptServiceI.add();
deptServiceI.del();
deptServiceI.findName();
}
}
7AspectJ开发类、
package com.baidu.AspectJ;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
//纯注解开发
@Aspect
public class MyAspectJ {
//@Before(value = "execution(* com.baidu.AspectJ.DeptServiceImp.*(..))")
public void myBefore(JoinPoint joinPoint){
System.out.println("前置增强"+joinPoint);
}
// @AfterReturning(value = "execution(* com.baidu.AspectJ.DeptServiceImp.findName(..))",returning="reval")
public void myAfter(JoinPoint joinPoint,Object reval){
System.out.println("后置增强,返回值:"+reval);
}
// @Around(value ="execution(* com.baidu.AspectJ.DeptServiceImp.findName(..))")
public Object myAround(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕通知前1");
Object returnVal=point.proceed();
System.out.println("环绕通知后2");
return returnVal;
}
//@AfterThrowing(value ="execution(* com.baidu.AspectJ.DeptServiceImp.findName(..))",throwing = "ex")
public void myAfterThrowing(JoinPoint joinPoint,Throwable ex) {
//有异常时通知,无异常时不通知
System.out.println("异常通知,异常信息是:" + ex.getMessage());
}
// @After(value ="execution(* com.baidu.AspectJ.DeptServiceImp.findName(..))")
public void myAfter() {
System.out.println("最终通知" );
}
//简化表达式
@Before(value = "MyAspectJ.zz()")
public void myBeforePointcut(JoinPoint joinPoint){
System.out.println("前置增强"+joinPoint);
}
@Pointcut(value = "execution(* com.baidu.AspectJ.DeptServiceImp.*(..))")
private void zz(){
}
}
8各种情况的运行结果
//前置增强
前置增强execution(void com.baidu.AspectJ.DeptServiceI.add())
前置增强execution(void com.baidu.AspectJ.DeptServiceI.del())
前置增强execution(String com.baidu.AspectJ.DeptServiceI.findName())
Process finished with exit code 0
//后置增强
add---
del---
findName
后置增强,返回值:Lisi
Process finished with exit code 0
//环绕通知
add---
del---
环绕通知前1
findName
环绕通知后2
//无异常通知
add---
del---
findName
Process finished with exit code 0
//异常通知
add---
del---
findName
异常通知,异常信息是:/ by zero
//简化表达式
前置增强execution(void com.baidu.AspectJ.DeptServiceI.add())
add---
前置增强execution(void com.baidu.AspectJ.DeptServiceI.del())
del---
前置增强execution(String com.baidu.AspectJ.DeptServiceI.findName())
findName
Process finished with exit code 0