本文共 2872 字,大约阅读时间需要 9 分钟。
AOP(Aspect Oriented Programming,面向切面编程)是一种软件开发方法,旨在提高开发效率和代码复用性。传统的编程模式通常需要重复编写相同功能的代码,例如性能监视、事务管理、安全检查和缓存处理。AOP通过引入切面(Aspect)来横向抽取这些功能,减少代码冗余。
Spring提供了强大的AOP支持,主要通过动态代理实现。具体来说:
AspectJ的切点表达式简洁且灵活,常见表达式包括:
execution(* com.example.service.MyService.myMethod(..))
execution:匹配方法调用。*:表示任意访问修饰符(public、protected、private)。com.example.service.MyService:指定包名。myMethod(..):匹配方法名称及参数。在Spring中,常见的通知类型包括:
@Aspect@Componentpublic class MyAspect { @Before("execution(* com.example.dao.UserDao.addUser())") public void beforeAdvice() { System.out.println("用户添加前置通知"); }} @RunWith(SpringRunner.class)@ContextConfiguration("classpath:application-context.xml")public class TestUserDao { @Autowired private UserDao userDao; @Test public void testAdd() { userDao.addUser(); }} 代理模式通过创建代理对象来间接操作目标对象,核心特点是:
静态代理要求代理类和目标类实现同一接口,代码示例:
public interface WindWomen { String say();}public class Pan implements WindWomen { public String say() { return "晚上十点小河边见......"; }}public class Wang implements WindWomen { private WindWomen windWomen; public Wang(WindWomen windWomen) { this.windWomen = windWomen; } public String say() { System.out.println("她找我让我给你带个话:"); System.out.println(windWomen.say()); System.out.println("记得啊!"); return null; }} 基于JDK的动态代理适用于接口实现,代码示例:
public class AgentTest { public static void main(String[] args) { final Pan pan = new Pan(); WindWomen windWomen = (WindWomen) Proxy.newProxyInstance( AgentTest.class.getClassLoader(), Pan.class.getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("她找我让我给你带个话:"); Object object = method.invoke(pan, args); System.out.println("记得啊!"); return object; } } ); windWomen.say(); }} CGLIB动态代理基于继承,适用于类继承:
public class Wang2 extends Pan { public String say() { System.out.println("她找我让我给你带个话:"); System.out.println(super.say()); System.out.println("记得啊!"); return null; }} 通过以上内容,可以清晰地了解Spring AOP的核心概念、实现方式及其实际应用。无论是静态代理还是动态代理,都能有效提升代码复用性和维护性。
转载地址:http://isft.baihongyu.com/