关于@Autowire和@Resource注解的理解

开发中面临的问题:
一般的java或者面向对象思想的程序的架构,大量使用了“组合”这一实现方式,也就是在一个对象内部持有了别的对象的引用,来实现多个对象的交互。这些引用一般由程序员控制。
但是这样,会出现明显的问题:代码耦合度过大,可能修改了一个类中的方法,持有这个对象的所有地方的代码都需要修改,不便于维护。


关于@Autowire和@Resource注解的理解_第1张图片
没有IOC的情况下就必须单独创建需要的每个对象.png

Spring的IOC和DI

IOC:控制反转(Inversion of control),是面向对象编程中的一种设计原则,是一种解耦的思想,可以用来减低计算机代码之间的耦合度。
简单来说就是 ”控制权的转移” 。
若我们new一个实例,该实例的控制权在我们程序员手上,而控制反转指new实例工作交由spring的IOC容器来完成,不经由程序员,因而控制权在spring容器,我们使用时,仅仅只是调用这个实例。
IOC的一个重点就是,在系统运行中,动态地向某个对象提供它需要的其他对象。这一点即是通过依赖注入(DI)来实现的。spring是通过反射来实现注入的。

DI:依赖注入(dependency injection),依赖就是指一种关系,如果在 “类A” 中创建了 “类B” 的实例,我们说 “类A” 依赖 “类B”。依赖类不由程序员实例化,而是通过spring容器帮我们new指定的实例,并将实例注入到需要该对象的类中去.

DI是IOC的另一种表述方式。

关于@Autowire和@Resource注解的理解_第2张图片
依赖注入.png

SpringBoot的三层架构:controller、service、dao,设计思想是高内聚,低耦合。高内聚是指特定的类或者功能,放在同一个位置,主要依靠调用其他层级的方法得以实现低耦合的思想,所以IOC和DI是非常常见而且常用的。

@Autowire相当于由spring负责依赖注入,而你的new是直接new一个对象。

Spring提供了五种自动装配的类型
①no:显示指明不使用Spring的自动装配功能
②byName:根据属性和组件的名称匹配关系来实现bean的自动装配
③byType:根据属性和组件的类型匹配关系来实现bean的自动装配,有多个适合类型的对象时装配失败
④constructor:与byType类似是根据类型自动装配,但是要求待装配的bean有相应的构造函数
⑤autodetect:利用Spring的自省机制判断使用byType或是constructor装配

使用XML方式进行装配

使用注解的方式进行装配

Spring通过@Resource注解和@Autowire实现自动装配

@Resource 根据byName进行装配
@Autowire通过byType进行装配

@autowire跟XML方式注入类似,是Ioc容器负责创建新的实例,实例里可以有其他的依赖关系并也由springIoc容器负责注入,如果只是简单的new一个对象的话,新对象里面的所有变量依赖都是没有注入的,这样就失去了Ioc的意义。

感谢:
https://blog.csdn.net/HaoDaWang/article/details/76575667
https://blog.csdn.net/qq_34581118/article/details/80610730

你可能感兴趣的:(关于@Autowire和@Resource注解的理解)