spring的几种注入方式
在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的几种注入方式相关推荐
- Spring的四种注入方式
Spring的四种注入方式 1.set方法注入 2.构造器注入 3.静态工厂注入 4.实例工厂注入 我使用下面两个类来进行注入的演示,这两个类分别是User和Car类: Car类: public cl ...
- Spring的三种注入方式(为什么推荐构造器注入?)
Spring的三种注入方式 一.属性注入 @Resource和@Autowired的区别 为什么尽量使用 @Resource? 二.setter 注入 三.构造器注入 具体可以看看Spring官网 为 ...
- 扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?
循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...
- Spring 的三种注入方式?
1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...
- Spring 的三种注入方式,到底哪种注入方式最佳?
1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...
- Spring选择哪种注入方式
1. Spring常见的注入方式 1.1 Field注入 field即在变量上直接使用注解进行注入,内部使用反射的方式实现注入到field中. 优点:代码简洁有效,最为开发人员喜欢使用 缺点:依赖对象 ...
- Spring Bean四种注入方式(Springboot环境)
阅读此文建议参考本人写的Spring常用注解:https://blog.csdn.net/21aspnet/article/details/104042826 给容器中注册组件的四种方法: 1.@C ...
- Spring 依赖注入的理解及三种注入方式
Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...
- spring三种注入方式
设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUni ...
最新文章
- 音视频技术:视频质量评价方法简介
- 市民调取公共场所监控影像为何如此之难?
- Javascript代码段记录: utils
- PostgreSQL字符串截取替换
- 局域网ip地址不够用怎么解决?
- tcp/ip客户端与服务器
- jq动态渲染后获取不到元素高度_浏览器的渲染机制
- 8196国开计算机专业英语,电大计算机网络(本)学习周期01任务A_0002答案
- Angular 响应式表单 patchValue和setValue
- A*寻路算法的C#实现
- ubuntu以安装包方式安装jdk13
- 化解字符串不能超过8000的方法及交叉表的处理
- PADS Layout 滴泪、敷铜和删除
- 浅析微信支付:商户平台开通现金红包、指定用户发放、红包记录查询
- Appium+网易mumu模拟器+python 使用笔记
- 两阶段目标检测原理详解--SPPNet
- 限时订单实现方案(DelayQueue、ActiveMq)
- PythonPyCharm
- shell替换和去掉换行符
- 2019最全的大数据技术解读,如何4个月掌握大数据核心技术?