哈喽,大家好,我是了不起。
AOP就是面向切面编程,或者叫面向方面编程,或者开玩笑的说叫面向方便面编程,如果粗俗的理解,就是可以自定义注解,然后通过自己定义的方式定义注解的作用。
SpringAOP的全称是(Aspect Oriented Programming)中文翻译过来是面向切面编程,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
图片
图片
提供声明式事允许用户自定义切面:
图片
使用AOP织入,需要导入一个依赖包:
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version></dependency>
applicationContext.xml:
<?xml versinotallow="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 "> <!--注册bean--> <bean id="userService" class="service.UserServiceImpl"/> <bean id="log" class="log.Log"/> <bean id="afterLog" class="log.AfterLog"/> <!--配置aop:需要导入aop的约束--> <aop:config> <!--切入点:expression:表达式,execution(要执行的位置! * * * *)--> <aop:pointcut id="pointcut" expression="execution(* service.UserServiceImpl.*(..))"></aop:pointcut> <!--执行环绕增加--> <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/> </aop:config></beans>
UserService接口:
public interface UserService { public void add(); public void delete(); public void update(); public void select();}
UserServiceImpl实现类(切入点):
public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("增加了一个用户"); } @Override public void delete() { System.out.println("删除了一个用户"); } @Override public void update() { System.out.println("更新了一个用户"); } @Override public void select() { System.out.println("查询了一个用户"); }}
前置通知:
import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;public class Log implements MethodBeforeAdvice { //method:要执行的目标对象的方法 //args:参数 //target:目标参数 @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行了"); }}
后置通知:
import org.springframework.aop.AfterReturningAdvice;import java.lang.reflect.Method;public class AfterLog implements AfterReturningAdvice { //returnValue:返回值 @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("执行了"+method.getName()+"方法返回结果为:"+ returnValue); }}
测试类:
import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import service.UserService;import service.UserServiceImpl;import java.lang.annotation.Annotation;public class MyTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //动态代理的是接口 UserService userService = (UserService) context.getBean("userService"); userService.select(); }}
通过本文的讲解,我们深入了解了切面编程的核心概念、动态代理的实现原理,并通过一个实际的例子展示了使用Java AOP的完整过程。AOP可以帮助我们将横切关注点(例如日志记录、事务管理等)从核心业务逻辑中解耦出来,提高代码的可维护性和重用性。同时,AOP也是实现设计模式和架构思想的重要手段之一,我们在开发中可以灵活运用AOP来优化代码结构并提高系统的整体性能。
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-89717-0.htmlJava AOP实践指南:切面编程详解
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: DotNet开发之反射技术详解