AOP面向切面编程(使用注解和使用配置文件)
Aop(面向切面编程)
使用注解的方式:
加入相应的jar包:
- com.springsource.org.aopalliance-1.0.0.jar
- com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
- sping-aspects-4.3.3.RELEASE.jar
创建一个切面类
package com.alibaba.wlq.invoke; import java.util.Arrays; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
//@Aspect:表示该类为切面类
@Aspect
//@Component:表示该类由Spring管理
@Component
public class logAspect {
//@Before:表示before方法在被通知的程序类的方法执行之前执行
//execution():表示需要被通知的类中的add方法,add方法可以用通配符表示,那就表示该类中所有的方法都要被通知
@Before(value="execution(* com.alibaba.wlq.invoke.ArithmeticImp.add(double,double))")
//JoinPoint:是程序执行中的一个精确执行点,例如类中的一个方法。它是一个抽象的概念,在实现AOP时,并不需要去定义一个join point
public void before(JoinPoint joinpoint) {
//获得被通知程序类的参数,返回类型是一个数组
Object[] args = joinpoint.getArgs();
//获取被通知程序类的方法名,返回类型是字符串
String name = joinpoint.getSignature().getName();
System.out.println("alibaba------>the method "+name+" begin with"+Arrays.asList(args));
} //@After:后置通知,表示在类的方法执行后、类中的return方法执行前执行
@After(value="execution(* com.alibaba.wlq.invoke.ArithmeticImp.add(double,double))")
public void after() {
System.out.println("alibaba------>the method *** end result");
}
}
创建被通知的类的接口
package com.alibaba.wlq.invoke; public interface Arithmetic {
public double add(double a,double b);
}
创建被通知的类并且继承接口重写其中的方法
package com.alibaba.wlq.invoke; import org.springframework.stereotype.Component; @Component
public class ArithmeticImp implements Arithmetic{ @Override
public double add(double a, double b) {
double result = a + b;
System.out.println(result);
return result;
} }
配置文件中的配置
<?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:context="http://www.springframework.org/schema/context"
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/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <!-- 包扫描,前提加入aop的jar包 -->
<context:component-scan base-package="com.alibaba.wlq"></context:component-scan>
<!-- 开启切面注解 -->
<aop:aspectj-autoproxy/>
</beans>
测试类
package com.alibaba.wlq.test; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.alibaba.wlq.controller.UsersController;
import com.alibaba.wlq.invoke.Arithmetic;
import com.alibaba.wlq.invoke.ArithmeticImp; public class Test2 { public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext app = new ClassPathXmlApplicationContext("app3.xml");
Arithmetic arith = (Arithmetic) app.getBean("arithmeticImp");
arith.add(15.0, 20.0);
}
}
打印结果
alibaba------>the method add begin with[15.0, 20.0]
35.0
alibaba------>the method *** end result
使用xml配置文件
导入相应的jar包
创建接口并且创建相应的类实现该接口
package com.alibaba.wlq.invoke; public interface Metic {
public double add(double a,double b);
public double sub(double a,double b);
public double mul(double a,double b);
public double div(double a,double b);
}
package com.alibaba.wlq.invoke; public class MeticImp implements Metic{ @Override
public double add(double a, double b) {
double result = a + b;
System.out.println(result);
return result;
} @Override
public double sub(double a, double b) {
double result = a - b;
System.out.println(result);
return result;
} @Override
public double mul(double a, double b) {
double result = a * b;
System.out.println(result);
return result;
} @Override
public double div(double a, double b) {
double result = a / b;
System.out.println(result);
return result;
} }创建切面类
package com.alibaba.wlq.invoke; import java.util.Arrays; import org.aspectj.lang.JoinPoint; public class Invoke {
public void before(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
String name = joinPoint.getSignature().getName();
System.out.println("alibaba------>the method "+name+" begin with "+Arrays.asList(args));
}
public void after(JoinPoint joinPoint) {
String name = joinPoint.getSignature().getName();
System.out.println("alibaba------>the method "+name+" end result:");
}
public void afterreturn(Object result) {
System.out.println("result:========"+result);
}
}
配置文件
<?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="metic" class="com.alibaba.wlq.invoke.MeticImp"></bean> <!-- 定义切面类的Bean -->
<bean id="invoke" class="com.alibaba.wlq.invoke.Invoke"></bean> <!-- 配置切面 -->
<aop:config>
<!-- 定义表达式、切点 -->
<aop:pointcut expression="execution(* com.alibaba.wlq.invoke.*.*(..))" id="point"/>
<!-- 定义切面 -->
<aop:aspect ref="invoke">
<!-- 定义前置通知 -->
<aop:before method="before" pointcut-ref="point" />
<!-- 定义后置通知 -->
<aop:after method="after" pointcut-ref="point"/>
<!-- 定义返回通知returning属性值得名称要和方法中的参数名称一致 -->
<aop:after-returning method="afterreturn" pointcut-ref="point" returning="result"/>
</aop:aspect>
</aop:config>
</beans>
测试类
package Test; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.alibaba.wlq.invoke.Metic; public class Test1 {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("app.xml");
Metic arith = (Metic) app.getBean("metic");
arith.add(15, 10);
}
}输出结果
alibaba------>the method add begin with [15.0, 10.0]
25.0
alibaba------>the method add end result:
result:========25.0
AOP面向切面编程(使用注解和使用配置文件)的更多相关文章
- Spring AOP 面向切面编程相关注解
Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. ...
- Spring -07 -AOP [面向切面编程] - 使用注解@+ AspectJ 方式实现环绕/前/后等通知 -超简洁 --静态代理/动态代理{JDK/cglib}
1.spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能有注解;使用注解来取代配置文件.1.1 引入xmlns:context ,指定扫描范围 <context:comp ...
- spring:AOP面向切面编程(注解)03
使用注解写aop时最好使用环绕通知写 切面类: /** * 用于记录日志的工具类,它里面提供了公共的代码 */ @Component("logger") @Aspect //表示当 ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- Spring:AOP面向切面编程
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...
- Spring Boot2(六):使用Spring Boot整合AOP面向切面编程
一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop aop全称Aspec ...
- 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...
- 谈一谈AOP面向切面编程
AOP是什么 : AOP面向切面编程他是一种编程思想,是指在程序运行期间,将某段代码动态的切入到指定方法的指定位置,将这种编程方式称为面向切面编程 AOP使用场景 : 日志 事务 使用AOP的好处是: ...
- 基于SpringBoot AOP面向切面编程实现Redis分布式锁
基于SpringBoot AOP面向切面编程实现Redis分布式锁 基于SpringBoot AOP面向切面编程实现Redis分布式锁 基于SpringBoot AOP面向切面编程实现Redis分布式 ...
- 极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
随机推荐
- 工作三年!全靠大佬的Java笔记,年底跳槽阿里涨了10K
前言 不论是校招还是社招都避免不了各种⾯试.笔试,如何去准备这些东⻄就显得格外重要,之前8月底阿里的人事部门打电话叫我要不要面试,当时正处于换工作的期间,于是就把简历发给阿里hr,人事审核后经过一些列 ...
- [日常摸鱼]HDU1348Wall-凸包
我学习进度慢得连我自己都怕- 题意:大概给$n$个点搞出它的凸包,然后还要在凸包外弄一层厚为$l$的东西,求这个东西的周长 我个滞涨居然把pi开成了int-搞了一个晚上才看见 凸包直接求,因为是凸多边 ...
- linux重启后nginx服务无法启动
查看ngin.conf pid的内容 例如: pid /usr/local/nginx/logs/nginx.pid 根据以上配置内容来做,检查/usr/local/nginx/logs/是否存在,如 ...
- Python 中日期函数
导入日期库 datetime import datetime # 或者from datetime import datetime ,date 字符串转datetime
- C#的TimeSpan
前言 参考 TimeSpan介绍: https://blog.csdn.net/weixin_41600552/article/details/82220645 微软文档: https://docs. ...
- 【程序包管理】篇章2:rpm程序包来源合法和完整性验正
来源合法性验正: 数字签名 私钥签名完整性 哈希 注意: 1.如果是网站下载的程序包的话,没有公钥,就无法进行来源合法性验证,所以最好使用系统自带的rpm程序包或去可靠的网站下载程序包.[如 ...
- 【红日安全-VulnStack】ATT&CK实战系列——红队实战(二)
一.环境搭建 1.1 靶场下载 靶场下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/3/ 靶机通用密码: 1qaz@WSX 1.2 环境配置 ...
- Spring框架之spring-web web源码完全解析
Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...
- Linux嵌入式学习-USB端口号绑定
由于ubuntu USB设备号为从零开始依次累加,所以多个设备每次开机后设备号不固定,机器人每次开机都要蛋疼的按顺序插, 在网上找到一种方法:udev的规则 udev的规则说明,可以参考博客说明:ht ...
- 所有CSS字体属性
font(在一个声明中设置所有的字体属性) font-family(指定文本的字体系列) font-size(指定文本的字体大小) font-style(指定文本的字体样式) font-variant ...