1、idea创建普通项目
2.配置maven依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>3.2.13.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring框架所需的 JAR 包 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 日志文件 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>2.0.0-alpha0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0-alpha0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
<!-- AOP的jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!-- AspectJ的jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>com.springsource.org.aspectj.weaver</artifactId>
<version>1.6.8.RELEASE</version>
</dependency>
<!-- 测试jar包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
3.引入Spring配置文件
<?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" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
4、编写目标类
接口:
package com.codehorse.dao;
public interface CustomerDao {
public void add();
public void find();
public void update();
public void delete();
}
实现类:
package com.codehorse.dao;
public class CustomerDaoImpl implements CustomerDao{
@Override
public void add() {
System.out.println("新增客户");
}
@Override
public void find() {
System.out.println("查找客户");
}
@Override
public void update() {
System.out.println("更新客户");
}
@Override
public void delete() {
System.out.println("删除客户");
}
}
配置目标类:
<!-- 配置目标对象:被增强的对象 -->
<bean id="customerDao" class="com.codehorse.dao.CustomerDaoImpl"></bean>
编写切面类:
package com.codehorse.aspectj.xml;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAspect {
// 前置通知
public void myBefore(JoinPoint joinPoint) {
System.out.print("前置通知,目标:");
System.out.print(joinPoint.getTarget() + "方法名称:");
System.out.println(joinPoint.getSignature().getName());
}
// 后置通知
public void myAfterReturning(JoinPoint joinPoint) {
System.out.print("后置通知,方法名称:" + joinPoint.getSignature().getName());
}
// 环绕通知
public Object myAround(ProceedingJoinPoint proceedingJoinPoint)
throws Throwable {
System.out.println("环绕开始"); // 开始
Object obj = proceedingJoinPoint.proceed(); // 执行当前目标方法
System.out.println("环绕结束"); // 结束
return obj;
}
// 异常通知
public void myAfterThrowing(JoinPoint joinPoint, Throwable e) {
System.out.println("异常通知" + "出错了" + e.getMessage());
}
// 最终通知
public void myAfter() {
System.out.println("最终通知");
}
}
编写测试类
package com.codehorse.aspectj.xml;
import com.codehorse.dao.CustomerDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;
public class XMLTest {
@Test
public void test() {
String xmlPath = "com/codehorse/aspectj/xml/applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
// 从spring容器获取实例
CustomerDao customerDao = (CustomerDao) applicationContext
.getBean("customerDao");
// 执行方法
customerDao.add();
customerDao.find();
customerDao.delete();
customerDao.update();
}
}
切面类配置
<!-- 将切面类交给Spring管理 -->
<bean id="myAspect" class="com.codehorse.aspectj.xml.MyAspect"></bean>
通过AOP配置
<!-- 通过AOP的配置完成对目标类产生代理 -->
<aop:config>
<!-- 表达式配置哪些类的哪些方法需要进行增强 -->
<aop:pointcut expression="execution(* com.codehorse.dao.CustomerDaoImpl.add(..))" id="pointcut_add"/>
<aop:pointcut id="pointcut_delete" expression="execution(* com.codehorse.dao.CustomerDaoImpl.delete(..))"/>
<aop:pointcut id="pointcut_update" expression="execution(* com.codehorse.dao.CustomerDaoImpl.update(..))"/>
<aop:pointcut id="pointcut_find" expression="execution(* com.codehorse.dao.CustomerDaoImpl.find(..))"/>
<!-- 配置切面 -->
<aop:aspect ref="myAspect">
<aop:before method="myBefore" pointcut-ref="pointcut_add"/>
<aop:around method="myAround" pointcut-ref="pointcut_delete"/>
<aop:after method="myAfter" pointcut-ref="pointcut_find"/>
<aop:after-returning method="myAfterReturning" pointcut-ref="pointcut_update"/>
</aop:aspect>
</aop:config>
运行结果