非springboot 使用aop 切面
在非Spring Boot应用中使用AOP(Aspect Oriented Programming,面向切面编程)的代码实现需要依赖Spring AOP库。由于Spring AOP库并不直接支持非Spring应用,你需要将Spring AOP库作为依赖项添加到项目中,并使用Spring AOP的基本概念手动实现AOP。
以下是一个基本的AOP示例,演示了如何在非Spring Boot应用中使用AOP:
-
首先,添加Spring AOP库的依赖项到你的项目中。如果你使用Maven,可以在pom.xml文件中添加以下依赖项:
xml复制代码
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
-
创建一个Aspect类,用于定义切面。在这个类中,你可以定义切入点、前置通知、后置通知等。以下是一个简单的Aspect类示例:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@Pointcut("execution(* com.example.myapp.service.*.*(..))")
public void serviceMethods() {}
@Before("serviceMethods()")
public void beforeServiceMethod() {
System.out.println("Before service method execution.");
}
}
这个Aspect类定义了一个切入点(serviceMethods),该切入点匹配com.example.myapp包下service包中所有方法的执行。然后,它定义了一个前置通知(beforeServiceMethod),在匹配的方法执行之前输出一条消息。
3. 在你的应用中,你需要手动启动AOP代理。这可以通过创建一个代理对象来实现,该对象实现了目标对象的接口,并在调用方法时执行AOP逻辑。以下是一个示例:
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.interceptor.SimpleTraceInterceptor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.myapp.MyService;
import com.example.myapp.MyAspect;
@Component
public class MyApp {
@Autowired
private MyService myService;
@Autowired
private MyAspect myAspect;
@Autowired
private ApplicationContext applicationContext;
public void run() {
ProxyFactory factory = new ProxyFactory(new MyServiceImpl()); // 创建目标对象的代理工厂
factory.addInterceptor(new SimpleTraceInterceptor()); // 添加一个简单的跟踪拦截器来输出方法调用的信息
factory.addAdvisor(new DefaultPointcutAdvisor(new MyAspect(), new StaticMethodMatcherPointcut() { // 添加自定义的切面和切入点匹配器
@Override
public boolean matches(Method method, Class<?> targetClass) {
return true; // 匹配所有方法,这里只是一个示例,需要根据实际需求进行修改。
}
}));
MyService proxy = (MyService) factory.getProxy(); // 创建代理对象并注入目标对象的方法调用逻辑和AOP逻辑。
proxy.doSomething(); // 调用代理对象的方法,将触发AOP逻辑的执行。
}
}
创建了一个代理工厂(ProxyFactory),并将拦截器和切面添加到工厂中。然后,我们使用工厂创建一个代理对象(MyServiceImpl),并将其注入到MyApp类的实例中。最后,我们调用代理对象的方法(doSomething),将触发AOP逻辑的执行。在这个示例中,我们使用了一个简单的跟踪拦截器来输出方法调用的信息,并在实际开发中可以根据需要使用其他拦截器和通知类型来实现更复杂的AOP逻辑。