目录
问:@Autowired和@Resource在实际项目中如何选择使用?
三层架构
单一职责原则
一块代码只管一个功能,使接口、方法复杂度更低、可读性更强、扩展性更好,更有利于后期维护。
这是以后Web开发的标准哦!
分层解耦
内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
软件设计原则:高内聚、低耦合。
高内聚
模块内部功能联系越紧密越好。
低耦合
尽可能的降低层与层之间或者模块与模块之间的依赖关联,最好做到解除耦合。无互相依赖了,一层改变不影响别的层了,挺好的。
如何解耦
主要就是想把new那块去掉,我们可以提供一个容器,容器可以存放对象,用的时候拿出来就好了,就不用new了。
控制反转和依赖注入思想
控制反转
Inversion Of Control: 简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
依赖注入
Dependency Injection,简称DI,容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象
IOC容器(Spring容器)中创建、管理的对象,称之为Bean。
具体实现
1)Service层及Dao层的实现类,交给IOC容器管理。只需加一个注释:@Component
2)Controller运行时需要依赖Service对象,而Service运行时需要依赖Dao,那么容器就要为其运行提供Bean对象。我们只要在成员变量上加上注解@Autowired。这就是依赖注入。
Service层需要依赖Dao层 那我们就把Dao这类放在容器里。
Controller层需要依赖Service层,那应该怎么样呢,就把Service层也放在容器里呗,加注释加注释加注释!
Controller需要依赖Service吧,直接注入,只要IOC容器里面有就行!
Service需要依赖Dao吧,注入注入,加注释加注释。
灵活使用@Component的添加取消,可以实现类切换。
细谈控制反转IOC
将对象的控制权交给IOC容器,由IOC容器创建和管理这些对象。
一般都用衍生注解的,但是那个Controller不用特意注释,因为@RestController底层有一个注解讲就是Controller,还封装了@ResponseBody,整合就是@RestController。
Service封装了@Component注解,其他是原注解。
Bean组件扫描
细谈依赖注入DI
IOC容器要为应用程序提供运行时需要的资源,资源就是对象。
@Autowired 自动装配。默认是按类型进行的,到容器中找到该类型完成注入。
可能A和B实现了相同的接口,可以用注释决定谁先注入。
这块涉及面试题了 划重点!
问:@Resource和@Autowired的区别
1)@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。
2)@Autowired默认是按照类型注入,而@Resource默认是按照名称注入。
3)@Autowired可以用于字段、构造方法和方法上,@Resource可以用于字段和set方法上
4)@Autowired在有多个相同类型的bean时,需要结合@Qualifier注解来精确注入,@Resource在有多个相同类型的bean时,会根据名称进行匹配,如果找不到对应的bean则会报错。
问:@Autowired和@Resource在实际项目中如何选择使用?
@Autowired
是Spring提供的注解,它默认按类型进行自动装配,非常适合在Spring容器中管理大量bean时使用。它提供了灵活性,尤其是在存在多个同类型bean的情况下,通过@Qualifier
注解可以精确控制注入的bean。此外,@Autowired
的required
属性允许我们指定某些依赖是否必须,这增加了代码的健壮性。
另一方面,@Resource
是Java EE规范的一部分,它默认按名称进行自动装配,这使得它在需要明确指定bean名称时非常有用。它的使用可以减少对Spring框架的依赖,增加了代码的可移植性。然而,@Resource
在没有找到匹配的bean时会抛出异常,这要求开发者在使用时必须确保bean的存在。
在实际项目中,选择使用哪一个注解取决于多种因素。如果项目完全基于Spring,并且我们希望利用Spring的自动装配特性,@Autowired
是首选。但如果我们需要保持代码的可移植性,或者在多框架集成的环境中工作,@Resource
可能更合适。此外,团队的编码习惯和项目的具体需求也是决定使用哪个注解的重要因素。
总的来说,选择@Autowired
还是@Resource,
需要根据项目的具体需求、团队的偏好以及代码的可维护性来做出决策。