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

  1. @Service
  2. public class SysDeptServiceImpl implements SysDeptService {
  3.  
  4. @Autowired
  5. private SysDeptMapper sysDeptMapper;
  6. }
  1. @Mapper
  2. public interface SysDeptMapper {
  3. int deleteByPrimaryKey(Long id);
  4.  
  5. int insert(SysDept record);
  6.  
  7. int insertSelective(SysDept record);
  8.  
  9. SysDept selectByPrimaryKey(Long id);
  10.  
  11. int updateByPrimaryKeySelective(SysDept record);
  12.  
  13. int updateByPrimaryKey(SysDept record);
  14.  
  15. List<SysDept> findPage();
  16.  
  17. List<SysDept> findAll();
  18. }

 

依赖注入主要有

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

C#实现字段注入

通过 FieldInfo 的 setValue实现

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

  简单例子如下

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

构造函数注入

  1. public static void AutoWireConstructor(object instance, Type type)
  2. {
  3. var constructorInfos = instance.GetType().GetConstructors();
  4.  
  5. if (constructorInfos.Any())
  6. {
  7. foreach (var item in constructorInfos)
  8. {
  9. var cotrParams = new Object[] { Activator.CreateInstance(type) };
  10. dynamic some = item.Invoke(cotrParams);//调用构造函数//
  11. }
  12. }
  13. }

属性注入

  1. public static void AutoWireProperties(object instance,Type type)
  2. {
  3. var properties = instance.GetType().GetProperties();
  4. if (properties.Any())
  5. {
  6. foreach (var obj in properties)
  7. {
  8. var diInstance = Activator.CreateInstance(type);
  9. PropertyInfo pi2 = instance.GetType().GetProperty(obj.Name);
  10. pi2.SetValue(instance, diInstance, null);
  11. }
  12. }
  13. }

 

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. Windows下新建隐藏用户名

    Windows下新建隐藏用户名,防止忘记密码

  2. CVPR2022 | 可精简域适应

    前言 在本文中,作者引入了一个简单的框架,即Slimmable Domain Adaptation,以通过权重共享模型库改进跨域泛化,从中可以对不同容量的模型进行采样,以适应不同的精度效率权衡.此外, ...

  3. 实现领域驱动设计 - 使用ABP框架 - 创建实体

    用例演示 - 创建实体 本节将演示一些示例用例并讨论可选场景. 创建实体 从实体/聚合根类创建对象是实体生命周期的第一步.聚合/聚合根规则和最佳实践部分建议为Entity类创建一个主构造函数,以保证创 ...

  4. Lydon 分解与最小表示法

    我们定义一个串是 \(\text{Lyndon}\) 串,当且仅当这个串的最小后缀就是这个串本身. 该命题等价于这个串是它的所有循环表示中字典序最小的. 引理 1:如果 \(u\) 和 \(v\) 都 ...

  5. 0016:单源最短路径(dijkstra算法)

    题目链接:https://www.luogu.com.cn/problem/P4779 题目描述:给定一个 n 个点,m 条有向边的带非负权图,计算从 s 出发,到每个点的距离. 这道题就是一个单源最 ...

  6. docker容器管理操作

    Docker容器的四种状态: 运行 已暂停 重新启动 已退出 1.容器的创建 容器创建:就是将镜像加载到容器的过程. 创建容器时如果没有指定容器名称,系统会自动创建一个名称. 新创建的容器默认处于停止 ...

  7. jdbc 10:jdbc事务

    jdbc连接mysql,涉及到的事务问题 package com.examples.jdbc.o10_jdbc事务; import java.sql.Connection; import java.s ...

  8. Nginx第三方模块Ngx-dyups安装过程

    Ngx-dyups是什么,能干什么 它是一个Nginx第三方动态Upstream配置模块,可以实现在不重启Nginx情况下动态更新反向代理Upstream表.该模块由淘宝开发团队维护,淘宝自家的Ten ...

  9. 基于 Hexo 从零开始搭建个人博客(五)

    阅读本篇前,请先阅读前几篇文章: 基于 Hexo 从零开始搭建个人博客(一) 基于 Hexo 从零开始搭建个人博客(二) 基于 Hexo 从零开始搭建个人博客(三) 基于 Hexo 从零开始搭建个人博 ...

  10. 二重循环中的break与continue

    二重循环中的break和continue用于控制本层循环,注意其不会影响外层循环的执行,这边和C中的break和continue的作用范围是一样的,也符合逻辑 example: 点击查看代码 for ...