发布于2021-05-29 22:45 阅读(966) 评论(0) 点赞(26) 收藏(1)
把创建和管理bean的过程转移给了第三方,而这个第三方就是Spring IOC.
是bean的创建、管理的权利,控制bean的整个生命周期。
对象的创建这个权利交给了Spring容器,而不是自己去控制,就是反转。
程序运行需要依赖外部的资源,提供程序内对象的所需要数据、资源。
配置文件把资源从外部注入到内部,容器加载了外部的文件、对象、数据,然后把这些资源注入给程序内的对象,维护了程序内外对象之间的依赖关系。
解耦。
如图:
@Autowired按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
new 对象的过程。
当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。
解决方法:
在bean中尽量减少可变的成员变量(private final 变量)
在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中。(怎么理解???):基于线程的变量,不会被其他线程获取到。ThreadLocal数据结构类似一个Map的ThreadLocalMap结构。用法
ThreadLocal<Integer> totalScore = new ThreadLocal<>();
totalScore.set(1);
System.out.println(totalScore.get());
totalScore.set(2);
totalScore.set(3);
System.out.println(totalScore.get());
DisposableBean
接口,执行 destroy()
方法。英文版:
中文版:
解决方案同一道LeetCode题:two sum 相似
先说思路:A先实例化放到缓存中,然后A填充字段属性,需要B,切B没有实例化,那么接着去实例化B,然后填充B的字段属性,发现B需要A,检查缓存,发现A存在然后取出A填充B,B填充结束后,把B的实例化对象再填充A。
阅读DefaultSingletonBeanRegistry类,你会发现里面有三个Map:
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
这三个Map就是解决循环依赖的本质:
循环依赖发生的场景只发生在singelton(默认的单实例)中
https://mp.weixin.qq.com/s/5mwkgJB7GyLdKDgzijyvXw
https://www.jianshu.com/p/a77e64250a9e
委托类不能是final类
引用:
Spring常见问题
什么是Spring循环依赖?
排查IOC注入属性为空
作者:程序员之神
链接:http://www.javaheidong.com/blog/article/207885/c297f102367a2fa55fce/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!