AOP概念

1.aop:面向切面(方面)编程,扩展功能不通过源代码实现

2.采用横向抽取机制,取代了传统的纵向继承重复代码

AOP原理

假设现有

public class User{
//添加用户方法(1)
public void add(){
//添加逻辑(2)
     //(3)
  }
}

我们需要扩展其功能:

正常需要在3处添加逻辑,但这种方式不好,需要经常修改代码

纵向抽取机制解决:

public class BaseUser{
//创建方法
public void writelog(){
//添加逻辑
}
} public class User extends BaseUser{
public void add(){
//添加逻辑
//添加功能扩展
//调用父类方法
suer.writelog();
}
}

但:如果父类方法名发生变化,子类调用方法也需要变化

横向抽取机制:

aop:底层使用动态代理的方式实现

第一种情况:

public interface Dao{
public void add();
} //使用动态代理的方式,创建接口实现类代理对象(实现和daoimpl平级的对象,但不是个真正对象,但可以实现和其相同的功能) public class DaoImpl implements Dao{
public void add(){
//添加逻辑
}
}

第二种情况:

public class User{
public void add(){
}
} //动态代理实现
创建User类的子类的代理对象
子类中调用父类方法完成增强(super)
//使用cgllb动态代理,没有接口情况

AOP操作术语

public class User{
public void add(){}
public void delete(){}
public void update(){}
public void findAll(){}
}

切入点:类中的哪些方法可以被增强,这些方法就是连接点;如果只有update和add,则这实际增强方法为切入点

通知/增强:增强的逻辑,成为增强(前置/方法之前,后置/方法之后,异常/出现异常,最终/后置之后为最终,环绕增强/在方法之前和之后执行)

切面:把增强用于具体方法增强,过程为切面

在Spring里进行aop操作,使用aspectJ实现

AspectJ同Spring一起使用,但不属于Spring,一起进行aop操作

Spring2.0以后增加了对Aspectj的支持

使用aspectj实现aop实现的两种方式

1.基于aspectj的xml配置

2.基于aspectj的注解方式

Aop的操作准备

1.除基本的外,还有aop的相关jar包

2.创建spring核心配置文件,导入aop的约束

表达式配置切入点

1.切入点,实际增强切入点

2.常用表达式

1)execution(* cn.itcast.aop.Book.add(..))

2)execution(* cn.itcast.aop.Book.*(..))(

3)execution(* *.*(..))

4)execution(* save*(..))

xml配置:

<bean id="Book" class="cn.itcast.aop.Book"></bean>
<bean id="MyBook" class="cn.itcast.aop.MyBook"></bean> <aop:config>
<!--切入点>
<aop:pointcut expression="execution(* cn.itcast.aop.Book.*(..))" id="pointcut1">
</aop:pointcut>
<!--配置切面>
<aop:aspect ref="MyBook">
<!--配置增强类型 menthod为增强类里面使用哪个方法为前置 ahter-returning menthod后写后置>
<aop:before method="before1" pointcut-ref = "pointcut1"/>
</aop:aspect>
</aop:config>

另一部分:public class Book{    public void add(        system.out.println("add......")    }

}

public class MyBook{
public void before1(){
system.out.println("前置增强......");
}
//环绕写法
public void around1(ProceedingJoinPoint proceedingJoinPoint) throw Throwable{ System.out.printLn("方法之前...");
  
//执行被增强的方法
ProceedingJoinPoint.proceed();
   System.out.printLn("方法之后..."); }}

aspectj注解操作(更简单):

public class Book{
public void add(){ }
} @Aspect
public class MyBook{

  @Before(value="execution(* 路径1.*(..))")
  public void before1(){
  }
}
<!--创建对象-->
<bean id ="book" class="路径1"></bean>
<bean id ="book" class="路径2"></bean> <!--开启aop-->
<aop:asceptj-autoproxy> </...>

Spring的入门学习笔记 (AOP概念及操作+AspectJ)的更多相关文章

  1. Spring.Net 入门学习笔记-----one

    一. 基本概念    Spring.Net是一个轻量级的控制反转(Ioc)和面向切面的(Aop)的容器框架: Ioc:控制反转:简单的说就是将创建对象的控制权转交给外部容器(IApplicationC ...

  2. Spring的入门学习笔记 (注解)

    Spring的bean管理(注解) 注解 1.代码里面特殊标记(ep:@Test),使用注解完成一些相关功能 2.注解写法 @注解名称(属性名称=属性值) 3.可以用在类,方法,属性上都可以 4.Sp ...

  3. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  4. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

  5. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  6. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  7. dubbo入门学习笔记之入门demo(基于普通maven项目)

    注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...

  8. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  9. Three入门学习笔记整理

    一.官方网站:https://threejs.org 二.关于Three.js 三.开始 四.实例 基本结构 结果 五.概念 坐标系 场景 相机 灯光 3D模型 六.简单动画 七.交互控制 结束 # ...

随机推荐

  1. (C# 正则表达式)判断匹配, 提取字符串或数值

    string s = "if ( \"ch\" == \"os\" ) "; string pattern = @"if\s*\( ...

  2. 精准控制PWM脉冲的频率和数量

    在一些项目中,我们经常要控制PWM脉冲的频率和数量,比如步进电机的控制等,下面分享一个程序是关于这方面的,程序的思想就是通过STM32的定时器来输出PWM波,并开启定时器中断,在中断里面计数脉冲的数量 ...

  3. 小Y的轮回之路——攒机装机、B150装win7

    两个月前,陪伴我5年多的小Y(ideapad-y460N卡)突然大伤元气,硬盘跪了,显示屏也黑了一小块.本着经济实惠凑合用的态度换了个320G的硬盘,没想过几天显示屏情况加重,出现无数个红绿相间的线条 ...

  4. maven学习(七)后续扩展、资料

    写这几篇博客的来源是 "maven实战 + 网上的博客 + 平时使用的心得 ".记录的都是比较常用的东西,也有一些只做了大概了解.或者干脆直接略过,在这里做一下总结,如果有需要在进 ...

  5. swoole 创建web服务器

    http_server.php $http = new swoole_http_server("0.0.0.0", 9501); // 请求监听事件 $http->on('r ...

  6. nodejs + redis/mysql 连接池问题

    nodejs + redis/mysql 连接池问题 需不需要连接池 连接池的作用主要是较少每次临时建立连接所带来的开销.初步一看,nodejs运行单线程上,它不能同时使用多个连接,乍一看是不需要连接 ...

  7. tempdb过大事故记录-sqlserver

    今天收到预警消息,提示磁盘空间已经满了,感觉很奇怪.刚装的新机器怎么可能会磁盘空间不足.登陆看了看 可以看的到tempdb已经65G的了,而且显示是百分百可用.这个就很奇怪了,为什么会出现这种情况呢. ...

  8. python+selenium之框架设计

    一.自动化测试框架 1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本, ...

  9. 对于char *s1 和 char s2[] 的认识

    对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误. char *s1 = "hello"; char s2[] = " ...

  10. IntelliJ IDEA下"Cannot resolve symbol 'log'"的解决方法

    转自:https://my.oschina.net/greatqing/blog/703989 最近接手了一个Maven项目,IDE使用的是IntelliJ IDEA,导入后可以编译运行.但是输出日志 ...