springiocxml方式注入对象原理分析
生活随笔
收集整理的這篇文章主要介紹了
springiocxml方式注入对象原理分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
尤其是注解版本,都看懂了沒有,你們最好都建立maven工程,不要建單獨的java項目,這個項目建好了之后說一下,直接把pom文件copy過來,pom文件里面不是有依賴信息嗎,你們都不要去寫了,寫比較浪費時間,那么這個時候我就直接講一下,一種場景,在這里我們首先先講第一種方式,手寫XML版本的,XML版本是最簡單的,而且是最好理解的,首先我們看看效果,看什么效果呢,你們千萬不要把代碼記下來,那都不重要,而是要記他的過程和原理,這個話我再說一遍,在這里我們看個例子,看個什么例子呢,UserService userService = (UserService) app.getBean("userServiceImpl");我們是不是寫過這個代碼,干嘛用的你們想想,記住這是原生的,不是我寫的,這是原生的,是不是獲取bean對象,IOC你們都懂不懂,什么是IOC,這個了不了解,都了解吧,IOC就是把bean與bean之間的關系交給第三方容器進行管理,那么這個時候我說一下,任何關于bean的初始化對象,全部不是自己new的,我這里就不去過多講IOC,全部加入Spring,為什么有容器的概念,他存放了對象的一個過程,不用自己去new了,在容器里面有很多對象,如果你不new的話,Spring怎么知道去new這個對象呢,在這里你們就會學到反射機制,你們有沒有看過原理是怎么做的嗎,有沒有誰能知道,SpringIOC使用了反射機制,我們大體說一下步驟是怎么做的呢
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 比如我們在這里寫一個bean對象 xml方式注入bean,他怎么用呢首先我來講一下bean的一個配置,id表示定義的唯一的一個id,這個class寫什么,類的完整路徑,為什么寫完整路徑呢,比如我們的userService我直接寫com.learn.service.impl.UserServiceImpl,記得是要寫完整路徑是不是這樣子,你們只要一看到類的完整路徑的時候,其他都不用想,肯定是用反射,他肯定是通過反射去初始化類的對象我們今天主要是講注入容器的過程--><bean id="userService" class="com.learn.service.impl.UserServiceImpl"><!-- 你們想注入屬性的時候 username,然后寫值--><!-- <property name="username">1234</property> -->
</beans>
package com.learn.service;public interface UserService {public void add();}
package com.learn.service.impl;import com.learn.annotation.ExtResource;
import com.learn.annotation.ExtService;
import com.learn.service.OrderService;
import com.learn.service.UserService;//將該類注入到spring容器里面
/*** 就是UserServiceImpl這樣一個bean* 我們現在使用的都是自定義注解* 只要是加上我們這個自定義注解之后* 那么這個時候他就會去注入bean的* 就會自動去獲取bean* * * @author Leon.Sun**/
@ExtService
public class UserServiceImpl implements UserService {private UserServiceImpl() {/*** 我去打印這樣一段話* 反射肯定是需要走構造函數的* */System.out.println("無參構造函數初始化......反射技術");}// 從Spring容器中讀取bean/*** 為什我加上@ExtResource這么一個注解* 就可以獲取orderServiceImpl這么一個對象* 是不是這樣的* 這就是我要講的原理的過程* 我把這個@ExtService注解給注掉* @ExtResource* private OrderService orderServiceImpl;* 這里還能取到嗎* 還能不能取到* 能不能取到這個對象* 能不能取到OrderService* 肯定取不到* 為什么呢* 我們運行一遍* java.lang.NullPointerException* 是不是報了一個空指針* 我把@ExtService注解一加上去* 一加上去就可以運行了* 看到效果沒有* 我來講一下整個實現原理* 我今天還來講一個知識* 什么知識呢* XML版本的* xml版本的可能稍微簡單點* * * */@ExtResourceprivate OrderService orderServiceImpl;public void add() {/*** 這里會調用addOrder()* 是不是這樣的* * */orderServiceImpl.addOrder();System.out.println("我是使用反射機制運行的方法");}}
package com.learn;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.service.UserService;public class Test002 {public static void main(String[] args) {/*** SpringIOC使用了反射機制* 首先它在這里會去讀取一個配置文件* 讀取完了之后呢* 我會去解析bean的節點* 我會去拿bean的id* 是不是這樣的* 我就可以把所有對象做一個初始化操作* 初始化完畢了以后呢* 別人只要傳入userService這樣的一個bean id* 我就讓他去我的Spring容器去找我的id* 拿到這樣一個對象* 是不是這樣子* 那么這里有很多種做法* 比如我們通過UserService的bean的id* 讓他去Spring的bean的節點去找到這個id* 找到這樣的一個bean id以后* 獲取到這樣的一個class地址* 然后再使用反射機制* 去做這樣的一個初始化* 那么這邊我告訴你們* 解析xml要使用什么技術* 是不是DOM4J* 所以我告訴你們* 像SpringIOC的xml版本* 使用DOM4J加反射技術* 這是我們要說一下的* 可能關于XML解析有很多方式* 你們下去看一下* 我是怎么知道他這里面要用到反射技術呢* 我怎么知道他這個對象一定是反射創建的呢* 怎么做* 大家想一想* 我怎么證明他這個對象一定是通過反射創建出來的* 怎么證明* 有沒有誰能夠想起來的* 無參構造函數* 我在實現類里面一定要寫一下無參構造函數* 運行* 無參構造函數初始化......反射技術* 看到沒有* 無參構造函數初始化 反射技術* 這邊我給你們講一下* * 這個時候我們把構造函數改成私有的* private UserServiceImpl()* 我們要把它設置成私有的構造函數* 看一下這個效果* 運行* 能不能初始化* 照樣可以* 我之前其實講過的* 反射私有化還是可以運行出來的* 之前講過的* 怎么可以設置權限的* 這個其實沒用啊* 這個真沒用* 你的構造函數或者方法私有化* 都能訪問到的* 這個我就不去細說了* 這個過程聊不了解* 了解是吧* 我就花個十分鐘去回顧一下* 就是怎么去解析這個XML* 然后我再給你去講怎么去實現* 我跟你們講一下* 我們可以按照我們自己的實現* 不一定是按照Spring的實現* 我給你寫兩套過程* 一套是什么呢* 一套是XML方式的* 就是他最開始是不會去創建對象* 當你需要的時候* 我才會去初始化對象* 我們寫注解版本的時候* 只要他在調用構造函數的時候* 我就會去初始化這樣的一個bean對象的* * */ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");/*** 這里打印一段話分隔一下* 你們看一下他是怎么實現出來的* 你們有沒有發現相當于一個bean的對象* 你們看一下bean的對象是在什么時候進行初始化的* 就相當于你去加載new ClassPathXmlApplicationContext("spring.xml")這樣的一個構造函數的時候* 他就會怎么樣* 就會去初始化的* 而不是我去取的時候去初始化的* * */System.out.println("################################################################################");/*** 填你的bean id* 就是userServiceImpl*/UserService userService = (UserService) app.getBean("userService");/*** 把class的內存地址打印出來* com.learn.service.impl.UserServiceImpl@d7b1517* 是不是可以拿到class地址* * */System.out.println(userService);}
}
?
總結
以上是生活随笔為你收集整理的springiocxml方式注入对象原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springioc注解版运行效果演示
- 下一篇: dom4kj解析xml