java advice
发布时间:2025-05-20 11:22:21 发布人:远客网络
一、java advice
java advice是什么,让我们一起了解一下?
Advice是在Join Point上执行的一个动作或者通知,一般通过拦截器调用。Spring有两大核心,IOC和AOP,在模块AOP里面有个advice。
在Spring-AOP中,增强(Advice)是如何实现的?
按照增强在目标类方法连接点的位置可以将增强划分为以下五类:
前置增强(org.springframework.aop.BeforeAdvice)表示在目标方法执行前来实施增强。
后置增强(org.springframework.aop.AfterReturningAdvice)表示在目标方法执行后来实施增强。
环绕增强(org.aopalliance.intercept.MethodInterceptor)表示在目标方法执行前后同时实施增强。
异常抛出增强(org.springframework.aop.ThrowsAdvice)表示在目标方法抛出异常后来实施增强。
引介增强(org.springframework.aop.introductioninterceptor)表示在目标类中添加一些新的方法和属性。
实战操作:Spring中Advice简单案例
@Configuration//配之类@EnableAspectJAutoProxy//启用AspectJ自动代理@ComponentScan(basePackages = {"spring01","spring02"}) //basePackages指定扫描的包 public class Config {}
@Aspect@Component public class Audience { /** * 相当于访问相同报下的不同的类,他们拥有相同的包路径,可以定义一个变量 */ @Pointcut("execution(* spring02.aspect.Performance.perform(..))") public void performance(){ } @Before("performance()") public void silenceCellPhones(){ System.out.println("====表演前将手机调静音"); } @Before("performance()") public void takeSeats(){ System.out.println("====表演前就做"); } @AfterReturning("performance()") public void applause(){ System.out.println("====表演后鼓掌"); } @AfterThrowing("performance()") public void demandRefund(){ System.out.println("====表演失败时退款"); } @Around("performance()") public void watchPerformance(ProceedingJoinPoint point){ try { System.out.println("====观看前1"); point.proceed(); System.out.println("====观看后2"); } catch (Throwable throwable) { throwable.printStackTrace(); } }}
public interface Performance { void perform();}
@Component("performance") public class PerformanceImpl implements Performance{ @Override public void perform() { System.out.println("======表演开始====="); }}
5、测试类@RunWith(SpringJUnit4ClassRunner.class)//启动测试时创建Spring上下文@ContextConfiguration(classes = {Config.class})//配置文件对象 public class TestClass { @Autowired private Performance performance; @Test public void test(){ performance.perform(); }}
二、什么是aop中的aspect,它有什么用途
AspectJ,是基于Java语言的AOP框架,Spring2.0引入了对其切点表达式的支持。新版本Spring建议使用AspectJ来开发AOP。AspectJ利用JDK5注解功能,允许直接在Bean类中定义切面,如使用@AspectJ注解。Aspect主要用途是自定义开发,实现代码的模块化和解耦,提高代码可维护性。
Aspect的通知类型包括:before(前置通知)、afterReturning(后置通知)、around(环绕通知)、afterThrowing(抛出异常通知)和after(最终通知)。这些类型各有用途和应用场景,例如before用于各种校验,afterReturning用于常规数据处理,around则拥有最大灵活性,可以执行任何操作,而afterThrowing用于处理异常信息,after用于清理资源。
开发时需要导入的jar包包括:aop联盟规范、Spring AOP实现、Aspect规范和Spring Aspect实现。基于XML的Aspect框架操作涉及四个步骤:创建目标接口、实现类、切面类(提供切面方法)、以及在XML中进行配置。通过这些步骤,可以灵活地定义和应用AOP逻辑。
综上所述,Aspect和其通知类型为开发者提供了强大的工具和策略,用于实现面向切面编程(AOP),并提供了对Spring框架的增强功能。这有助于提高代码的组织性、可读性和可维护性,同时减少重复代码的编写。
三、spring已经实现了aop,为什么还要用aspectj
spring有自己的AOP实现与aspectj的实现不同比较麻烦,马士兵的教程所讲的是spring整合了aspectj的AOP马士兵没有将spring自己的aop,在视频的末尾他说一般情况用不到spring自己的AOP你可以仔细听听,spring在做声明式事物处理时就没有用aspectj嘛!springAOP是设计用于在应用服务器环境下实现AOP,切入点与方面均由普通Java对象实现,其中连接点模型与AspectJ相同,只是远不如AspectJ丰富。针对你的问题spring有两组AOP一组是spring本身的一组是整合AspectJ,就好比在国际上一个中国人说英语是因为大家都说英语(好比AspectJ),但中国人还有自己的语言中文(spring自己的AOP)