目录
1. 要求
2. 涉及的知识点
3. 示例工程 (第一种方式)
3.1 maven的配置文件: pom.xml
3.2 bean配置文件: bean_aop_around.xml
3.3 接口和类的代码
3.3.1 接口:UserService
3.3.2 实现接口的类:UserServiceImpl
3.3.3 AroundLog类:AroundLog
3.4 测试类
4. 示例工程(第二种方式)
4.1 maven的配置文件: pom.xml
4.2 bean配置文件: bean_aop_around2.xml
4.3 接口和类的代码
4.3.1 接口:UserService
4.3.2 实现接口的类:UserServiceImpl
4.3.3 AnnotationPointcut类:
4.4 测试类
1. 要求
之前完成了通过@Before和@After的方式,完成了对类UserServiceImpl中的search方法的aop操作 ,这里要求:通过@Aspect注解的方式实现对UserServiceImpl的aop的@Around操作!
前文:
Java练习(十):Spring应用之AOP(简单工程示例)_sulia1234567890的博客-CSDN博客
2. 涉及的知识点
@Before, @After, @Around三者之前的关系:
@Before是在所拦截方法执行之前执行一段逻辑。
@After 是在所拦截方法执行之后执行一段逻辑。
@Around是可以同时在所拦截方法的前后执行一段逻辑。
简言之,@Around就包含了@Before和@After两个操作。
3. 示例工程 (第一种方式)
3.1 maven的配置文件: pom.xml
4.0.0
org.example
MySpringAOPAround
1.0-SNAPSHOT
8
8
org.springframework
spring-webmvc
5.3.3
org.aspectj
aspectjweaver
1.9.4
dom4j
dom4j
1.6.1
junit
junit
4.12
test
3.2 bean配置文件: bean_aop_around.xml
3.3 接口和类的代码
3.3.1 接口:UserService
package com.my.spring.aop.around;
public interface UserService {
public void add();
public void delete();
public void update();
public void search();
}
3.3.2 实现接口的类:UserServiceImpl
package com.my.spring.aop.around;
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("增加用户");
}
public void delete() {
System.out.println("删除用户");
}
public void update() {
System.out.println("更新用户");
}
public void search() {
System.out.println("查询用户");
}
}
3.3.3 AroundLog类:AroundLog
package com.my.spring.aop.around;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class AroundLog implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
String name = invocation.getMethod().getName();
System.out.println("环绕通知: " + name + "方法即将开始!");
// 调用目标对象的指定方法
//真正调用目标方法
Object result = invocation.proceed();
System.out.println("环绕通知: " + name + "方法到此结束!");
return result;
}
}
3.4 测试类
package com.my.spring.around.demo;
import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MySpringAOPAroundTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around.xml");
UserService userService = (UserService) context.getBean("userService");
userService.search();
}
}
3.3.1 接口:UserService
package com.my.spring.aop.around;
public interface UserService {
public void add();
public void delete();
public void update();
public void search();
}
3.3.2 实现接口的类:UserServiceImpl
package com.my.spring.aop.around;
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("增加用户");
}
public void delete() {
System.out.println("删除用户");
}
public void update() {
System.out.println("更新用户");
}
public void search() {
System.out.println("查询用户");
}
}
3.3.3 AroundLog类:AroundLog
package com.my.spring.aop.around;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class AroundLog implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
String name = invocation.getMethod().getName();
System.out.println("环绕通知: " + name + "方法即将开始!");
// 调用目标对象的指定方法
//真正调用目标方法
Object result = invocation.proceed();
System.out.println("环绕通知: " + name + "方法到此结束!");
return result;
}
}
3.4 测试类
package com.my.spring.around.demo;
import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MySpringAOPAroundTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around.xml");
UserService userService = (UserService) context.getBean("userService");
userService.search();
}
}
package com.my.spring.aop.around;
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("增加用户");
}
public void delete() {
System.out.println("删除用户");
}
public void update() {
System.out.println("更新用户");
}
public void search() {
System.out.println("查询用户");
}
}
3.3.3 AroundLog类:AroundLog
package com.my.spring.aop.around;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class AroundLog implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
String name = invocation.getMethod().getName();
System.out.println("环绕通知: " + name + "方法即将开始!");
// 调用目标对象的指定方法
//真正调用目标方法
Object result = invocation.proceed();
System.out.println("环绕通知: " + name + "方法到此结束!");
return result;
}
}
3.4 测试类
package com.my.spring.around.demo;
import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MySpringAOPAroundTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around.xml");
UserService userService = (UserService) context.getBean("userService");
userService.search();
}
}
package com.my.spring.around.demo;
import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MySpringAOPAroundTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around.xml");
UserService userService = (UserService) context.getBean("userService");
userService.search();
}
}
输出结果:
环绕通知: search方法即将开始!
查询用户
环绕通知: search方法到此结束!
4. 示例工程(第二种方式)
用 @Aspect, @Around
简言之,就是简化了bean配置文件里的内容,设置语句自动扫描,在工程中找标签 @Aspect, @Around等。
4.1 maven的配置文件: pom.xml
同3.1,这里不赘述。
4.2 bean配置文件: bean_aop_around2.xml
4.3 接口和类的代码
4.3.1 接口:UserService
package com.my.spring.aop.around;
public interface UserService {
public void add();
public void delete();
public void update();
public void search();
}
4.3.2 实现接口的类:UserServiceImpl
package com.my.spring.aop.around;
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("增加用户2");
}
public void delete() {
System.out.println("删除用户2");
}
public void update() {
System.out.println("更新用户2");
}
public void search() {
System.out.println("查询用户2");
}
}
4.3.3 AnnotationPointcut类:
4.3.1 接口:UserService
package com.my.spring.aop.around;
public interface UserService {
public void add();
public void delete();
public void update();
public void search();
}
4.3.2 实现接口的类:UserServiceImpl
package com.my.spring.aop.around;
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("增加用户2");
}
public void delete() {
System.out.println("删除用户2");
}
public void update() {
System.out.println("更新用户2");
}
public void search() {
System.out.println("查询用户2");
}
}
4.3.3 AnnotationPointcut类:
package com.my.spring.aop.around;
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("增加用户2");
}
public void delete() {
System.out.println("删除用户2");
}
public void update() {
System.out.println("更新用户2");
}
public void search() {
System.out.println("查询用户2");
}
}
4.3.3 AnnotationPointcut类:
类似于第一种方法中的AroundLog类,实现环绕效果,方法的调用
package com.my.spring.aop.around;
// 如果自动扫描,那么程序肯定找标签
// 在整个工程里找标签,即如果包含多个类文件,多个@Aspect,程序都会找到并执行。
// 但真实的情况下,同一个方法,不会用多个@Around
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AnnotationPointcut {
@Around("execution(* com.my.spring.aop.around.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable{
System.out.println("~~~~~~~~~~~~~~~~Around方法执行前~~~~~~~~~~~~~~~~~~~~~");
System.out.println("签名: "+jp.getSignature());
Object proceed = jp.proceed(); //执行目标方法
System.out.println("~~~~~~~~~~~~~~~~Around方法执行后~~~~~~~~~~~~~~~~~~~~~");
}
}
4.4 测试类
package com.my.spring.around.demo;
import com.my.spring.aop.around.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MySpringAOPAroundTest2 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean_aop_around2.xml");
UserService userService = (UserService) context.getBean("userService2");
userService.search();
}
}
输出结果:
~~~~~~~~~~~~~~~~Around方法执行前~~~~~~~~~~~~~~~~~~~~~
签名: void com.my.spring.aop.around.UserService.search()
查询用户2
~~~~~~~~~~~~~~~~Around方法执行后~~~~~~~~~~~~~~~~~~~~~



