开发不用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. COM技术开发(一)

    COM :基本的接口(IX,IY), 组件的实现(CA),以及对组件的调用 #include "pch.h" #include <iostream> #include ...

  2. Maven项目框架源代码和文档的查看

    方便maven项目的调试和源代码学习,可以通过添加maven插件的方式下载源代码和文件进行查看. mavan插件节点结构如下: <project xmlns="http://maven ...

  3. [BZOJ3211]:花神游历各国(小清新线段树)

    题目传送门 题目描述: 花神喜欢步行游历各国,顺便虐爆各地竞赛.花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并不一定喜欢所有国家) ...

  4. jquery 拖动(Draggable) 约束运动,输出数组排序Array

    <!doctype html><html lang="en"><head> <meta charset="utf-8" ...

  5. JS 手机号中间4位变星号

    一:正则方法 var str1 = '13991367972'var reg = /^(\d{3})\d*(\d{4})$/;var str2 = str1.replace(reg,'$1****$2 ...

  6. MySQL 8.0.12 基于Windows 安装教程

    第一步:到MySQL官网下载安装包:https://dev.mysql.com/downloads/mysql/ 第二步:将下载好的安装包(mysql-8.0.12-winx64 .zip)解压到相应 ...

  7. layui使用小记(持续更新)

    关于Select等Form表单元素,在使用的时候部分特性会失效 如select自带的Search功能: 其实在使用Form表单元素的时候,你如果需要layui自带的一些功能(搜索,验证等),请用< ...

  8. CentOS7安装Tomcat9并配置

    划重点:安装tomcat之前必须先安装jdk  安装教程 1.下载 Tomcat 9 CentOS 7 下创建目录并下载文件:// 链接已更新 cd /usr/local/ mkdir tomcat ...

  9. LeetCode(100) Same Tree

    题目 Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  10. 《C++专项练习》 — (2)

    序 C++基础专项练习二,,,水平依然不到家! 错题分析与总结 1 . 有如下模板定义: template <class T> T fun(T x,T y){ return x*x+y*y ...