关键词:
Spring繁华的AOP王国---第二讲
- Spring AOP的织入
- TargetSource
Spring AOP的织入
如何与ProxyFactory打交道
public interface ITask
void excute();
public class MockTask implements ITask
@Override
public void excute()
System.out.println("task excuted!");
public class PerformanceMethodInterceptor implements MethodInterceptor
@Nullable
@Override
public Object invoke(@Nonnull MethodInvocation methodInvocation) throws Throwable
long start = System.currentTimeMillis();
System.out.println("方法执行前...");
Thread.sleep(1000);
Object proceed = methodInvocation.proceed();
Thread.sleep(1000);
System.out.println("方法执行后");
long end = System.currentTimeMillis();
System.out.println("方法执行总耗时: "+String.valueOf(end-start));
return proceed;
1.基于接口的代理
MockTask task=new MockTask();
ProxyFactory weaver=new ProxyFactory(task);
weaver.setInterfaces(ITask.class);
NameMatchMethodPointcutAdvisor advisor=new NameMatchMethodPointcutAdvisor();
advisor.setMappedName("excute");
advisor.setAdvice(new PerformanceMethodInterceptor());
weaver.addAdvisor(advisor);
ITask proxyObject= (ITask) weaver.getProxy();
proxyObject.excute();
MockTask task=new MockTask();
ProxyFactory weaver=new ProxyFactory(task);
NameMatchMethodPointcutAdvisor advisor=new NameMatchMethodPointcutAdvisor();
advisor.setMappedName("excute");
advisor.setAdvice(new PerformanceMethodInterceptor());
weaver.addAdvisor(advisor);
ITask proxyObject= (ITask) weaver.getProxy();
proxyObject.excute();
2.基于类的代理
public class MockTask
public void excute()
System.out.println("task excuted!");
MockTask task=new MockTask();
ProxyFactory weaver=new ProxyFactory(task);
NameMatchMethodPointcutAdvisor advisor=new NameMatchMethodPointcutAdvisor();
advisor.setMappedName("excute");
advisor.setAdvice(new PerformanceMethodInterceptor());
weaver.addAdvisor(advisor);
MockTask proxy = (MockTask)weaver.getProxy();
proxy.excute();
System.out.println(proxy.getClass());
3.Introduction的织入
看清ProxyFactory的本质
public interface AopProxy
Object getProxy();
Object getProxy(@Nullable ClassLoader var1);
public interface AopProxyFactory
AopProxy createAopProxy(AdvisedSupport var1) throws AopConfigException;
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable
public DefaultAopProxyFactory()
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException
if (NativeDetector.inNativeImage() || !config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config))
return new JdkDynamicAopProxy(config);
else
Class<?> targetClass = config.getTargetClass();
if (targetClass == null)
throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");
else
return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));
private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config)
Class<?>[] ifcs = config.getProxiedInterfaces();
return ifcs.length == 0 || ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);
ProxyConfig
public class ProxyConfig implements Serializable
private static final long serialVersionUID = -8409359707199703185L;
private boolean proxyTargetClass = false;
private boolean optimize = false;
boolean opaque = false;
boolean exposeProxy = false;
private boolean frozen = false;
....
Advised
public interface Advised extends TargetClassAware
boolean isFrozen();
boolean isProxyTargetClass();
Class<?>[] getProxiedInterfaces();
boolean isInterfaceProxied(Class<?> var1);
void setTargetSource(TargetSource var1);
TargetSource getTargetSource();
void setExposeProxy(boolean var1);
boolean isExposeProxy();
void setPreFiltered(boolean var1);
boolean isPreFiltered();
Advisor[] getAdvisors();
default int getAdvisorCount()
return this.getAdvisors().length;
void addAdvisor(Advisor var1) throws AopConfigException;
void addAdvisor(int var1, Advisor var2) throws AopConfigException;
boolean removeAdvisor(Advisor var1);
void removeAdvisor(int var1) throws AopConfigException;
int indexOf(Advisor var1);
boolean replaceAdvisor(Advisor var1, Advisor var2) throws AopConfigException;
void addAdvice(Advice var1) throws AopConfigException;
void addAdvice(int var1, Advice var2) throws AopConfigException;
boolean removeAdvice(Advice var1);
int indexOf(Advice var1);
String toProxyConfigString();
AdvisedSupport
ProxyFactory,AopProxy,AdvisedSupport与ProxyFactory的关系
小结
上面的图只是画了一个大概的联系,大家再结合上面的文件好好理解一下
ProxyCreatorSupport内部拥有一个AopProxyFactory的对象实例,但是获取AopProxy的时候,是通过AopProxyFactory 的createAopProxy方法中传入自身实例ProxyCreatorSupport,来得到一个指定的AopProxy的,通过AopProxy 我们就可以获取到被代理后的对象
之说以传入自身,是因为ProxyCreatorSupport实现了AdvisedSupport,AdvisedSupport又实现了Advised接口,可以因此来获取到被代理对象实例和横切逻辑
public class ProxyCreatorSupport extends AdvisedSupport
private AopProxyFactory aopProxyFactory;
private final List<AdvisedSupportListener> listeners = new ArrayList();
private boolean active = false;
public ProxyCreatorSupport()
this.aopProxyFactory = new DefaultAopProxyFactory();
public ProxyCreatorSupport(AopProxyFactory aopProxyFactory)
Assert.notNull(aopProxyFactory, "AopProxyFactory must not be null");
this.aopProxyFactory = aopProxyFactory;
....
protected final synchronized AopProxy createAopProxy()
if (!this.active)
this.activate();
return this.getAopProxyFactory().createAopProxy(this);
容器中的织入器—ProxyFactoryBean
ProxyFactoryBean的本质
@Nullable
public Object getObject() throws BeansException
this.initializeAdvisorChain();
if (this.isSingleton())
return this.getSingletonInstance();
else
if (this.targetName == null)
this.logger.info("Using non-singleton proxies with singleton targets is often undesirable. Enable prototype proxies by setting the 'targetName' property.");
return this.newPrototypeInstance();
ProxyFactoryBean的使用
加快织入的自动化进程
使用自动代理的实现机制
可用的AutoProxyCreator
需要明确一点,既然我们使用了自动代理来自动为容器中符合条件的bean生成代理对象,那么我们只需要在配置文件中指定切入点和advice即可了
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
扩展AutoProxyCreator
TargetSource
可用的targetSource实现类
SingletonTargetSource
PrototypeTargetSource
HotSwappableTargetSource
查看详情
spring繁华的aop王国---第三讲
Spring繁华的AOP王国---第三讲@AspectJ形式的SpringAOP@Aspectj形式的aop使用之先睹为快编程方式织入通过自动代理织入@Aspectj形式的Pointcut1.@Aspectj形式的Pointcut声明方式2.@AspectJ形式Pointcut表达式的标志符号executionwithinthis和t... 查看详情
spark第二讲scala简介(代码片段)
一.Scala简介 Scala 是 ScalableLanguage 的简写,是一门多范式的编程语言,由联邦理工学院洛桑(EPFL)的 MartinOdersky 于2001年基于 Funnel 的工作开始设计,设计初衷是实现可伸缩的语言,集成面向对象编程和... 查看详情
pc逆向之代码还原技术,第二讲寻找程序入口点(代码片段)
PC逆向之代码还原技术,第二讲寻找程序入口点一丶简介程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的.比如VC++6.0我们可以写一个程序测试一下我们写一段代码.F10进行调试.看看是谁调用的mai... 查看详情
基于注解的aop配置(代码片段)
第一步:在spring配置文件中开启spring对注解AOP的支持<!--开启spring对注解AOP的支持--><aop:aspectj-autoproxy><aop:aspectj-autoproxy/>第二步:在配置文件中指定spring要扫描的包<!--告知spring,在创建容器时要扫描的包--><cont... 查看详情
第二讲:域名购买与备案(代码片段)
选购好云主机之后,接下来需要考虑购买域名。在第一讲:个人建站云服务器选择中,小编有介绍过,如果你想进行微信小程序开发,必须要使用经过ICP备案的域名,所以购买域名显得格外重要。域名选... 查看详情
vio第二讲_allen方差工具(代码片段)
1,首先,安装ceres依赖项,见高博14讲116页,然后下载编译安装ceres:gitclonehttps://github.com/ceres-solver/ceres-solvercdceresmkdirbuildcdbuildcmake..makesudomakeinstall2,下载编译cd~/catkin_ws/srcgitclonehttps://github.com/gaowenl 查看详情
c#结构化编程基础(金老师编程课第二讲)(代码片段)
变量(variable)和数据类型(DataType)变量就是一块内存地址的别名(利用变量名找到对应的一块虚拟内存),不直接使用内存地址的编码,因为不同的计算机硬件或者计算机操作系统存取数据的方式不同。声明变量即为开设一个虚... 查看详情
第二讲:如何让点亮的发光管进行闪烁(代码片段)
打开Keil。像之前讲的一样,建好工程、建好程序文件、然后我们直接进入程序部分这是上次的程序:这个程序只是让灯亮了,但这次我们需要的是闪烁,所以光是这样是不够的。我们需要的是亮和灭这样才能看出闪烁... 查看详情
node.js第二讲笔记(代码片段)
大家好,欢迎关注微信公众号:雄雄的小课堂package包包结构包其实就是一个压缩文件,解压之后还原为目录,符合规范的目录,应该包含如下文件:package.json:描述文件bin:可执行的二进制文件lib:... 查看详情
spring代理模式,aop(代码片段)
...理加深理解1.3.动态代理1.4.动态代理加深理解2.AOP2.1使用Spring实现Aop2.1.1第一种方式2.1.2第二种方式2.1.3第三种方式1.代理模式为什么要学习代理模式?因为这就是SpringAOP的底层!【SpringAOP和SpringMVC很重要】代理模式的分类... 查看详情
notes20180310:string第二讲_string的声明与创建(代码片段)
1 字符串的声明与创建 学习String的第一步就是创建(声明)字符串,我们在这里之所以分为创建和声明是因为String是一个很特殊的类,它的对象产生在五种创建对象之外,还有另外一种方式,下面我们就来详细了解一下.1.1 声... 查看详情
第二讲完全背包问题(对背包九讲的学习)(代码片段)
学习自:背包九讲题目有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本思路:完全背包和01... 查看详情
web自动化测试-第二讲:页面元素定位操作(代码片段)
一、页面元素操作web自动化测试其实就是通过模拟手工测试,我们现在要通过代码来实现测试,首先我们要知道要操作的对象在哪?然后再对其页面元素对象做什么样的操作?也就引出下面两个概念: 1... 查看详情
复习spring第二课--aop原理及其实现方式
AOP原理:AOP,面向方面的编程,使用AOP,你可以将处理方面(Aspect)的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。AOP的应用范围包括:持久化管理(Persistent)、事务管理(TransactionMan... 查看详情
机器学习编译入门课程学习笔记第二讲张量程序抽象(代码片段)
本节课的slides链接如下:https://mlc.ai/summer22-zh/slides/2-TensorProgram.pdf;notes链接如下:https://mlc.ai/zh/chapter_tensor_program/。文章目录1.本节课内容大纲2.元张量函数3.张量程序抽象3.1为什么需要进行张量程序抽象3.2常见的... 查看详情
spring——aop(代码片段)
AOP面向切面编程,Spring中的可插拔组件技术在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术作用将分散在各个方法中... 查看详情
spring——aop(代码片段)
AOP面向切面编程,Spring中的可插拔组件技术在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术作用将分散在各个方法中... 查看详情