控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
interface IModuleBase
{
void Init();
}
public class ModuleA : IModuleBase
{
public void Init()
{
Console.WriteLine("ModuleA Init");
}
}
public class ModuleB :IModuleBase
{
public void Init()
{
Console.WriteLine("ModuleB Init");
}
}
class Program
{
static void Main(string[] args)
{
IModuleBase aTest = new ModuleA();
IModuleBase bTest = new ModuleB();
aTest.Init();
bTest.Init();
}
}
输出结果为:
ModuleA Init
ModuleB Init
依赖注入(DI)
控制反转实现的一种方式,就是就是将依赖对象的创建和绑定转移到被依赖对象类的外部来实。
依赖注入有多种实现方式:
构造函数注入
public class ModuleManager
{
private IModuleBase module;
public ModuleManager(IModuleBase module)
{
this.module = module;
}
}
class Program
{
static void Main(string[] args)
{
IModuleBase aTest = new ModuleA();
ModuleManager manager = new ModuleManager(aTest);
}
}
属性注入
public class ModuleManager
{
private IModuleBase module;
public ModuleManager()
{
}
public IModuleBase Module { get => module; set => module = value; }
public void Init()
{
module.Init();
}
}
//调用测试
static void Main(string[] args)
{
IModuleBase aTest = new ModuleA();
ModuleManager manager = new ModuleManager();
manager.Module = aTest;
manager.Init();
}
接口注入
public interface IManager
{
void SetModue(IModuleBase module);
}
public class ModuleManager: IManager
{
private IModuleBase module;
public void Init()
{
module.Init();
}
public void SetModue(IModuleBase module)
{
this.module = module;
}
}
static void Main(string[] args)
{
IModuleBase aTest = new ModuleA();
ModuleManager manager = new ModuleManager();
manager.SetModue(aTest);
manager.Init();
}
IOC容器
class IocContainer
{
Dictionary iocMap = new Dictionary();
///
/// 手动注册
///
///
///
public void Register()
{
if (iocMap.ContainsKey(typeof(TypeInterface)))
{
throw new Exception(string.Format("The interface {0} have be registered to Container", typeof(TypeInterface).FullName));
}
else
{
iocMap.Add(typeof(TypeInterface), typeof(InterfaceClass));
}
}
public T Resolve()
{
return (T)Resolve(typeof(T));
}
public object Resolve(Type TypeInterface)
{
if (!iocMap.ContainsKey(TypeInterface))
{
throw new Exception(string.Format("The interface {0} not be registered to Container", TypeInterface.FullName));
}
Type InterfaceClass = iocMap[TypeInterface];
ConstructorInfo conInfo = InterfaceClass.GetConstructors().First();
List paramsInfoList = conInfo.GetParameters().ToList();
List
上面是一个简单的IOC容器,下面是我想通过构造函数以配置的方式去注册容器内容,代码如下:
class IocContainer
{
Dictionary iocMap = new Dictionary();
public IocContainer()
{
string config = "IModuleA;IModuleB";//配置文件
Assembly asm = Assembly.GetAssembly(typeof(ModuleAttribute));
Type[] types = asm.GetExportedTypes();
Func IsMyAttribute = o =>
{
foreach (Attribute a in o)
{
if (a is ModuleAttribute)
return true;
}
return false;
};
Type[] typesTemp = types.Where(o =>
{
return IsMyAttribute(Attribute.GetCustomAttributes(o, true));
}).ToArray();
string[] tempArray = config.Split(';');
foreach(string item in tempArray)
{
foreach(Type typeItem in typesTemp)
{
Type inter = typeItem.GetInterfaces().ToList().Find(o => o.Name.Equals(item));
if(inter != null)
{
iocMap.Add(inter,typeItem);
}
}
}
//Register();
//Register();
}
///
/// 手动注册
///
///
///
public void Register()
{
if (iocMap.ContainsKey(typeof(TypeInterface)))
{
throw new Exception(string.Format("The interface {0} have be registered to Container", typeof(TypeInterface).FullName));
}
else
{
iocMap.Add(typeof(TypeInterface), typeof(InterfaceClass));
}
}
public T Resolve()
{
return (T)Resolve(typeof(T));
}
public object Resolve(Type TypeInterface)
{
if (!iocMap.ContainsKey(TypeInterface))
{
throw new Exception(string.Format("The interface {0} not be registered to Container", TypeInterface.FullName));
}
Type InterfaceClass = iocMap[TypeInterface];
ConstructorInfo conInfo = InterfaceClass.GetConstructors().First();
List paramsInfoList = conInfo.GetParameters().ToList();
List interfaceClassParams = new List();
foreach (var param in paramsInfoList)
{
Type temp = param.ParameterType;
object result = Resolve(temp);
interfaceClassParams.Add(result);
}
object resultObject = conInfo.Invoke(interfaceClassParams.ToArray());
return resultObject;
}
}
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支 持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
实用命令实例
默认启动
tcpdump
普通情况下,直
MO= Mobile originate,上行,即用户上发给SP的信息。MT= Mobile Terminate,下行,即SP端下发给用户的信息;
上行:mo提交短信到短信中心下行:mt短信中心向特定的用户转发短信,你的短信是这样的,你所提交的短信,投递的地址是短信中心。短信中心收到你的短信后,存储转发,转发的时候就会根据你填写的接收方号码寻找路由,下发。在彩信领域是一样的道理。下行业务:由SP
import java.util.Arrays;
import java.util.Random;
public class MinKElement {
/**
* 5.最小的K个元素
* I would like to use MaxHeap.
* using QuickSort is also OK
*/
public static void
添加没有默认值:alter table Test add BazaarType char(1)
有默认值的添加列:alter table Test add BazaarType char(1) default(0)
删除没有默认值的列:alter table Test drop COLUMN BazaarType
删除有默认值的列:先删除约束(默认值)alter table Test DRO
Spring Boot 1.2.4已于6.4日发布,repo.spring.io and Maven Central可以下载(推荐使用maven或者gradle构建下载)。
这是一个维护版本,包含了一些修复small number of fixes,建议所有的用户升级。
Spring Boot 1.3的第一个里程碑版本将在几天后发布,包含许多