問題:一個業務類交給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管理的對象與它的屬性(被注入的屬性)存在依賴關系;