欢迎访问我的个人网站==》 jiashubing.cn

为何在新线程中使用注解获取不到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容器来建立它们之间的关系。

 

原创文章,欢迎转载,转载请注明出处!

posted @ 2018-01-25 11:10  贾树丙  阅读(3112)  评论(0编辑  收藏  举报