开发不用aop。程序猿的人生该会浪费多少时间。我想是时候让程序猿打败alpha狗了。程序猿解救世界。

1.概念

面向切面编程。这意味着,一切不在流水线上的东西。包含权限、日志、缓存、校验、资源、事物..都能够附加,并且不须要改动源码。假如你的业务是一条线,我们不在业务线上写一行代码就能完毕附加任务。我们会把代码写在其它的地方。通过2种技术手段来切入你的业务代码!是的,眼下仅有2种而已!

2.实现方式

基于动态代理实现 :表现形式为Spring AOP。在程序执行的时候。Spring 会为目标类动态的生成一个代理类来解决问题,由于他控制了程序执行的的入口和出口,决定怎样去实例化一个组件,所以假设你想要为公司开发一套框架,便于统一的资源訪问,监控等等等。仅仅要控制住入口和出口就可以,细节慢慢附加。是的,开发框架就这么简单!

结果截图:

实现截图:

//Spring Aop 代码实现:
public class UserServiceProxy implements IUserService {
public UserService userService;
public UserServiceProxy(UserService userService){
this.userService = userService;
}
@Override
public String getName(){
return "beautiful " + userService.getName();
}
}; IUserService userService = new UserServiceProxy(new UserService()); // 当然了,在真正的代码中UserServiceProxy 还继承了 java.lang.reflect.Proxy 类,这就决定了使用JDK的动态代理仅仅能代理接口而不能代理类。由于 extends 仅仅能使用一次!这时候就该cglib上场了。

基于静态织入实现:表现形式为Aspectj。

即,在代码执行的时候,我们须要增强的代码已经插入了目标类源码中。

关键点在于什么时候?

我们知道Spring 控制了组件的生命周期。所以在代码执行的时候创建了一个代理。那么aspectj呢,由于在代码执行的时候,增强代码已经进入目标类!所以,aspectj必须在其它阶段有所行动!一个 .java 文件由编译器编译为class、通过classloader载入到内存中、然后交给容器(比如:Spring)执行。aspectj提供了一个编译器插件解决问题!

假设让你来呢?骚年,make a different!你能够使用自己的类载入器来实现!请原谅我使用 .aj 而不是annotation来装逼!

(aspectj支持的两种语法)

结果截图:

实现截图:

能够看到UserService的源码经过aspectj的编译器编译后事实上已经改变了。

aspectj 的功能很强大,能够为一个类添加实现接口。加入属性,从而改变类的机构。可是在Web项目中,我们基本都是用Spring Aop来开发。aspectj不但须要一个特殊的编译器来编译代码,并且功能过于强大,我们却并不须要!

而Spring 提供给我们的。学习一个表达式就足够了。他仅仅是实现了aspectj的部分功能而已!

毫无疑问。aspectj在Android端正大放异彩!

鉴于大部分移动端小伙伴并未接触过Aop开发。

3.渣渣总结

我们的目标是:没有蛀牙。(剥离业务)

实现的方式是:动态代理(执行时)、静态织入(编译时、载入时)。

so,听说Android前一段时间流传着热修复这个概念,既然client已经发出去了,编译阶段已经不可能。你猜他们是用一个框架搞动态代理还是写了一个类载入器呢?

so,听说他们要为每一个方法做BeanValidator验证!

so,听说他们想要为全部接口做一个统一的信息出口!

so,听说他们要为每一个getXX方法提供30分钟数据缓存!

so,听说他们要在业务代码中加入日志统计功能!

so。听说他们要在client做埋点!

我还听说。你没绝杀AOP。

留言告诉我,秒杀!

战五渣系列之八(绝杀AOP)的更多相关文章

  1. Red Gate系列之八 SQL Connect 1.1.1.19 Edition 数据库连接及操作工具 完全破解+使用教程

    原文:Red Gate系列之八 SQL Connect 1.1.1.19 Edition 数据库连接及操作工具 完全破解+使用教程 Red Gate系列之八 SQL Connect 1.1.1.19 ...

  2. 单元测试系列之八:Sonar 数据库表关系整理一(续)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:Sonar平台是目前较为流行的静态代码扫描平台,为了便于使用以及自己二次开发,有必要对它的数据库结构进行学习 ...

  3. nginx高性能WEB服务器系列之八--nginx日志分析与切割

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  4. mongo 3.4分片集群系列之八:分片管理

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  5. WPF编游戏系列 之八 银行界面及金额校验

    原文:WPF编游戏系列 之八 银行界面及金额校验        在前面<WPF编游戏系列 之四 用户控件>一文中通过用户控件创建了"My Shop"中物品列表框.本篇继 ...

  6. OpenvSwitch系列之八 vxlan隧道

    Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...

  7. 老生常谈系列之Aop--Spring Aop源码解析(二)

    老生常谈系列之Aop--Spring Aop源码解析(二) 前言 上一篇文章老生常谈系列之Aop--Spring Aop源码解析(一)已经介绍完Spring Aop获取advice切面增强方法的逻辑, ...

  8. 老生常谈系列之Aop--Spring Aop源码解析(一)

    老生常谈系列之Aop--Spring Aop源码解析(一) 前言 上一篇文章老生常谈系列之Aop--Spring Aop原理浅析大概阐述了动态代理的相关知识,并且最后的图给了一个Spring Aop实 ...

  9. 老生常谈系列之Aop--Spring Aop原理浅析

    老生常谈系列之Aop--Spring Aop原理浅析 概述 上一篇介绍了AspectJ的编译时织入(Complier Time Weaver),其实AspectJ也支持Load Time Weaver ...

随机推荐

  1. New Arrival MB SD Connect Compact 5 (MB SD C4) Star Diagnosis

    MB SD Connect Compact 5 has same function as SD C4 but with new design, support both cars and trucks ...

  2. 按名字寻找文件和文件夹 find命令

    find <指定目录> <指定条件> <指定动作> find /home/bnrc/py-faster-rcnn/caffe-fast-rcnn/ -name 'd ...

  3. Windows下使用ffmpeg与java实现截取视频缩略图

    [ffmpeg.exe可执行文件获取]: 网上搜索后得到编译好的ffmpeg文件,下载地址:http://download.csdn.net/source/453719 [安装]: 将下载的文件解压, ...

  4. IOS学习笔记3—Objective C—简单的内存管理

    今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...

  5. Django中对接第三方支付(支付宝)实现支付的流程

    1. 业务逻辑准备 1. 使用沙箱提供的商家环境 沙箱环境:是支付宝提供给开发者的模拟支付的环境 沙箱应用:https://docs.open.alipay.com/200/105311 沙箱账号:h ...

  6. web即时通信技术

    ajax jsonp polling setInterval定期发送ajax请求.服务器压力大,浪费流量,大部分是无效请求 ajax long polling ajax发起请求,服务器对于这个请求一直 ...

  7. python接口自动化-发xml格式post请求

    前言 post请求相对于get请求多一个body部分,body部分常见的数据类型有以下四种(注意是常见的,并不是只有4种) application/x-www-form-urlencoded appl ...

  8. Python 双向队列Deque、单向队列Queue 模块使用详解

    Python 双向队列Deque 模块使用详解 创建双向队列Deque序列 双向队列Deque提供了类似list的操作方法: #!/usr/bin/python3 import collections ...

  9. XV6锁

    锁 xv6 运行在多处理器上,即计算机上有多个单独执行代码的 CPU.这些 CPU 操作同一片地址空间并分享其中的数据结构:xv6 必须建立一种合作机制防止它们互相干扰.即使是在单个处理器上,xv6 ...

  10. hls简述(HTTP live Streaming)

    hls官方地址:https://developer.apple.com/streaming/ IDR: Instantaneous Decoding Refresh (IDR) start code ...