一、导入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
二、编写目标对象
public interface AccountTest {
void select();
void update();
}
实现类
@Repository
public class AccountTestImpl implements AccountTest {
@Override
public void select() {
System.out.println ("AccountTestImpl查询方法");
}
@Override
public void update() {
System.out.println ("AccountTestImpl修改方法");
}
}
三、切面
@Aspect
public class MyAspectJ {
@Pointcut("execution(* com.lntower.dao.*.*(..))")
private void myPointCut(){};
/**
* 前置通知,使用JoinPoint接口作为参数用来获取目标对象的信息
* @param point
*/
@Before ("myPointCut()")
public void before(JoinPoint point){
System.out.println ("前置通知,权限管理");
System.out.println ("目标类对象:"+point.getTarget ()+"被增强的方法:"+point.getSignature ().getName ());
System.out.println ("===========================================");
}
/**
*方法执行后增强
* @param point
*/
@AfterReturning("myPointCut()")
public void afterReturn(JoinPoint point){
System.out.println ("后置返回通知,关闭流,删除临时文件");
System.out.println ("增强的方法:"+point.getSignature ().getName ());
System.out.println ("===========================================");
}
/**
* ProceedingJoinPoint 是JoinPoint的子接口,代表目标类对象可以执行的方法
* @param pj
* @return
* @throws Throwable
*/
@Around ("myPointCut()")
public Object around(ProceedingJoinPoint pj) throws Throwable {
System.out.println ("环绕通知开始,执行日志事务、开始事务");
Object proceed = pj.proceed();
System.out.println ("环绕通知结束,执行关闭事务");
return pj;
}
@AfterThrowing(pointcut = "myPointCut()",throwing = "throwable")
public void except(Throwable throwable){
System.out.println ("异常通知:"+throwable.getMessage ());
}
@After ("myPointCut()")
public void after(){
System.out.println ("后置最终通知:释放资源");
System.out.println ("===========================================");
}
四、注解类
@Configuration
@EnableAspectJAutoProxy
@ComponentScan({"com.lntower.dao"})
@Import (MyAspectJ.class)
public class SprinfConfig {
}
五、测试
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SprinfConfig.class);
UserTest bean = context.getBean (UserTest.class);
bean.insert ();
}
}