为何在新线程中使用注解获取不到Spring管理的Bean
新建的线程类NewThread,在这个类中国使用Spring的注解获取Service,为null
网上已有这种问题的解决方案,但是为何在新线程中使用注解获取不到Spring管理的Bean?
问了老大,一句话点破:new出来的线程,脱离了Spring的容器
PS:理解了一句话 ,Spring是最大的工厂模式
验证
线程有可能是因为native方法的原因,我不new 线程了,new一个别的对象,debug看看是否不能使用注解。
新建Test 类
public class Test { @Resource(name = "testServiceImpl") private SessionService testService; public Test() { } public void run() { System.out.println("****"); System.out.println(testService); } }
在Controller里 new 这个对象
Test test = new Test(); test.run();
查看,果然注入的null
原理
为什么new出来的对象会脱离Spring容器?
通俗的理解:Spring容器的作用,就是它来new对象实例。当手动使用new的时候,它就感知不到了
引用网上的一段原理来解释
转自:https://www.cnblogs.com/RunForLove/p/5706820.html
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象之后,两个人一起协作完成要完成的工作即可。
所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。
原创文章,欢迎转载,转载请注明出处!
相关文章
- 【Spring Boot】Spring Boot之两种引入spring boot maven依赖的方式
- Spring Cloud 学习网址
- Spring Boot中使用MyBatis注解配置详解(1)
- spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)
- spring boot: 线程池ThreadPoolTaskExecutor, 多线程
- Spring框架的@Valid注解
- spring task 配置
- 跟我学SpringCloud | 第十三篇:Spring Cloud Gateway服务化和过滤器
- spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)
- spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)
- spring学习 8-面试(事务,解决线程安全)
- Spring事务管理---上
- atititt.java定时任务框架选型Spring Quartz 注解总结
- SSM三大框架之Spring创建和获取对象
- 解决com.alibaba.fastjson.JSONException: write javaBean error问题以及解决Spring Boot加入Shiro导致spring aop失效的问题
- spring security oauth2 client_credentials模
- java ee wildfly spring 在线程池的线程中注入