目录
Spring注解@Resource和@Autowired区别
IOC
一、IOC原理
IOC(Inversion of Control):控制反转,是Spring Core最核心部分。
需要先了解依赖注入DI(Dependency Inversion):把底层类作为参数传递给上层类,实现上层对下层的“控制”。
IOC的另外一种实现方式:依赖查找DL(Dependency Lookup),Apache Avalon和EJB就是利用DL实现的IOC。DL相对DI而言是更为主动的方法,在需要的时候通过调用框架提供的方法来获取对象。获取时需要通过提供相关的配置文件路径、key等信息来确定获取对象的状态。DL已经被抛弃,因为它需要用户自己去使用API查找资源和组装对象,有侵入性。DI是当今IOC的主流实现方式。
-
依赖注入的方式
Set注入:实现特定属性的public setter()方法来让IOC容器调用注入所依赖类型的对象
接口注入:实现特定的接口来让IOC容器注入所依赖类型的对象
构造函数注入:实现特定参数的构造函数,在创建对象时让IOC注入所依赖类型的对象
注解注入:通过Java注解机制,让IOC容器注入所依赖类型的对象。例如Spring框架里的Autowire标签都是能够实现注解功能的
-
依赖倒置原则、IOC、DI和Spring IOC容器的关系
依赖倒置原则是一种思想,大致含义是高层模块不应该依赖低层模块,两者都应该依赖其抽象。
有了依赖倒置原则的指导才有了IOC的思路,实现IOC思路离不开DI依赖注入的支撑。spring框架基于IOC提出了容器的概念,对于IOC来说,最重要的就是容器,容器管理着Bean的生命周期,控制着Bean的依赖注入。
因为采用依赖注入,在初始化过程中会写大量new,容器解决这个问题。容器自动对代码进行初始化,只需要维护一个Configuration(可以是xml,也可以是一段代码)而不用每次初始化时都要亲手去写一大段初始化的代码。IoC Container的第二个好处是我们在创建实例的时候不需要了解其中的细节。从最上层开始往下找依赖关系,到达最底层之后再往上一步一步new,类似深度遍历。
参考:Spring IoC和AOP的实现原理解析、SpringIOC实现原理
二、Spring IOC的应用
spring启动时读取应用程序提供的bean配置信息,并在Spring容器中生成一份相应的bean配置表,根据注册表去实例化bean,装配好bean之间的依赖关系,为上层提供准备就绪的运行环境。spring提供配置文件描述bean以及bean之间的依赖关系,利用Java语言的反射功能实例化bean并建立bean之间的依赖关系。
-
spring IOC支持的功能
依赖注入、依赖检查、自动装配、支持集合、指定初始化方法和销毁方法、支持回调方法(需要实现Spring接口,这种实现方式带有侵入性)
-
spring IOC容器的核心接口
BeanFactory、ApplicationContext
BeanDefinition主要用来描述Bean的定义,Spring容器在启动的时候会将xml或者注解里bean的定义解析成spring内部的BeanDefinition。
BeanDefinitionRegistry接口提供向容器手工注册BeanDefinition对象的方法。
BeanFactory是Spring框架最核心的接口,提供IOC的配置机制;包含Bean的各种定义,便于实例化Bean;建立Bean之间的依赖关系;Bean生命周期的控制。
BeanFactory的体系结构&#