Java项目中通过@Autowire便可以实现将对象实例化到指定的字段,无需手动new一个对象出来,用起来非常方便,因为Java类加载器在在加载过程会将扫描所有@Servie、@Mapper、@Component等标注的所有类,并创建实例保存在Spring容器中,然后扫描所有@Aotuwire的字段,通过反射将对应的实例注入到类中,因此不需要对对象进行实例化,这都是是依赖于Ioc和DI,即控制反转和依赖注入

@Service
public class SysDeptServiceImpl implements SysDeptService { @Autowired
private SysDeptMapper sysDeptMapper;
}
@Mapper
public interface SysDeptMapper {
int deleteByPrimaryKey(Long id); int insert(SysDept record); int insertSelective(SysDept record); SysDept selectByPrimaryKey(Long id); int updateByPrimaryKeySelective(SysDept record); int updateByPrimaryKey(SysDept record); List<SysDept> findPage(); List<SysDept> findAll();
}

 

依赖注入主要有

接口注入、字段、属性注入、构造函数注入、方法注入等方式

C#实现字段注入

通过 FieldInfo 的 setValue实现

   /// <summary>设置给定对象支持的字段的值。</summary>
/// <param name="obj">将设置其字段值的对象。</param>
/// <param name="value">要分配给字段的值。</param>
/// <exception cref="T:System.FieldAccessException">
/// 在适用于 Windows 应用商店应用的 .NET 或可移植类库中,改为捕获基类异常 <see cref="T:System.MemberAccessException" />。
///
/// 调用方没有权限来访问此字段。
/// </exception>
/// <exception cref="T:System.Reflection.TargetException">
/// 在适用于 Windows 应用商店应用的 .NET 或可移植类库中,改为捕获 <see cref="T:System.Exception" />。
///
/// <paramref name="obj" /> 参数是 <see langword="null" /> 且该字段为实例字段。
/// </exception>
/// <exception cref="T:System.ArgumentException">
/// 对象上不存在该字段。
///
/// - 或 -
///
/// <paramref name="value" /> 参数不能转换且不能存储在字段中。
/// </exception>
[DebuggerStepThrough]
[DebuggerHidden]
public void SetValue(object obj, object value);

  简单例子如下

        /// <summary>
/// 字段注入
/// </summary>
/// <param name="instance"></param>
private static void AutoWireFields(object instance)
{
var fields = instance.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
var fieldInfos = fields.Where(i => i.IsPrivate && i.Name.StartsWith("_") && i.FieldType!=typeof(string)).ToList();
fieldInfos.ForEach(f => f.SetValue(instance, Activator.CreateInstance(f.FieldType)));
}

构造函数注入

 public static void AutoWireConstructor(object instance, Type type)
{
var constructorInfos = instance.GetType().GetConstructors(); if (constructorInfos.Any())
{
foreach (var item in constructorInfos)
{
var cotrParams = new Object[] { Activator.CreateInstance(type) };
dynamic some = item.Invoke(cotrParams);//调用构造函数//
}
}
}

属性注入

 public static void AutoWireProperties(object instance,Type type)
{
var properties = instance.GetType().GetProperties();
if (properties.Any())
{
foreach (var obj in properties)
{
var diInstance = Activator.CreateInstance(type);
PropertyInfo pi2 = instance.GetType().GetProperty(obj.Name);
pi2.SetValue(instance, diInstance, null);
}
}
}

 

C#通过反射实现简单的控制反转和依赖注入(一)的更多相关文章

  1. 简单了解Spring的控制反转和依赖注入

    浅谈控制反转(Inversion of Control,IOC) 我们首先先来了解一下控制二字,也就是在控制"正"转的情况下,在任何一个有请求作用的系统当中,至少需要有两个类互相配 ...

  2. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  3. [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  4. spring学习总结一----控制反转与依赖注入

    spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转 ...

  5. [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  6. 【Spring Framework】Spring 入门教程(一)控制反转和依赖注入

    参考资料 Spring 教程 说在前面 什么样的架构,我们认为是一个优秀的架构? 判断准则:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:在不断添加新的代码的同时,可以不修改原有代码,即符合 ...

  7. Spring专题2: DI,IOC 控制反转和依赖注入

    合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...

  8. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  9. Java之控制反转和依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

随机推荐

  1. 在jupyter中配置c++内核

    安装 xeus-cling conda install xeus-cling -c conda-forg xeus-cling 是一个用于编译解释于C++的Jupyter内核目前,支持Mac与Linu ...

  2. BUUCTF-easycap

    easycap 看这个题目应该是流量包来的,wireshark打开即可.没什么特征,直接打开第一个包发现flag

  3. 记住这几个git命令就够了

    git clone: 下载初始化git add:添加git commit -m ' ' :提交 带消息git push:推送git pull: 拉取 git config --global user. ...

  4. JAVA设计模式总结—建造者模式

    建造者模式 模式动机与定义 ​ 首先建造者模式的动机是为了创建复杂对象,简化传统的创建方法,提高创建的效率和可读性. ​ 像图中的这个例子,用户的需求是驾驶一辆汽车,但是对于用户来说是不需要了解汽车装 ...

  5. archlinux-小米pro15_2020款使用archlinux(MX350显卡驱动安装)

    1.官网下载archlinux ISO镜像 https://archlinux.org/download/   使用磁力链接下载 2.使用软碟通将镜像写入U盘,制作成U盘启动盘 3.进入BIOS 关掉 ...

  6. LVGL库入门教程 - 动画

    动画可以说是 LVGL 中的特色之一,不过在使用动画前,请确保单片机具有足够的性能来维持足够的帧率. transition:过渡动画 当一个控件的状态发生改变时,可以让样式也发生变化以提醒用户.通过过 ...

  7. 高级程序员必知必会,一文详解MySQL主从同步原理,推荐收藏

    1. MySQL主从同步实现方式 MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句. Bin Log共有三种日志格式,可以binlog_format配置参数指定. ...

  8. Kafka ETL 之后,我们将如何定义新一代实时数据集成解决方案?

    上一个十年,以 Hadoop 为代表的大数据技术发展如火如荼,各种数据平台.数据湖.数据中台等产品和解决方案层出不穷,这些方案最常用的场景包括统一汇聚企业数据,并对这些离线数据进行分析洞察,来达到辅助 ...

  9. Eclipse拷贝动态的web工程

    1.选中需要拷贝的工程,CTRL+C,然后CTRL+V 2.在web动态工程中,还需要选中新拷贝工程,右键选中properties,然后搜索web,--->Web Project Setttin ...

  10. 特殊的阻塞队列 - java.util.concurrent.SynchronousQueue 分析

    描述 SynchrounousQueue 是一个比较特殊的无界阻塞队列并支持非公平和公平模式,严格意义上来说不算一个队列,因为它不像其他阻塞队列一样能有容量,它仅有一个指向栈顶的地址,栈中的节点由线程 ...