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

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

  • 相关阅读:
    jquery 动态选中radio
    在Struts2的Action中取得请求参数值的几种方法
    Collections类sort方法的用法
    struts2 action 之间跳转
    JavaScript 解析 xml 文件 如 rss订阅
    jquery 获取 选中的checkbox的值
    velocity 时间显示 时间格式化 时间转化
    firefox3.6 ie8 jQuery选择checkbox
    IFormattedTextSymbol接口 设定Anchor点的水平或者垂直对其方式
    gisbase网站,因其购买的空间提供商,“涉黄”暂行关闭。
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/springBean.html
Copyright © 2011-2022 走看看