delegate

委托与事件-委托事件案例(三)

感情迁移 提交于 2020-04-22 06:30:39
前言   这两天一直在想如何结合实际案例来结束委托与事件的讲解,下面讲解两个事例,用来加深对委托及事件的理解。 事例一(分页功能)   本场景是用来讲解使用的,具体内容功能需自行填补实现。用委托加事件来实现分页功能的通用。按上一节讲解中的逻辑处理,分为订阅者和发布者,一样的可以先定义订阅者感兴趣的对象,然后发布者,订阅者。再就是主程序调用。    /// <summary> /// 首先定义订阅者感兴趣的对象,本例感兴趣的是上一页下一页等方法。这里使用Action抽象 /// </summary> public class PageChangeEventArgs : EventArgs { public string Action { get ; set ; } public int PageIndex { get ; set ; } public PageChangeEventArgs() { } public PageChangeEventArgs( string action, int pageIndex) { this .Action = action; this .PageIndex = pageIndex; } } /// <summary> /// 定义发布者 /// </summary> public class PageActionPubliser { //

深入理解Spring的ImportSelector接口

纵饮孤独 提交于 2020-04-22 05:15:05
 ImportSelector接口是至spring中导入外部配置的核心接口,在SpringBoot的自动化配置和@EnableXXX(功能性注解)都有它的存在,关于SpringBoot的分析可以参考: 深入理解SpringBoot的自动装配 。 一、关于ImportSelector接口   package org.springframework.context.annotation; import org.springframework.core.type.AnnotationMetadata; /** * Interface to be implemented by types that determine which @{ @link Configuration} * class(es) should be imported based on a given selection criteria, usually one or more * annotation attributes. * * <p>An { @link ImportSelector} may implement any of the following * { @link org.springframework.beans.factory.Aware Aware} interfaces, and their

.net core 中间件管道底层剖析

时光怂恿深爱的人放手 提交于 2020-04-22 02:10:24
.net core 管道(Pipeline)是什么? 由上图可以看出,.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程,如果我们简化一下成下图来看的话,.net core 的管道其实就是中间件的部分。 微软中间件文档 为什么管道就是中间件的部分了呢?我是这么理解的,.net core 是通过Startup 类配置服务和应用的请求管道,所以狭义点来讲这个管道就是指的请求管道,就是我们今天要理解的中间件管道。 .net core 核心体系结构的特点就是一个中间件系统,它是处理请求和响应的代码段。 中间件彼此链接,形成一个管道。 传入的请求通过管道传递,其中每个中间件都有机会在将它们传递到下一个中间件之前对它们进行处理。 传出响应也以相反的顺序通过管道传递。 PS:简单来讲就是请求开始到响应结束的中间的一大部分。你可以理解成 " 汽车销售 " (开始买车到提车的过程,但愿不会坐在奔驰车盖上哭),哈哈…… 还有我们来看看,为什么我们要简化来看,在运行时 .net core 会预先注入一些必要的服务及依赖项,默认注入(ServiceCollection)的服务清单如下: 我们先断章取义地看,这里面有 Kestrel 处理请求,将接收到的请求内容(字符串流)转化成结构化的数据(HttpContext)供后面的中间件使用的服务。欸,服务哟。那其实也就是

DLL/OCX文件的注册与数据执行保护DEP

蹲街弑〆低调 提交于 2020-04-21 20:45:58
注册/反注册dll或ocx文件时,无论是用regsvr32还是DllRegisterServer/DllUnregisterServer,可能会遇到【内存位置访问无效】的问题: 此时把操作系统的数据执行保护( Data Execution Prevention ,下称DEP)彻底关掉, 重启 ,应该就能解决问题。操作: NT6.x系统:运行 bcdedit / set nx alwaysoff NT5.x系统:修改 %systemdrive%\boot.ini 文件,将当前操作系统条目的/noexecute参数的值改为AlwaysOff,若没有则添加。若是多系统,要注意修改到正确的条目 本文主要是讨论,作为开发者,当需要在自己的程序中注册dll时(反注册的情况一样,下文只拿注册说事,其实适用于所有受DEP影响的问题),如何避免改动系统DEP,避免重启地把问题解决掉。其实这个问题的关键是, 执行注册的进程是否启用了DEP,启用就不能注册,关闭就能 ,跟系统DEP没有直接关系,但进程DEP受系统DEP的影响。 来自系统DEP的原因 系统DEP策略有4种,每种策略下对进程DEP的影响如下(注意, 64位程序总是启用DEP ,且不可禁用,不论系统DEP如何设置。所以下表和接下来说的都是32位程序的情况): 系统DEP策略 进程默认DEP 能否更改进程DEP OptIn

Spring IOC 容器源码分析

强颜欢笑 提交于 2020-04-21 05:02:27
人不学不知道 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。 本文采用的源码版本是 4.3.11.RELEASE,算是 5.0.x 前比较新的版本了。为了降低难度,本文所说的所有的内容都是基于 xml 的配置的方式,实际使用已经很少人这么做了,至少不是纯 xml 配置,不过从理解源码的角度来看用这种方式来说无疑是最合适的。 阅读建议:读者至少需要知道怎么配置 Spring,了解 Spring 中的各种概念,少部分内容我还假设读者使用过 SpringMVC。本文要说的 IOC 总体来说有两处地方最重要,一个是创建 Bean 容器,一个是初始化 Bean,如果读者觉得一次性看完本文压力有点大,那么可以按这个思路分两次消化。读者不一定对 Spring 容器的源码感兴趣,也许附录部分介绍的知识对读者有些许作用。 希望通过本文可以让读者不惧怕阅读 Spring 源码,也希望大家能反馈表述错误或不合理的地方。 引言 先看下最基本的启动 Spring 容器的例子: public static void

Ansible16:Playbook高级用法

大憨熊 提交于 2020-04-20 18:01:20
目录 本地执行 任务委托 任务暂停 滚动执行 只执行一次 设置环境变量 交互式提示 本地执行 如果希望在控制主机本地运行一个特定的任务,可以使用local_action语句。 假设我们需要配置的远程主机刚刚启动,如果我们直接运行playbook,可能会因为sshd服务尚未开始监听而导致失败,我们可以在控制主机上使用如下示例来等待被控端sshd端口监听: - name: wait for ssh server to be running wait_for port: 22 host: "{{ inventory_hostname }}" search_regex: OpenSSH connection: local 任务委托 在有些时候,我们希望运行与选定的主机或主机组相关联的task,但是这个task又不需要在选定的主机或主机组上执行,而需要在另一台服务器上执行。 这种特性适用于以下场景: 在告警系统中启用基于主机的告警 向负载均衡器中添加或移除一台主机 在dns上添加或修改针对某个主机的解析 在存储节点上创建一个存储以用于主机挂载 使用一个外部程序来检测主机上的服务是否正常 可以使用delegate_to语句来在另一台主机上运行task: - name: enable alerts for web servers hosts: webservers tasks: - name:

C# 委托

╄→гoц情女王★ 提交于 2020-04-18 12:04:14
本文转载: https://www.cnblogs.com/jixiaosa/p/10687068.html 委托:顾名思义,让别人帮你办件事。委托是C#实现 回调函数 的一种机制。可能有人会问了,回调函数是个啥??? 举个例子:我现在是一家公司的老板,公司现在在招聘.NET工程师,我们有一个小姐姐专门负责接受求职者投递的简历,我就告诉这个小姐姐,一旦收到新的简历就转发给我一份。 这个例子里小姐姐要做的工作:给我转发一份简历(回调函数里的操作),就是一个回调函数的作用。一旦有了 满足条件 (收到了新的简历),小姐姐就会转发给我( 触发回调函数 ) 用来代码来看看是怎么实现的: 1.定义一个委托: // 定义委托,这个委托需要获取一个int型参数,返回void internal delegate void Feedback(int value); 2.定义回调方法 :这里定义了两个方法,一个静态,一个实例。正好看看调用方式的不同。注意:定义的回调方法签名必须和委托对象一致(这里都是int 类型参数,没有返回值。这么说也不全对,涉及到 协变 和 逆变 。这里就不解释这俩了),这是因为将方法绑定到委托时,编译器会检测他们的兼容性。不符合的话回报编译错误。就比如有一个方法要传入String类型,我们给它传递了一个int类型一样。 这里为了方便演示就只把数字打印在了控制台。 ///

C# 委托

喜欢而已 提交于 2020-04-18 11:54:04
本文转载: https://www.cnblogs.com/jixiaosa/p/10687068.html 委托:顾名思义,让别人帮你办件事。委托是C#实现 回调函数 的一种机制。可能有人会问了,回调函数是个啥??? 举个例子:我现在是一家公司的老板,公司现在在招聘.NET工程师,我们有一个小姐姐专门负责接受求职者投递的简历,我就告诉这个小姐姐,一旦收到新的简历就转发给我一份。 这个例子里小姐姐要做的工作:给我转发一份简历(回调函数里的操作),就是一个回调函数的作用。一旦有了 满足条件 (收到了新的简历),小姐姐就会转发给我( 触发回调函数 ) 用来代码来看看是怎么实现的: 1.定义一个委托: // 定义委托,这个委托需要获取一个int型参数,返回void internal delegate void Feedback(int value); 2.定义回调方法 :这里定义了两个方法,一个静态,一个实例。正好看看调用方式的不同。注意:定义的回调方法签名必须和委托对象一致(这里都是int 类型参数,没有返回值。这么说也不全对,涉及到 协变 和 逆变 。这里就不解释这俩了),这是因为将方法绑定到委托时,编译器会检测他们的兼容性。不符合的话回报编译错误。就比如有一个方法要传入String类型,我们给它传递了一个int类型一样。 这里为了方便演示就只把数字打印在了控制台。 ///

spring5 源码深度解析----- IOC 之 默认标签解析(下)

☆樱花仙子☆ 提交于 2020-04-18 08:32:26
在 spring源码深度解析— IOC 之 默认标签解析(上) 中我们已经完成了从xml配置文件到BeanDefinition的转换,转换后的实例是GenericBeanDefinition的实例。本文主要来看看标签解析剩余部分及BeanDefinition的注册。 默认标签中的自定义标签解析 在上篇博文中我们已经分析了对于默认标签的解析,我们继续看戏之前的代码,如下图片中有一个方法:delegate.decorateBeanDefinitionIfRequired(ele, bdHolder) 这个方法的作用是什么呢?首先我们看下这种场景,如下配置文件: <bean id="demo" class ="com.chenhao.spring.MyTestBean"> <property name="beanName" value="bean demo1"/> <meta key="demo" value="demo"/> <mybean:username="mybean"/> </bean> 这个配置文件中有个自定义的标签,decorateBeanDefinitionIfRequired方法就是用来处理这种情况的,其中的null是用来传递父级BeanDefinition的,我们进入到其方法体: public BeanDefinitionHolder

spring5 源码深度解析----- IOC 之 容器的基本实现

微笑、不失礼 提交于 2020-04-18 04:43:46
概述 上一篇我们搭建完Spring源码阅读环境, spring源码深度解析—Spring的整体架构和环境搭建 这篇我们开始真正的阅读Spring的源码,分析spring的源码之前我们先来简单回顾下spring核心功能的简单使用 容器的基本用法 bean是spring最核心的东西,spring就像是一个大水桶,而bean就是水桶中的水,水桶脱离了水也就没有什么用处了,我们简单看下bean的定义,代码如下: package com.chenhao.spring; /** * @author : ChenHao * @Description: * @Date: Created in 10:35 2019/6/19 * @Modified by: */ public class MyTestBean { private String name = "ChenHao" ; public String getName() { return name; } public void setName(String name) { this .name = name; } } 源码很简单,bean没有特别之处,spring的的目的就是让我们的bean成为一个纯粹的的POJO,这就是spring追求的,接下来就是在配置文件中定义这个bean,配置文件如下: <?xml version="1.0"