Spring AOP implements aspect-oriented programming based on Java dynamic proxies, allowing additional logic to be inserted before and after method execution without modifying the original code. The specific steps are as follows: Create a proxy object, use the Proxy.newProxyInstance() method, and provide a class loader, interface and call handler. Call the processor's invoke() method, obtain the target object, the interceptor chain, and call the interceptors invoke() in sequence. Finally, if there is no exception, the method of the target object is called.
The implementation principle of Spring AOP
AOP (aspect-oriented programming) is a programming paradigm that allows the original In the case of code, additional logic is inserted before and after method execution. AOP is implemented in the Spring framework using the dynamic proxy pattern.
Implementation based on Java dynamic proxy
Spring mainly uses Java dynamic proxy to create proxy objects, which is a class that implements a specific interface and can intercept method calls. The proxy object is created by the Proxy.newProxyInstance()
method, which requires the following parameters:
Spring AOP's call processor
Spring's invocation handler implements the InvocationHandler
interface, which defines the invoke()
method that is called when the proxy object's method is called. In the invoke()
method, Spring performs the following steps:
invoke()
method of each interceptor in turn. Practical case
Consider a simple Spring application, which has a MyService
class. We want to add logging logic before and after MyService.myMethod()
method execution.
XML configuration:
<bean id="myService" class="com.example.MyService" /> <bean id="loggingAspect" class="com.example.LoggingAspect"> <property name="pointcut"> <aop:pointcut expression="execution(* com.example.MyService.myMethod(..))" /> </property> </bean>
Java configuration:
@Configuration @EnableAspectJAutoProxy public class AppConfig { @Bean public MyService myService() { return new MyService(); } @Bean public LoggingAspect loggingAspect() { return new LoggingAspect(); } }
LoggingAspect class:
@Aspect public class LoggingAspect { @Before("execution(* com.example.MyService.myMethod(..))") public void logBefore() { System.out.println("Before myMethod()"); } @AfterReturning("execution(* com.example.MyService.myMethod(..))") public void logAfterReturning() { System.out.println("After returning from myMethod()"); } }
Usage:
MyService myService = ApplicationContext.getBean(MyService.class); myService.myMethod();
Output:
Before myMethod() After returning from myMethod()
This demonstrates how to use Spring AOP to add additional logic to a method without modifying the original code.
The above is the detailed content of How is AOP (aspect-oriented programming) implemented in the Spring framework?. For more information, please follow other related articles on the PHP Chinese website!