`
wodamazi
  • 浏览: 1419658 次
文章分类
社区版块
存档分类
最新评论

Spring系列(3/1)---交互的一种尝试

 
阅读更多

前一篇,我们知道可以利用委托和代理来实现为目标类增加额外责任,这里我们先用一个简单的例子说明如何去实现.

//目标类,有3个公共方法,但由于非虚方法无法继承,所以能够切入的只有2个公共虚方法。虽然从生产代理的角度来讲,非虚公共方法也可以截获,
//但要求代理类重写该方法,而一旦重写,根据方法的调用规则,在用目标类型调用这个方法时,其实是调不到代理类中的这个方法的,所以就没有机会截获和监视。
public class AClass
{
public virtual void Save()
{
Console.WriteLine("sadfdsaf");
}
public virtual string GetName(int i)
{
return "tina" + i.ToString();
}
public void DoSomething()
{
Console.WriteLine("AClass DoSomething()");
}
}

/// <summary>
/// 交互委托
/// </summary>
/// <param name="Target">目标类</param>
/// <param name="Sender">代理类</param>
/// <returns>执行结果</returns>
public delegate bool InteractorDelegate(object Target,object Sender);
/// <summary>
/// 代理类,从AClass继承.
/// </summary>
public class ProxyAClass1 : AClass
{

private AClass _target;
private List<IMethodInterceptor> _adviceList = null;

public event InteractorDelegate InteractAtA;
public event InteractorDelegate InteractAtB1;
public event InteractorDelegate InteractAtB2;
public event InteractorDelegate InteractAtC1;
public event InteractorDelegate InteractAtC2;
public event InteractorDelegate InteractAtD;
public event InteractorDelegate InteractAtE;
/// <summary>
/// 构造函数,需传入目标类实例.
/// </summary>
/// <param name="target"></param>
public ProxyAClass1(AClass target)
{
_target = target;
}
/// <summary>
/// 执行方法实例.这里只以一个方法做演示.
/// </summary>
public override void Save()
{
try
{
if (InteractAtA != null)
{
InteractAtA(_target, this);
}
if (InteractAtB1 != null)
{
if (InteractAtB1(_target, this) == true)
{
if (InteractAtB2 != null)
{
InteractAtB2(_target, this);
}
_target.Save();
if (InteractAtC1 != null)
{
InteractAtC1(_target, this);
}
}

}
if (InteractAtC2 != null)
{
InteractAtC2(_target, this);
}
}
catch
{
if (InteractAtD != null)
{
InteractAtD(_target, this);
}
}
finally
{
if (InteractAtE != null)
{
InteractAtE(_target, this);
}
}
}
}

//下面是用法

//测试类.
public class TestClass
{
public static void Test()
{
AClass A = new AClass();
AClass PA = new ProxyAClass1(A);
PA.InteractAtA += new InteractorDelegate(PA_InteractAtA);
PA.InteractAtB1 += new InteractorDelegate(PA_InteractAtB1);
//......
}

static bool PA_InteractAtB1(object Target, object Sender)
{
//do something
return true;
}

static bool PA_InteractAtA(object Target, object Sender)
{
//do something
return false;
}
}

一个简单的代理完成了,也可以进行交互,手工方式还可以。但这种方式存在两个问题:

1)采用事件,那么多个方法挂接时执行的顺序并不能保证,而且很难实现选票制

2)如果动态生成类采用这种方式,有一个非常大的问题,就是上面代码红色部分无法实现,因为代理类是动态生成的,写代码的时候是编译过不去的。

实例化代理类比较容易实现,但事件挂接比较没法,没法静态写。

那怎么办呢?下一篇我们就来改进,一点点的去完成动态代理的要求。

后记:因为非虚方法不能作为监视的方法,因此我前面的动态代码生成时可以把这些方法除掉。同时执行方法的方式也可以直接改成调用,不用采用反射方式。

分享到:
评论

相关推荐

    springfox-spring-web-2.9.2-API文档-中文版.zip

    赠送jar包:springfox-spring-web-2.9.2.jar; 赠送原API文档:springfox-spring-web-2.9.2-javadoc.jar; 赠送源代码:springfox-spring-web-2.9.2-sources.jar; 赠送Maven依赖信息文件:springfox-spring-web-...

    spring-cglib-repack-3.2.0.jar

    下载源码,地址https://github.com/spring-projects/spring-framework/tags 下载自己想要的版本,我用的版本是 v5.0.x git clone https://github.com/spring-projects/spring-framework.git 进入目录 下载 ...

    springfox-spring-webmvc-3.0.0-API文档-中英对照版.zip

    赠送jar包:springfox-spring-webmvc-3.0.0.jar; 赠送原API文档:springfox-spring-webmvc-3.0.0-javadoc.jar; 赠送源代码:springfox-spring-webmvc-3.0.0-sources.jar; 赠送Maven依赖信息文件:springfox-...

    springfox-spring-webflux-3.0.0-API文档-中文版.zip

    赠送jar包:springfox-spring-webflux-3.0.0.jar; 赠送原API文档:springfox-spring-webflux-3.0.0-javadoc.jar; 赠送源代码:springfox-spring-webflux-3.0.0-sources.jar; 赠送Maven依赖信息文件:springfox-...

    Spring Framework 4.x Reference Documentation 中文翻译

    Chinese translation of the Spring Framework 4.x Reference Documentation (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/) .中文翻译《Spring Framework 4.x参考文档》 — ...

    springfox-spring-webflux-3.0.0-API文档-中英对照版.zip

    赠送jar包:springfox-spring-webflux-3.0.0.jar; 赠送原API文档:springfox-spring-webflux-3.0.0-javadoc.jar; 赠送源代码:springfox-spring-webflux-3.0.0-sources.jar; 赠送Maven依赖信息文件:springfox-...

    spring-data-commons-1.8.0.RELEASE

    spring data jpa的包。spring-data-commons-1.8.0.RELEASE.jar

    Spring-Cloud-Admin-master

    上传文件https://github.com/wxiaoqi/Spring-Cloud-Admin(文件内容链接)

    logback-ext-spring-0.1.1

    logback与spring集成的文件,从官网上找的。上传的文件包括源文件和jar包,以下是连接: https://github.com/qos-ch/logback-extensions/wiki/Spring ...

    spring/hibernate/mail/mysql-connector-java-5.1.22-bin.jar

    spring/hibernate/mail/mysql-connector-java-5.1.22-bin.jar等包

    mybatis与spring整合全部jar包(包括springmvc).rar

    context-support-4.1.3.RELEASE/spring-core-4.1.3.RELEASE/spring-expression-4.1.3.RELEASE/spring-jdbc-4.1.3.RELEASE/spring-jms-4.1.3.RELEASE/spring-messaging-4.1.3.RELEASE/spring-tx-4.1.3.RELEASE/spring...

    spring-boot2.0全新教程实例20例.zip

    spring-boot2.0全新教程实例20例.zip - [spring-boot-helloWorld](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-helloWorld):Spring Boot 的 hello World 版本 - [spring-boot-...

    spring-aop-5.2.0.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.2.0.RELEASE.jar; 赠送原API文档:spring-aop-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.0.RELEASE.pom;...

    spring-cloud使用的各种示例

    - [spring-cloud-config-svn-refresh](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-svn-refresh):配置中心svn版本示例,客户端refresh版本示例 - [spring-cloud-config-...

    spring4.3.1官方全套jar包下载

    4.3.1/spring-aop-4.3.1.RELEASE.jar 4.3.1/spring-aspects-4.3.1.RELEASE.jar 4.3.1/spring-beans-4.3.1.RELEASE.jar 4.3.1/spring-context-4.3.1.RELEASE.jar 4.3.1/spring-core-4.3.1.RELEASE.jar 4.3.1/spring-...

    spring-boot示例项目

    nacos|[Spring Cloud Alibaba(一)如何使用nacos服务注册和发现](https://github.com/smltq/spring-boot-demo/blob/master/cloud-alibaba/README1.md) config|[Spring Cloud Alibaba(二)配置中心多项目、多配置...

    springfox-spring-webmvc-3.0.0-API文档-中文版.zip

    赠送jar包:springfox-spring-webmvc-3.0.0.jar; 赠送原API文档:springfox-spring-webmvc-3.0.0-javadoc.jar; 赠送源代码:springfox-spring-webmvc-3.0.0-sources.jar; 赠送Maven依赖信息文件:springfox-...

    spring-boot-reference2018最新版

    spring-boot-reference2018最新版,官方原版英文,用户指南。

    org.springframework.flex-1.0.3.RELEASE.jar.zip

    org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包,org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包org.springframework.flex-1.0.3....

    spring 4.3.2全部jar

    spring 4.3.2全部jar,转自官网:...

Global site tag (gtag.js) - Google Analytics