spring的AOP(Aspect Oriented Programming)面向切面编程

程序中需要有日志等需要,若在原本程序加代码会导致代码混乱,不宜维护,解决方法:

  1. 使用代理。
  2. 使用spring的AOP。

spring的AOP注解方式使用:

1.加入jar包(com.springsource.org.aopalliance,sapectj.weaver,spring-aop)

2.创建一个切面类(Aspect)


package com.zhiyou100.kfs.aspects;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.AfterReturning;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.springframework.stereotype.Component;

@Aspect //切面

@Component       //bean

public class LogAspects {

/*

*   第一个*:通配符  任意访问修饰符和任意返回值

*   第二个*:类

*   第三个*:方法

*   ..:可变参数

*/

@Before(value="execution(* com.zhiyou100.kfs.aspects.*.*(..))")

public void before(JoinPoint joinpoint) {

Object[] args = joinpoint.getArgs();//参数

String name = joinpoint.getSignature().getName();//方法名字

System.out.println("begin,method:"+name);

}

@AfterReturning

@After(value="execution(* com.zhiyou100.kfs.aspects.*.*(..))")       //方法执行return前执行

public void after(JoinPoint joinpoint) {

String name = joinpoint.getSignature().getName();//方法名字

System.out.println("end,method:"+name+",result:");

}

}

3.在spring配置文件开启切面注解


<!-- 包扫描 -->

<context:component-scan base-package="com.zhiyou100.kfs"/>

<!-- 开启切面注解 -->

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

4.测试代码


ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");

TestProxy t=(TestProxy)app.getBean("testProxyImp");

t.add(1, 8,1);

spring的AOPxml方式使用:

1.创建一个需要被通知的接口和相应实现类

接口:


package com.zhiyou100.kfs.aspects.xml;

public interface TestProxy {

public void add(int a,int b);

public int add(int a,int b,int c);

}

相应实现类:


package com.zhiyou100.kfs.aspects.xml;

public class TestProxyImp implements TestProxy  {

public void add(int a,int b){

int sum=a+b;

System.out.println(sum);

throw new RuntimeException("运行时异常");

}

public int add(int a,int b,int c){

int sum=a+b+c;

System.out.println(sum);

return sum;

}

}

2.在spring配置文件中配置。


<?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"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

<!-- 定义被通知的程序类(可以用注解) -->

<bean id="testProxyImp" class="com.zhiyou100.kfs.aspects.xml.TestProxyImp"></bean>

<!-- 定义切面类的bean -->

<bean id="logAspect" class="com.zhiyou100.kfs.aspects.xml.LogAspects"></bean>

<!-- 配置切面 -->

<aop:config>

<!-- 定义表达式:切点 -->

<aop:pointcut expression="execution(* com.zhiyou100.kfs.aspects.xml.*.*(..))" id="pointcut"/>

<!-- 定义切面 -->

<aop:aspect ref="logAspect">

<!-- 定义前置通知 -->

<aop:before method="before" pointcut-ref="pointcut"/>

<!-- 定义后置通知 -->

<aop:after method="after" pointcut-ref="pointcut"/>

<!-- 定义返回通知 -->

<aop:after-returning method="cc" pointcut-ref="pointcut" returning="result"/>

<!-- 定义异常通知 -->

<aop:after-throwing method="e" pointcut-ref="pointcut" throwing="e"/>

</aop:aspect>

</aop:config>

</beans>

3.最后去测试

原文地址:https://www.cnblogs.com/kfsrex/p/11494621.html

时间: 2024-07-31 17:25:03

spring的AOP(Aspect Oriented Programming)面向切面编程的相关文章

Java实战之03Spring-03Spring的核心之AOP(Aspect Oriented Programming 面向切面编程)

三.Spring的核心之AOP(Aspect Oriented Programming 面向切面编程) 1.AOP概念及原理 1.1.什么是AOP OOP:Object Oriented Programming面向对象编程 AOP:Aspect Oriented Programming面向切面编程 1.2.代理 充分理解:间接 主要作用:拦截被代理对象执行的方法,同时对方法进行增强. 1.2.1.静态代理 特点:代理类是一个真实存在的类.装饰者模式就是静态代理的一种体现形式. 1.2.2.动态代

AOP Aspect Oriented Programming

原理AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent).事务管理(Transaction Management).安全管理(Security).日志管理(Lo

[Spring实战系列](16)面向切面编程(AOP)概述

1. 简介 在软件中,有些行为对于大多数应用都是通用的.日志,安全和事务管理的确很重要,但他们是都是应用对象主动参与的行为呢?如果让应用对象只关注自己所针对的业务领域问题,而其他方面的问题由其他应用对象来处理,这样会不会更好? 在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离是面向切面编程索要解决的. 上图展示了一个被划分为模块的典型应用.每个模块的核心功能都是为特

Spring详解(五)------面向切面编程

.AOP 什么? AOP(Aspect Oriented Programming),通常称为面向切面编程.它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面.所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性. 什么是切面,什么是公共模块,那么我们

spring入门(四)【面向切面编程】

开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而面向切面编程则侧重于事务的一个方面.在面向切面编程过程中有几个比较重要的概念:切面.切点.连接点.通知, 通知:描述了切面要完成的工作,例如,要向某个方法注入日志功能,这里的日志功能就是通知:通知分为5种:Before.After.After-returning.After-throwing.Aro

SpringBoot—集成AOP详解(面向切面编程Aspect)

AOP介绍 AOP概述 ??AOP是Aspect-Oriented Programming,即为面向(切面)方面编程.在维基百科中的解释:Aspect是一种新的模块化机制,用来描述分散在对象.类或函数中的横切关注点.从关注点中分离出横切关注点是面向切面的程序设计核心概念.分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑代码不需要再包含针对特定领域问题代码的调用,比如一些公用模块的日志.安全等代码. ??代码通过切面抽离,更加整齐和清晰,将重复的代码抽取出来单独的进行维护,在需要

xml的方式配置AOP:Aspect Oriented Programming

在某些类中, 什么时机, 做什么事情 切入点(point-cut): 在某些类中(Class<?>[] itfc = new Class<?>[] { IStudentService.class }) 通知: 什么时机, 做什么事情(InvocationHandler的invoke方法) 切面: 切入点 + 通知 织入(weaver): Proxy.newProxyInstance: 把切入点和通知施加到具体的业务逻辑上的过程 XML配置AOP步骤: 1,准备了一个实现接口的bea

Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式

1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 -- 3.情景举例 ①数学计算器接口[MathCalculator] int add(int i,int j); int sub(int i,int j); int mul(int i, int j); int div(int i,int j); 因为后面的通知方法需要返回值,所以在这里类型声明为 int 类型 public

AOP面向切面编程

点击打开链接 理解AOP Posted on 2012-06-01 10:54 yanbin_new 阅读(30406) 评论(6) 编辑 收藏 Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流. AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能.最常见的就是事务控制.工作之余,对于

AOP面向切面编程笔记

1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 -- 3.情景举例 ①数学计算器接口[MathCalculator] int add(int i,int j); int sub(int i,int j); int mul(int i, int j); int div(int i,int j); ②提供简单实现[EasyImpl] ③在简单实现的基础上让每一个计算方法都能够打印日志[Log