最近研究了下spring的aop,从spring2开始,spring支持基于XML和annotation的两种配置,先来看看基于XML配置的实现。
基于XML配置的实现:
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="log" class="com.inter.GetLog"></bean>
<!--
注意这里:expression="execution(* com.inter.*.print*(..))"
括号里面第一个*号代表返回值 接下来 com.inter.*. 是你要切入的代码的大概路径,这里为什么用大概路径来形容呢
因为这里的意思是符合以com.inter的路径都会作为选择的对象,也不详细介绍,查下就明白了, print*(..)是指
方法名以print开头的都符合,括号里面的 .. 表示参数是随意的都可以。
-->
<aop:config>
<aop:aspect ref="log">
<aop:pointcut id="printMethods" expression="execution(* com.inter.*.print*(..))"/>
<aop:around method="getLog" pointcut-ref="printMethods"/>
</aop:aspect>
</aop:config>
<aop:config>
<aop:aspect ref="log">
<aop:pointcut id="dealException" expression="execution(* com.inter.*.excep*(..))"/>
<aop:around method="getLog" pointcut-ref="dealException"/>
</aop:aspect>
</aop:config>
<aop:config>
<aop:aspect ref="log">
<aop:pointcut id="before" expression="execution(* com.inter.*.bef*(..))"/>
<aop:before method="before" pointcut-ref="before"/>
</aop:aspect>
</aop:config>
<!--要织入代码的bean-->
<bean id="print" class="com.inter.SystemPrint"></bean>
</beans>
SystemPrin的实现类:
public class SystemPrint implements Print{
public String print(String name){
String result="hello " + name;
System.out.println(result);
return result;
}
public String before(String name){
String result="before " + name;
System.out.println(result);
return result;
}
public void exception(String name) throws Exception{
System.out.println(name);
throw new Exception();
}
}
下面是所要织入的代码,也就是我们要用来打印和处理异常:
import org.aspectj.lang.ProceedingJoinPoint;
public class GetLog {
public void getLog(ProceedingJoinPoint joinpoint) throws Throwable {
System.out.println("===begin===");
try{
joinpoint.proceed();
}
catch(Exception e)
{
System.out.println("log exception!");
}
System.out.println("===end=====");
}
public void before(JoinPoint joint) throws Throwable
{
System.out.println("===begin===");
System.out.println("before!");
}
}
编写一个测试类,分别测试上面两个方法,可以得到如下的结果:
===begin===
hello ding
===end=====
-----------------
===begin===
laoding
log exception!
===end=====
-----------------
===begin===
before!
before beforeing
下面来看看基于Annotation的实现:
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--基于@AspectJ切面的驱动器,如果没有这句话 切面的代码是不会执行的,可以试下-->
<aop:aspectj-autoproxy/>
<bean id="myAspect" class="com.inter.MyAspect"></bean>
<bean id="hello" class="com.inter.HelloImpl"></bean>
</beans>
HelloImpl类的实现:
public class HelloImpl implements Hello {
public String hello(String name)
{
String say = "Hello," + name;
System.out.println(say);
return say;
}
}
切面的实现:
//首先这是注释这个类就是切面
@Aspect
public class MyAspect {
/*这里是注释要切入的方法,AfterReturning是表示方法返回以后进行切入,我这里
选这个的话是因为日志一般都是在方法执行完成后记录,当然你可以拿Before来试*/
@Around("execution(* com.inter.*.hello(..))")
public void doLog(ProceedingJoinPoint joinpoint) throws Throwable{
String result = (String)joinpoint.proceed();
System.out.println("---doLog"+result);
}
}
然后编写一个测试类,得到如下测试结果:
-----------------
Hello,xiao
---doLogHello,xiao
分享到:
相关推荐
本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际应用。 1. **核心概念** - **切面(Aspect)**:切面是关注点的模块化,包含业务逻辑之外的横切关注点,如日志、事务管理。 - **连接点(Join Point...
本笔记将深入探讨这两个概念以及它们在Spring中的实现。 1. Spring框架简介: Spring作为一个轻量级的开源框架,旨在简化企业级应用的开发。它通过提供IOC容器,实现了对象的创建、管理和依赖注入,减轻了开发者对...
**Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...
SSH-AOP笔记主要涵盖的是Spring、Struts和Hibernate三大框架集成使用时,如何结合Aspect Oriented Programming(面向切面编程)的理念进行应用增强。在Java企业级开发中,SSH是常用的MVC架构,而AOP则是一种编程范式...
Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...
NULL 博文链接:https://linres.iteye.com/blog/281221
springAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOP
Spring Aop 学习笔记
【Spring AOP源码笔记】 Spring AOP是Spring框架的核心组件之一,它实现了面向切面编程(Aspect-Oriented Programming,简称AOP),允许开发者定义“切面”,这些切面可以封装横切关注点,如日志记录、事务管理等。...
Spring_AOP,全称为Spring的面向切面编程,是一种编程范式,旨在将关注点分离,使得代码结构更清晰,可维护性更强。在传统的面向对象编程(OOP)中,我们通常会将业务逻辑与系统服务(如日志、事务管理等)混杂在...
本笔记主要探讨了如何在Spring应用中使用AOP来实现横切关注点,如日志、事务管理、性能监控等。 首先,理解AOP的基本概念至关重要。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切面由两个主要...
**Spring AOP 知识点详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它允许程序员定义“切面”,这些切面可以封装跨越多个对象的行为,比如日志、事务管理等。AOP...
**Spring AOP 详解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种将业务逻辑与系统服务(如日志、事务管理等)分离的方法,使得我们可以更好地关注...
Spring框架是Java开发中不可或缺的一部分,它为开发者提供了强大的依赖注入(IOC)和面向切面编程(AOP)功能,以及用于构建Web应用程序的MVC框架。Spring Boot则是基于Spring框架构建的应用程序启动器,旨在简化...
Spring的AOP开发(XML)Spring的AOP的注解开发 代码案例
JAVA Spring AOP面向切面编程笔记
Spring框架是Java开发中的核心组件,它为应用程序提供了一个全面的基础设施,包括依赖注入(DI)、面向切面编程(AOP)以及数据访问等服务。SSM是Spring、SpringMVC和MyBatis的组合,是Java Web开发的常用框架栈。这...
Spring的核心特性是控制反转(IOC)和面向切面编程(AOP)。它提供了一个全面的编程和配置模型,可以用于构建各种类型的Java应用程序,包括Web应用。 1. **Spring介绍** - **侵入式概念**:传统Java EE应用中,...
### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...