前言

要查看一个类实现了什么功能,那么查看它继承的接口或者class即可知道,那么其到底继承了什么?

正文

AnnotationAwareAspectJAutoProxyCreator

extends AspectJAwareAdvisorAutoProxyCreator

AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator

AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator

AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware

在这里和ioc相关的有两个东西一个是:

SmartInstantiationAwareBeanPostProcessor,BeanFactoryAware

SmartInstantiationAwareBeanPostProcessor 表示bean 在注入容器前后做些什么。

BeanFactoryAware 是生成工厂。

这个抛开不解释,那么aop需要什么呢?是怎么才能实现aop呢?这里我们需要手写一个aop,这样方便我们理解源码。

下面代码是c#,见谅了,杂学派的。

下面是大内老A写的东西,在此说明。

static void Main(string[] args)
{
var container = GetContainer();
container.RegisterType<IFoo, Foo>();
container.RegisterType<IBar, Bar>();
var foo = container.Resolve<IFoo>();
foo.DoSomething();
} static IUnityContainer GetContainer()
{
IUnityContainer container = new UnityContainer();
UnityContainerConfigurator configurator = new UnityContainerConfigurator(container);
EnterpriseLibraryContainer.ConfigureContainer(configurator, ConfigurationSourceFactory.Create());
container.AddNewExtension<InterceptionExtension>();
return container;
}

这里一看呢,就是一个ioc功能,因为现在关注的是aop,所以下面只解释aop的功能。

那么什么时候去开启了aop的功能呢?

container.AddNewExtension(); 开启了。

看下InterceptionExtension 到底干了啥子。

public class InterceptionExtension: UnityContainerExtension
{
protected override void Initialize()
{
Context.Strategies.AddNew<InterceptionStrategy>(UnityBuildStage.PreCreation);
}
}

在初始化的时候会去执行添加一个InterceptionStrategy

那么看下这个InterceptionStrategy是什么?

public class InterceptionStrategy : BuilderStrategy
{
public IUnityContainer UnityContainer { get; private set; }
public InjectionMember InterceptionMember { get; private set; } public InterceptionStrategy()
{
IUnityContainer container = new UnityContainer();
UnityContainerConfigurator configurator = new UnityContainerConfigurator(container);
EnterpriseLibraryContainer.ConfigureContainer(configurator, ConfigurationSourceFactory.Create());
this.UnityContainer = container;
this.InterceptionMember = new InstanceInterceptionPolicySettingInjectionMember(new TransparentProxyInterceptor());
} public override void PostBuildUp(IBuilderContext context)
{
if (null == context.Existing ||
context.Existing.GetType().FullName.StartsWith("Microsoft.Practices") ||
context.Existing is IInterceptingProxy)
{
return;
} context.Existing = this.UnityContainer.Configure<TransientPolicyBuildUpExtension>().BuildUp
(context.OriginalBuildKey.Type, context.Existing, null, this.InterceptionMember);
}
}

可以看出这就是一个拦截器。

每次创建一个服务实例的时候就会创建一个执行PostBuildUp 方法。

那么拦截器创建成功的话,那么看下属性类怎么写的。

public class FooCallHandler : ICallHandler
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
Console.WriteLine("Foo: Preoperation is executed.");
var methodReturn = getNext()(input, getNext);
Console.WriteLine("Foo: Postoperation is executed.");
return methodReturn;
}
public int Order { get; set; }
} public class FooCallHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new FooCallHandler { Order = this.Order };
}
}

上面代码说明了当执行方法前,会执行CreateHandler,然后执行Invoke。

这样就实现了在方法前执行某些东西了。

看下Foo类怎么写的。

public interface IFoo
{
void DoSomething();
} [FooCallHandler]
public class Foo : IFoo
{
public IBar Bar { get; private set; }
public Foo(IBar bar)
{ this.Bar = bar; }
public void DoSomething()
{
this.Bar.DoSomething();
}
}

Foo 只要拥有FooCallHandler特性即可,在java中这个也叫做注解。

那么万变不离其宗。

AnnotationAwareAspectJAutoProxyCreator 里面一定会做一些这样的事情,给容器注册拦截器,然后将拦截事件分发到拦截类。

上面的例子中只是实现了注明了Foo为具体业务逻辑类,并且实现了自己切面类FooCallHandler。

在面向切面编程AOP[一]中,其实只是把这个自己切面类变成一个可以通过注解来配置的切面类而已。

上述这也是解释了为什么aop会放在ioc中,因为aop需要监听那些类实例化了,好为他们注册拦截器,而ioc又是服务的管理实现。

总结

后面详解AnnotationAwareAspectJAutoProxyCreator下的每一个继承类做了什么。

面向切面编程AOP[三](java AnnotationAwareAspectJAutoProxyCreator实现了什么功能)的更多相关文章

  1. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  2. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  3. 面向切面编程AOP——加锁、cache、logging、trace、同步等这些较通用的操作,如果都写一个类,则每个用到这些功能的类使用多继承非常难看,AOP就是解决这个问题的,python AOP就是装饰器

    面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java中myba ...

  4. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  5. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  6. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  7. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  8. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  9. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  10. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

随机推荐

  1. MySql变量说明

    1 #变量 2 /* 3 系统变量: 4 全局变量 5 会话变量 6 7 自定义变量: 8 用户变量 9 局部变量 10 11 */ 12 #一.系统变量 13 /* 14 说明:变量由系统定义,不是 ...

  2. vscode 利用正则 搜索标签 tags (?=.*关键字1)(?=.*关键字2).*

    vscode 利用正则 搜索标签 (?=.关键字1)(?=.关键字2).* 这里关键词是可以多个并且不按照顺序搜索的,就是写起来需要 (?=.关键字) 最后. 结尾 我是不是需要制作一个转换的小工具呢 ...

  3. springboot+vue3+nuxt3+ts+minio开发的dsblog3.0前后端博客

    springboot+vue3+nuxt3+ts+minio开发的dsblog3.0前后端博客 转载自:www.javaman.cn 一.技术栈 本博客系统采用了先进且成熟的技术栈,包括Spring ...

  4. springboot打印启动信息

    打印启动信息 转载自:www.javaman.cn 1 spring Bean实例化流程 基本流程: 1.Spring容器在进行初始化时,会将xml或者annotation配置的bean的信息封装成一 ...

  5. Android 线性布局平分宽度item的隐藏问题

    原文:Android 线性布局平分宽度item的隐藏问题 - Stars-One的杂货小窝 一直只使用layout_weight来平分布局,但是如果隐藏了某个item,会导致其他item宽高有所变化 ...

  6. java方法的内存及练习

    方法的内存 一.方法调用的基本内存原理: Java内存分配 栈: 方法运行时使用的内存方法进栈运行,运行完毕就出栈 堆: newl出来的,都在堆内存中开辟了一个小空间 方法区: 存储可以运行的clas ...

  7. django(ORM)

    一 单表(增.删.改.查) 1 测试脚本 ''' 只想测试django中的某一个py文件内容,那么可以不用书写前后端交互的形式 而是直接写一个测试脚本即可 ''' # 脚本代码无论是写在应用下的tes ...

  8. Excalidraw:绘制图形的新利器

    摘要: Excalidraw是一款简洁设计.直观易用的绘图应用,用户可以通过它创建流程图.示意图.架构图等各种图形.除了提供手绘效果外,Excalidraw还支持多人实时协作编辑,并提供端到端加密以确 ...

  9. RabbitMQ集群运维实践

    一.RabbitMQ的集群模式 主要有两种:普通集群模式和镜像队列模式.下面分别介绍这两种模式的原理: 1.普通集群模式: 在普通集群模式下,RabbitMQ的集群节点之间主要同步元数据,而不同步存储 ...

  10. 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.安全特性 在上篇文章中,我们了解到HTTP在通信过程中,存在以下问题: 通信使用明文(不加密),内容可能被窃听 不验证通信方的身份,因 ...