笔记之用....
UserService
package com.spring.test; import org.springframework.stereotype.Component; @Component public interface UserService { public void createUser(); public void deleteUser(); public void updateUser(int id); }
实现类UserDao
package com.spring.test; import org.springframework.stereotype.Component; @Component public class UserDao implements UserService { public void createUser() { System.out.println("user saved..."); } public void deleteUser(){ System.out.println("delete user..."); } public void updateUser(int id){ System.out.println("update user..."); } }
配置文件
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <context:annotation-config></context:annotation-config> <context:component-scan base-package="com.spring.test,com.spring.log"></context:component-scan> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
要切入的
package com.spring.log; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class LogInterceptor { @Before(value="execution (* com.spring.test.*.*(..))") public void beforeMethod(JoinPoint point){ System.out.println("方法执行前执行"); System.out.println(point.getTarget()+"类的"+point.getSignature().getName()+"方法执行!!!"); } @After(value="execution (* com.spring.test.*.*(..))") public void afterMethod(JoinPoint point){ System.out.println("方法执行后执行"); System.out.println(point.getTarget()+"类的"+point.getSignature().getName()+"方法执行完毕!!!"); } }
Junit测试
package com.junit.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.test.UserService; public class Test { @org.junit.Test public void Test(){ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService service = (UserService) ctx.getBean("userDao"); service.createUser(); } }
测试结果:
方法执行前执行
com.spring.test.UserDao@1977b9b类的createUser方法执行!!!
user saved...
方法执行后执行
com.spring.test.UserDao@1977b9b类的createUser方法执行完毕!!!
相关推荐
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
接下来将详细介绍三种常用的Java代理技术:JDK代理、CGLIB代理以及AspectJ代理,并对比它们各自的优缺点。 #### 二、静态代理实例 静态代理可以通过下面的例子进行说明: ```java public interface Calculator { ...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
5. 配置织入:在Spring中,可以通过XML配置或注解方式来启用AspectJ自动代理,并声明切面。 了解并熟练掌握AspectJ、AspectJRT 和 AspectWeaver 的基本概念和用法,对于深入学习Spring AOP和提升应用程序的可维护性...
AspectJ Weaver在Spring AOP中起到关键作用,它可以动态地在类加载时织入切面,即使目标类没有被AspectJ编译器处理过。这使得AspectJ与Spring的集成更加灵活,可以在不修改原有代码的情况下引入切面。 2. `...
2. **动态织入**:在类加载时或运行时,通过代理模式实现切面的织入。这使得可以在不重新编译源代码的情况下引入新的切面。 3. **AspectJ语言**:AspectJ提供了一套强大的声明式语法,用于定义切点、通知以及它们...
【Android + 反射 + 代理 + 静态代理 + AspectJ】 面向切面编程(AOP)是一种编程范式,与面向对象编程(OOP)相对,它旨在将关注点分离,使得通用功能(如日志记录、事务管理等)可以从核心业务逻辑中解耦。AOP 的...
运行时织入则依赖于代理模式。 6. **引入(Introduction)**: 引入允许在现有类中添加新的方法或字段,无需修改原有代码。这对于添加如日志记录、锁等通用功能非常有用。 7. **注解驱动的编程**: AspectJ支持使用...
两种方式都需要在Spring配置中指定启用AspectJ自动代理。 3. 定义切面:在Java类中定义切面,通常使用`@Aspect`注解标记。切面包含通知(advice),如前置通知(before)、后置通知(after)、环绕通知(around)等...
AspectJ可以在编译时(编译器织入)、类加载时(类装载器织入)或运行时(代理织入)进行织入,根据项目需求选择合适的时机。 4. **注解(Annotation)支持**:AspectJ提供了注解驱动的编程模型,使得切面的定义...
3. **配置AspectJ**:在Spring框架中,需要配置AspectJ的自动代理,使切面生效。 ```xml <aop:aspectj-autoproxy /> ``` **四、AspectJ的应用场景** 1. **日志记录**:在方法调用前后记录日志,便于追踪程序...
4. **织入(Weaving)**:织入是将切面应用到目标对象的过程,可以发生在编译时(编译器织入)、类加载时(类装载器织入)或运行时(代理织入)。AspectJ提供了一款编译器和一个类装载器,以支持这三种类型的织入。 ...
spring默认使用的就是AspectJ来实现的动态代理。使用spring的aop的时候,需要引入aspectj.jar
根据提供的信息,我们可以深入探讨如何在Android环境中使用AspectJ实现动态代理,并且解析代码片段来进一步解释具体的实现细节。 ### Android中的AspectJ简介 AspectJ是一种面向切面编程(AOP)的语言,它允许...
- **配置织入**:在Spring配置中启用AspectJ自动代理,并将切面类加入到上下文中。 - **运行实验**:编写测试用例,观察切面是否正确地在目标方法执行前后或异常时介入。 5. **aoptest**文件可能包含了实验所需的...
此外,书中可能还提到了AspectJ的开发和调试工具,如AspectJ Weaver和LTW(Load-Time Weaving),它们可以帮助开发者在运行时动态地编织切面。 压缩包内的"Manning@2003 - AspectJ In Action.pdf"是该书的电子版,...
本项目旨在通过Java的动态代理技术实现面向切面编程(AOP),涵盖了静态代理、JDK动态代理、CGLIB动态代理、AspectJ以及基于instrumentation的动态代理等多种实现方式。通过这些实现方式,可以在不修改原有代码的...
另一种是通过Spring的注解驱动的AOP,它利用AspectJ的编译器或 weaving工具来生成代理类,但可以在不引入额外的依赖下运行。`aspectweave`标签通常与AspectJ的织入过程相关,它可以控制何时以及如何进行织入。 在...
5. **类型织入与编译时织入**:对比分析编译时织入(使用ajc编译器)和类型织入(使用Java代理)的优缺点,以及如何选择合适的方法。 6. **注解驱动的AOP**:介绍如何使用AspectJ的注解来简化切面的定义,使代码...
`<aop:aspectj-autoproxy>`标签启用了AspectJ的自动代理功能,使得Spring能够识别并处理切面。`<bean>`标签定义了切面类的bean,使其能够被Spring容器管理。 此外,AspectJ还提供了其他的注解,如`@After`、`@...