问题:一个业务类交给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管理的对象与它的属性(被注入的属性)存在依赖关系;