Java后端,每周一个编程技巧,积累自己的知识库!Spring依赖注入:@Autowired和@Resource

作者: 皮卡侯分类: 计算机技术 发布时间: 2024-04-06 22:51:58 浏览:26723 次

Java后端,每周一个编程技巧,积累自己的知识库!Spring依赖注入:@Autowired和@Resource

比哈斯的圣斗:
不建议再使用这类注解. 既然诸多bean都已经在容器工具箱中了. 在A业务bean中需要使用B的时候, 通过静态方法 applicantionContext.getBean通过O(1)时间复杂度获取到B的实例即可. 本身 bean 与bean的依赖关系本身就是动态的. 由需求和架构决定. 既然如此我为何不让一个 所谓的 @Service标记的bean 变得更纯净呢? 除了 logger 不存在任何成员变量.

【回复】很好,你的思路没任何毛病[打call][打call][打call]。但是这种语法糖造出来,就是为了从程序员的角度去精简代码,提高开发效率的。企业通常不会考虑极致的性能问题,都使用脚手架框架了,还考虑什么性能。企业更多是想快速开发出一个应用,性能跟不上的话,更简单粗暴的做法通常是直接加内存。
【回复】回复 @请叫我凯哥_ :没有吧. 封装的确包括方法和成员. 业务bean的作用就是方法不间断的入栈出栈完成系统运行时行为.只是bean获取另一个bean的方式在运行时完成, 不再静态指定.形式上跟我们调用 StringUtils.substring 一样. 只是现在变为了 IocUtils.getBean(OrderService).create(); 当我们业务bean不需要 创建order时, 会直接删除代码.但是常规写法 经常是 删除了 orderService.create(); 但 @autowired 那经常忘删. 这说明了 bean的依赖关系本身并不稳定, 当不需要时切断业务代码即可. 无需非要将另外平级的bean 成员化. 当前很多DDD模型下 这样做也比较常见.
【回复】bean确实更纯净了,但其实程序运行是更慢了,spring只是启动慢,运行并不用去ioc里面获取bean,直接使用注入的就行了,不过某些场景是需要这样动态获取bean的。
Madoka酱:
那我直接new一个对象去使用和用注解注入有啥区别呢?从表面上好像看不出区别,是生命周期会有影响吗?由ioc容器控制的对象与常规对象在回收机制上有区别吗?

【回复】对开发者来说区别不大,对JVM可大多了。不设置的情况下,IOC创建的Bean一般都是单例,省去很多内存开销,间接影响垃圾回收。垃圾回收机制本身是没影响,这是JVM层面上的事情,到不了这一步
【回复】直接new耦合死了,如果后面改实现类就得改源码,注解注入就是通过第三方获取对象
【回复】直接new的没办法走代理 aop切面就没法用了 比如说 mybatis 就没法用
Scorpiooo丶:
请问下这个资料是up主手打的吗[星星眼]好厉害!

苏尔兰王子:
首先说一下,Spring 不推荐使用字段注入,无论是 @Autowired 还是 @Resource。 Spring 文档 Dependency Injection 章节也没用提到字段注入:https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html 用 @Autowired 在 IDEA 中会有警告:Field injection is not recommended,我在网上查过相关资料。 参考这篇文章:https://www.baeldung.com/java-spring-field-injection-cons 具体原因有一下几点: 1. 空指针异常:如果用 new 实例化 Bean,则该 Bean 中字段注入的依赖回报空指针异常 2. 不可变性:用字段注入时,不可以使用 final 关键字,这导致该依赖可能会被改变 3. 设计模式的缺陷:违反了单一职责、会导致循环依赖 Spring 官方只推荐两种注入:构造器注入和 Setter 注入。如果是必须的依赖,应使用构造器注入。非必需的依赖,使用 Setter 注入。

塞班和如来的私生子:
既然一对一实现,为什么还要声明接口呢,不是java开发,纯好奇

【回复】回复 @塞班和如来的私生子 :而且一个类中可不只是公开的方法,有时候方法很长,就要抽成几个小的方法,这些小方法肯定是给成私有了,这时候接口的好处就来了,可能我一个实现类里面有100个方法,公开的只有5个,对外暴露接口的5个方法就行了,私有方法不暴露
【回复】回复 @塞班和如来的私生子 : 跟c/c++那边的头文件有点像,xxx.h很多时候就会对应一个xxx.c,这里不也是1对1实现;只不过java这里是具体化了接口这个概念,然后再找一个东西来实现;
【回复】写好接口,分工去实现接口
吉吉国王有巴哥:
@Resource根据作用用。如果真是看不惯警告⚠️set 或者构造器就可以解决。但是用@Resource来解决警告。注解是粒度细分的结果。而不是为了没必要的问题把粒度变粗。这使得可维护行性变差

伊江痕:
https://www.bilibili.com/video/BV1Zx421S7QF/?spm_id_from=333.999.0.0&vd_source=1ae95cccff78cb98517bf4ceeee0ddc6

是你学习快乐啊:
加油,在校生看了很有帮助,非常感谢up主

【回复】回复 @李金轩呀 :转go,智能合约,rust,区块链,web3.0 未来趋势。我现在就在转。
【回复】回复 @ty921918 : 转什么,听劝。
【回复】劝你转行吧,北京JAVA已经找不到工作。
Triste_tulip:
日志打印是什么。好清晰,是配的还是插件啊。[星星眼]

【回复】通过AOP配置的,之前有一期视频专门讲配置方式,可以扒拉瞅一眼
Allensec:
很多其他类的视频都是讲相同类型的bean有两个交给spring管理,所以autowired不能工作,但其实自动注入找类型是找的接口类型,给的bean才是接口实现类的bean。当一个接口有两个实现类的时候,无论你想注入哪个实现类,用autowired,spring都不会知道你想注入哪个

大黑牛牛Elove:
后面这个文档能分享一下那[打call][打call][打call]

Riveking:
讲得很清楚,希望这个系列能继续保持更新

编程 Java后端 我是程序员 @Autowired @Resource 容器 IOC 区别 Spring 依赖注入

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

更多相关阅读