在spring中,我个人认为依赖注入的方式有3种,分别是通过属性filed注入、构造方法注入、set方法注入。接下来通过代码具体分析一下。

1、属性filed注入

@Autowired加在属性上,采用的是filed反射注入。

    @Componentpublic class StayService {@Autowiredprivate StayDao stayDao;public void setStayDao(StayDao stayDao) {System.out.println("-----set-------");}public void query(){System.out.println(stayDao);}}

在上面的代码中。当我们向IndexDao中注入IndexService时,会去Spring容器中共寻找IndexService这个类型的bean,寻找的方式一般是根据byType,再byName去找。所以ByType和ByName再这里只是我们寻找bean的一主方式。它的注入是通过filed.set来注入的,而不是通过set方法。

public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext acc = new AnnotationConfigApplicationContext(AppConfig.class);StayService service = acc.getBean(StayService.class);service.query();}
}


这里根本没有调用set方法,但是stayDao这已经有值了(没有打印set方法里的字符串)。所以这里是通过filed.set反射注入进来的。

2、构造方法注入

@Autowired加在构造方法上(也可以不加@Autowired注解)通过构造方法注入。

@Component
public class StayService {//    @Autowiredprivate StayDao stayDao;@Autowiredpublic StayService(StayDao stayDao){this.stayDao = stayDao;System.out.println("构造方法 "+this.stayDao);}public void setStayDao(StayDao stayDao) {System.out.println("-----set-------");}// public void query(){
//      System.out.println(stayDao);
//  }}

打印结果

3、set方法注入

@Autowired加在set方法上采用的是set方法反射注入。

@Component
public class StayService {private StayDao stayDao;@Autowiredpublic void setStayDao(StayDao stayDao) {System.out.println("-----set-------"+stayDao);}
}

打印结果

这里跟set方法的名字没有任何关系,方法名字可以随便取。参数类型符合就行。

扩展

假设我们需要开发一个中间件,类似于MyBatis的。来看一下下面的这段代码。

//1、需要把StayService动态加载到Spring容器```
public class StayService {//2、需要把StayDao注入到StayServiceprivate StayDao stayDao;public void setStayDao(StayDao stayDao) {System.out.println("-----set-------"+stayDao);}
}

因为这里是模拟开发中间件,所以我们不能依赖Spring,也就是不能使用@Component和@Autowired注解将他们注入进来。我们先来考虑在不使用@Autowired注解的情况下如何将StayDao注入到StayService中来。

1、假设StayService已经存在容器中

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {GenericBeanDefinition stayService = (GenericBeanDefinition)beanFactory.getBeanDefinition("stayService");stayService.setAutowireMode(2);}
}

这里我将StayService的BeanDefinition取出来,将它的AutowireMode模式设置为了2,2代表通过set方法注入,它会去寻找writeMethod,也就是以set开头,符合spring定义的规则的方法,这里会找到setStayDao方法将StayDao注入进来。当然实现的方式有很多种,这只是其中一种。打印结果如下。

2、不依赖spring将StayService放入Spring容器中,并注入StayDao。

public class MyRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(StayService.class).getBeanDefinition();beanDefinition.setAutowireMode(2);registry.registerBeanDefinition("stayService",beanDefinition);}
}

通过实现ImportBeanDefinitionRegistrar拿到注册器,将类转换为beanDefinition并修改setAutowireMode,再将它注入到spring容器中。如果仅仅只是还是不行的。我们还需要借助@Import注解将MyRegistrar这个类交给spring去解析。

@Configuration
@ComponentScan("com")
@Import(MyRegistrar.class)
public class AppConfig {
}

打印结果:

spring的几种注入方式相关推荐

  1. Spring的四种注入方式

    Spring的四种注入方式 1.set方法注入 2.构造器注入 3.静态工厂注入 4.实例工厂注入 我使用下面两个类来进行注入的演示,这两个类分别是User和Car类: Car类: public cl ...

  2. Spring的三种注入方式(为什么推荐构造器注入?)

    Spring的三种注入方式 一.属性注入 @Resource和@Autowired的区别 为什么尽量使用 @Resource? 二.setter 注入 三.构造器注入 具体可以看看Spring官网 为 ...

  3. 扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

    循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...

  4. Spring 的三种注入方式?

    1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...

  5. Spring 的三种注入方式,到底哪种注入方式最佳?

    1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...

  6. Spring选择哪种注入方式

    1. Spring常见的注入方式 1.1 Field注入 field即在变量上直接使用注解进行注入,内部使用反射的方式实现注入到field中. 优点:代码简洁有效,最为开发人员喜欢使用 缺点:依赖对象 ...

  7. Spring Bean四种注入方式(Springboot环境)

    阅读此文建议参考本人写的Spring常用注解:https://blog.csdn.net/21aspnet/article/details/104042826 给容器中注册组件的四种方法:  1.@C ...

  8. Spring 依赖注入的理解及三种注入方式

    Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...

  9. spring三种注入方式

    设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUni ...

最新文章

  1. 音视频技术:视频质量评价方法简介
  2. 市民调取公共场所监控影像为何如此之难?
  3. Javascript代码段记录: utils
  4. PostgreSQL字符串截取替换
  5. 局域网ip地址不够用怎么解决?
  6. tcp/ip客户端与服务器
  7. jq动态渲染后获取不到元素高度_浏览器的渲染机制
  8. 8196国开计算机专业英语,电大计算机网络(本)学习周期01任务A_0002答案
  9. Angular 响应式表单 patchValue和setValue
  10. A*寻路算法的C#实现
  11. ubuntu以安装包方式安装jdk13
  12. 化解字符串不能超过8000的方法及交叉表的处理
  13. PADS Layout 滴泪、敷铜和删除
  14. 浅析微信支付:商户平台开通现金红包、指定用户发放、红包记录查询
  15. Appium+网易mumu模拟器+python 使用笔记
  16. 两阶段目标检测原理详解--SPPNet
  17. 限时订单实现方案(DelayQueue、ActiveMq)
  18. PythonPyCharm
  19. shell替换和去掉换行符
  20. 2019最全的大数据技术解读,如何4个月掌握大数据核心技术?

热门文章

  1. Carsim与Simulink联仿Carsim找不到Matlab错误的解决方案,此前装过多个Matlab版本出现该问题可以尝试此方法
  2. JS 截取身份证号码中 的生日
  3. ARM嵌入式开发板推荐
  4. sqlmap 使用方法
  5. 【语音算法】使用端点检测和百度语音识别技术实现视频的字幕生成
  6. android gif图片闪烁,Android中动态显示gif图片
  7. Alluxio代码结构
  8. 选择沃创云AI智能外呼机器人,实现真正的开源节流
  9. 微信发送过来的位置怎样用高德地图收藏这个点加入收藏夹
  10. Python入门 类型转换