继上篇spring IOC,又学习了,spring AOP,同样是注解模式:
面向切面:
import com.pac;//1.包名--不可变
Class className{//2.类名--不可变
//3.返回类型--不可变
//4.方法名称--不可变
//5.入参类型--不可变
//6.入参值--可变
//7.异常--可捕获
//8.返回值--可变
public T getDate(D inData)throws Exception{
return T;
}
}
面向方法的切面:
执行前:对入参D inData或者调用者进行处理
执行后:对返回值T 或者调用者进行处理
异常处理:对获取的异常或调用者进行处理
执行之中:对调用者,入参,返回值,以及异常进行处理--很强大,其实直接用这个就行。
小例子:
1.有一个业务,很简单,对传入的参数进行处理,然后返回
package com.aop.service; import org.springframework.stereotype.Component; import com.aop.bo.InputVal; import com.aop.bo.ReturnVal; @Component public class ServiceImpl { public ReturnVal getData(InputVal val) throws Exception{ ReturnVal rtVal = new ReturnVal(); //模拟处理 rtVal.setKey(val.getKey()+"处理后"); rtVal.setValue(val.getValue()+"处理后"); System.out.println("------------执行中-------------"); //模拟异常 // if(val.getKey().equals("ex")){ // throw new Exception("异常!"); // } return rtVal; } public String toString() { return "ServiceImpl调用者"; } }
2.入参数据:
package com.aop.bo; public class InputVal { private String key = null; private String value = null; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "InputVal [key=" + key + ", value=" + value + "]"; } }
3.出参数据:
package com.aop.bo; public class ReturnVal { private String key = null; private String value = null; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "ReturnVal [key=" + key + ", value=" + value + "]"; } }
4.对业务进行切面:
package com.aop.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import com.aop.bo.InputVal; import com.aop.bo.ReturnVal; @Component @Aspect public class AopService { // @Pointcut("execution(* com.aop.service.ServiceImpl.getData(..))") // private void cut(){} private final String CUT = "execution(* com.aop.service.ServiceImpl.getData(..))"; /* //方法执行前调用 @Before(CUT) public void before(){ System.out.println("-----------执行前--------------------"); } //方法执行后调用 @After(CUT) public void after() { System.out.println("------------执行后------"); } */ @Around(CUT) //spring中Around通知 环绕通知 public Object logAround(ProceedingJoinPoint joinPoint) { Object tarjet = joinPoint.getTarget();//1.调用者 //-----日志,调用者 System.out.println("1.调用者:------"+tarjet); Object[] args = joinPoint.getArgs();//2.传参 System.out.println("2.传参:----"+args[0]); if(args[0] instanceof InputVal){ InputVal val = (InputVal) args[0]; val.setKey(val.getKey()+"改了么?"); } Object obj = null; try { obj = joinPoint.proceed(args); if(obj.getClass().equals(ReturnVal.class)){ ReturnVal rval = (ReturnVal) obj; rval.setValue(rval.getValue()+"改了?"); } } catch (Throwable e) { e.printStackTrace(); } System.out.println("3.返回参数:---"+obj);//3.返回参数 return obj; } }
5.调用测验:
package com.aop.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.aop.bo.InputVal; import com.aop.service.ServiceImpl; public class Main { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); ServiceImpl si = (ServiceImpl) ctx.getBean("serviceImpl"); InputVal val = new InputVal(); val.setKey("inKey"); val.setValue("inVal"); System.out.println(si.getData(val)); } }
6.配置文件,要打开aop注解扫描:
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 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"> <!-- 扫描com.ioc下的所有类,自动为spring容器管理 --> <context:component-scan base-package="com"/> <!-- 打开面向切面工具 --> <aop:aspectj-autoproxy/> </beans>
相关推荐
总结起来,Spring AOP注解版通过简单易懂的注解,使得面向切面编程变得更加直观和方便。它降低了横切关注点与业务逻辑之间的耦合度,提高了代码的可维护性和复用性。通过合理利用这些注解,开发者可以轻松地实现日志...
在这个入门实例中,我们将深入理解Spring AOP如何实现简单日志记录。 首先,AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。切面是AOP中的核心...
- **SpringAOP.avi**:可能是一个视频教程,详细讲解了Spring AOP的概念和实践。 - **SpringAOP.doc**:可能是文档教程,包含了详细的步骤和示例代码。 - **SpringAOP_src.rar**:源代码示例,供你参考和实践。 - **...
Spring Aop基于annotation注解练习
Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了一种模块化和声明式的方式来处理横切关注点,如日志、事务管理、性能监控等。在传统的面向对象编程...
**Spring AOP 入门案例详解** 在Java开发中,Spring框架因其强大的功能和灵活性而备受推崇,其中Spring AOP(Aspect Oriented Programming,面向切面编程)是它的一个重要特性。AOP允许开发者将关注点从核心业务...
在学习过程中,您可以参考压缩包中的`springAOP`文件,其中可能包含示例代码和详细的步骤解释,帮助您更好地理解和实践这些概念。动手实践是掌握Spring AOP的最好方式,通过创建自己的切面和通知,您将能够深入理解...
本入门案例将帮助你理解并掌握Spring AOP的基本概念和使用方法。 在Spring AOP中,我们首先需要了解的是"切面"(Aspect)的概念。切面是封装了横切关注点的代码模块,它可以包含通知(Advice)、切点(Pointcut)和...
在Spring AOP中,通过表达式或注解来定义切入点。 3. **通知(Advice)**:通知是在特定切入点上执行的行为,比如记录日志、开始/结束事务等。有五种不同类型的通知:前置通知(Before)、后置通知(After)、返回...
4. 使用注解驱动的AOP配置,以及如何在Spring配置文件中启用AOP自动代理。 5. 引入的概念和使用,以及如何通过引入增加类的方法或属性。 6. 实践示例,可能包括事务管理、日志记录等实际应用场景的AOP实现。 通过这...
**Spring AOP 入门实例** 在Java编程中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它允许程序员定义“横切关注点”,如日志、事务管理、性能监控等,然后将这些关注点与核心业务逻辑...
**Spring AOP 入门实例1** 在Java开发中,Spring框架因其强大的功能和灵活性而备受推崇,其中Spring AOP(Aspect Oriented Programming,面向切面编程)是其重要组成部分。AOP允许开发者定义“切面”,这些切面可以...
**Spring AOP 入门及其实例讲解** 在软件开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它旨在提高代码的可重用性,减少冗余,并将关注点分离。Spring框架是Java开发中的一个流行...
Spring 2.5引入了对注解的AOP支持,使得配置更加简洁。我们可以直接在切面类上使用`@Aspect`注解,然后在方法上使用`@Before`、`@After`、`@Around`等注解来定义通知。例如: ```java @Component @Aspect ...
在本入门例子中,你将学习如何在Spring环境中设置并使用AOP。 首先,我们需要理解AOP的基本概念。在面向对象编程中,业务逻辑代码往往会被一些通用的、非核心的代码(如日志、事务)所穿插,这降低了代码的可读性...
5. **Spring AOP入门**: Spring AOP通过XML配置或者注解方式来实现AOP功能。在XML配置中,可以定义Bean、Advisor、Pointcut等元素。在注解方式下,可以使用`@Aspect`、`@Before`、`@After`、`@AfterReturning`、`@...
在Spring中,切入点通常通过表达式或者注解来定义。 5. **织入(Weaving)** 织入是将切面应用到目标对象,创建代理对象的过程。Spring支持运行时织入和编译时织入,其中运行时织入更为常见,它可以在应用运行时...
@AspectJ是Spring AOP的一个扩展,它提供了一种更接近传统编程的注解驱动的方式来定义切面。接下来,我们详细讲解如何使用@AspectJ进行切面定义: 1. **创建切面类**:首先,你需要创建一个Java类,并使用`@Aspect`...
在这个名为"springAOP-dome"的实例中,我们将探讨如何利用Spring AOP实现一个简单的日志记录功能,以作为入门学习。 首先,了解AOP的基本概念是必要的。面向切面编程是一种编程范式,旨在解决程序中的横切关注点,...