zoukankan      html  css  js  c++  java
  • Spring容器管理对象和new对象

    问题:一个业务类交给spring管理,并自动注入了其他业务类作为属性,方法中通过全局属性调用其他业务类的方法。当该业务类是通过new获取的情况下,该实例的属性会是null(不存在依赖注入实例),调用方法就会报空指针。

    为保证该方法无论是被new出来的对象调用还是被spring容器对象引用都能正常使用,方法中就要 使用spring管理的类 。


    获取spring管理的对象:
     WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); 
     Object obj=wac.getBean(beanID);

    spring的IOC和DI理解:
    控制反转:对象实例在spring启动后都会被创建,只需要从容器中获取就可以使用。可以通过xml配置bean的方法获取,也可以通过注解扫描的方法创建。@Component
    依赖注入:字面意思指的是类的属性实例化过程。在获取到被spring管理的对象时,该对象的属性如果在spring容器也存在实例,那么可以直接从spring获取(注入),
    也就是该类的属性依赖于对象本身的实例化而实例化。如果对象不是从容器获取,那么它的属性也不会从容器实例化。可以通过xml配置注入,也可以通过在可扫描类下加@Autowired依赖注入。
    DI:
    不管是面向对象, 还是面向过程, 都需要分成许多的块, 然后由这些部件协同工作完成任务
    要协同工作就会产生依赖, 一个方法调用另一个方法, 一个对象包含另一个对象
    如果对象 A 包含对象 B 的话, 就需要在 A 里 new 一个 B
    依赖注入从具体类 B 里抽象出接口 IB——IB 的具体实现可能有很多 B,B1,B2...很多种——
    这样 A 可以不用再 new 具体的 B 了, 而是跟 IoC 容器说: 我要一个 IB(getBean("IB")) 。
    然后, 由容器根据配置文件来做具体的 new 的工作。 具体 new 的是哪个, 由配置文件从代
    码外部决定, 要更换成 B,B1,或是 B2...修改配置文件就能做到, 不用再改代码了
    
    
    
    总结:new对象与spring管理的对象没有关联。new对象并没有spring参与管理,它的属性不存在依赖注入,它的属性要手动实例化。spring管理的对象与它的属性(被注入的属性)存在依赖关系;






  • 相关阅读:
    使用docker部署zabbix
    进入容器脚本
    Docker安装
    docker命令总结
    zbb20180827 Spring中ClassPathXmlApplicationContext类的简单使用,main方法加载application.xml文件
    zbb20180824 spring ioc aop 例子
    tomcat运行报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost].
    zbb20180815 网盘搜索引擎
    Java字节码指令收集大全
    zbb20180716 SpringBoot 使用feign时报错Service id not legal hostname
  • 原文地址:https://www.cnblogs.com/mryangbo/p/9732744.html
Copyright © 2011-2022 走看看