上面说过,IOC的注入有两个地方需要提供依赖关系,一是类的定义中,二是在spring的配置中需要去描述。自动装配则把第二个取消了,即我们仅仅需要在类中提供依赖,继而把对象交给容器管理即可完成注入。在实际开发中,描述类之间的依赖关系通常是大篇幅的,如果使用自动装配则省去了很多配置,并且如果对象的依赖发生更新我们可以不需要去更新配置,但是也带来了一定的缺点。

  说白了就是只需要声明bean,至于对象间的相互引用关系由Spring自己搞定。。

  使用方式:no(不启用),byName(根据名称),byType(根据类型),constructor(构造方法)

<beans ....
default-autowire="byType"> </beans>

  自动装配的优点参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-autowire

  缺点参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-autowired-exceptions

  byType的装配过程:Spring第一步会把所有的bean都加载到容器中,第二步解析时发现Service里有个dao依赖,就会按照依赖去找类属性是这个Dao或者父类是这个Dao的类属性进行注入。

  如果同一个接口有2个实现类,并且还使用接口注入的话就会报错,这是需要改为byName方式,或者根据实现类注入。

  另外,在bean标签中是可以单独指定装配方式的:

<bean id="ClassOne" class="****" autowired="byType">

annotation注入方式中的自动装配:

  使用注解@Autowired默认是使用的转配方式是byType,如果没有找到还会使用byName,还没有找到要装配的类,报错。

  注解@Resource默认使用byName,根据属性名来确认的,还可以通过type来指定具体的名称,如 @Resource(type = “IndexImpl”)  

spring懒加载

  在Spring配置文件里增加如下语句,表示Spring并不是在在项目启动时全部注入,而是在使用时才会注入,默认false

<beans .....     
  default-lazy-init="true">
</beans>

SpringBean的作用域

  singleton:单例

  prototype:标准,每次都是新的对象

  request:限定每个Http请求都是新的对象

  session:将单个bean定义的范围限定为HTTP会话的生命周期。仅在可感知web的Spring ApplicationContext上下文中有效。

  applicaiton:将单个bean定义的范围限定为ServletContext的生命周期。仅在可感知web的Spring ApplicationContext上下文中有效。

  websocket:将单个bean定义的范围限定为WebSocket的生命周期。仅在可感知web的Spring ApplicationContext上下文中有效。

@Autowired注解

  @Autowired注解到底使用了那种方式自动装配技术的呢?从Spring源码可以看到,Spring是使用后置处理器AutowiredAnnotationBeanPostProcessor来实现@Autowired的自动装配的,代码如下:

  这里个beanFactory是ConfigurableListableBeanFactory接口,而实现这个接口的类是DefaultListableBeanFactory,在DefaultListableBeanFactory类中的方法resolveDependency又调用了方法doResolveDependency

  通过这段代码,我们可以确定,@Autowired代码是首先是根据byType查找对象,如果查到的对象的数量大于1,再根据byName查找的。

最新文章

  1. android性能优化练习:过度绘制
  2. SetEnvlfNoCase 记录从自己网站之外传来的请求
  3. vbox 虚拟机共享文件夹 debian
  4. linux原始套接字(1)-arp请求与接收
  5. MAC OS VPN使用指南
  6. MongoDB 学习笔记(四)C# 操作MongoDB
  7. jQuery 判断是否为数字的方法 及 转换数字函数
  8. 如何在eclipse中配置Selenium
  9. javascript函数基础
  10. asp.net mvc生命周期学习
  11. Configuration ReportNG with TestNG
  12. 什么是MEAN全堆栈javascript开发框架
  13. iOS 开发新版 动态库framework
  14. entityframework单例模式泛型用法
  15. HR_Sherlock and Anagrams_TIMEOUT[UNDONE]
  16. vue2.0 导出Excel表格数据
  17. 解决Geoserver请求跨域的几种思路,第二种思路用过
  18. [转帖]第二个显示屏上禁用Windows任务栏
  19. Mplayer1.0rc2移植到am335x开发板
  20. 3069: [Pa2011]Hard Choice 艰难的选择

热门文章

  1. python 爬虫:HTTP ERROR 406
  2. MYSQL 之 JDBC(一): 数据库连接(一)通过Driver接口获取数据库连接
  3. flask 源码专题(十):flash源码研究
  4. 数据可视化之powerBI入门(三)财务人员必学,使用Powerquery是一种什么体验?
  5. 数据可视化之powerBI入门 (一)认识PowerBI
  6. 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
  7. Burp Suite Spider Module - 网络爬虫模块
  8. GPO - Folder Mapping via GPO
  9. 写给程序员的机器学习入门 (八) - 卷积神经网络 (CNN) - 图片分类和验证码识别
  10. Java之枚举类