spring配置详解-属性注入(p名称空间SPEL表达式)
生活随笔
收集整理的這篇文章主要介紹了
spring配置详解-属性注入(p名称空间SPEL表达式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
所謂了解的話講了一般是不會用的,看一下了解的注入方式,還有一種叫p名稱空間注入方式,是Spring最近發出來的,因為Bean注入方式已經深入人心了,所以后面這兩種注入方式,哪怕是好,也不愿意去用,因為之前的方式足夠了,而且好使,所以新的話一直推廣不開,來看一下吧,第一個p名稱空間注入,你要玩的話,你得先做一個準備工作,首先你要導入p名稱空間,xml的名稱空間,看好怎么操作的,復制這一行,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"下面粘貼一下,然后你復制這一行當然要改啊,把這一段復制,http://www.springframework.org/schema/,粘貼到這個位置,xmlns:xsi="http://www.springframework.org/schema/",后面加一個p,xmlns:xsi="http://www.springframework.org/schema/p",前面冒號也加個p,xmlns:p="http://www.springframework.org/schema/p",這樣的話,就導入了咱們的p名稱空間,然后呢,導入好p名稱空間之后,接下來還是要配置一個user,咱們來一個user3,然后p名稱空間怎么注入呢,你直接通過屬性就可以完成全部屬性的注入,在這里加上p冒號,然后這里有提示,p:name,這里表示我要給name屬性注入,然后后面直接填寫你要注入的值就可以了,比如咱們要注入名字為jack,他有個age屬性,age怎么注入,p冒號age,這個等于,jack大點20,然后還有一個類型,對象類型的car,p冒號car,但是car后面要加一個ref,你要看懂這個是啥意思,ref就是reference,那這塊就填寫你要注入的對象,這個Car對象,兩個值類型,和一個引用類型了,那這個就是p名稱空間注入,書寫格式都是p冒號,我把這個步驟寫一下,導入p名稱空間,你把這一行復制粘貼到筆記上,xmlns:p="http://www.springframework.org/schema/p",然后第二步,使用p冒號這一種屬性,完成注入,冒號屬性又分為兩種情況,值類型,那這個寫法就是,p冒號屬性名,等于值,然后還有一種類型是什么,對象類型,對象類型就是p冒號屬性名,然后杠ref,等于咱們的bean名稱,p名稱注入介紹完了,其實p名稱對象注入,本質其實它是怎么注入的,其實它還是走set方法,他還是走set方法,其實走還是走set方法,只不過這種寫法是Spring發明的,可以減少傳統的property寫法,但是外面開發的一般不太接受,也沒關系的,其實本質也都一樣的,那接下來咱們來看一下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "><!-- set方式注入 --><bean name="user" class="com.learn.bean.User"><!-- 為User對象中名為name的屬性注入tom作為值 --><property name="name" value="tom"></property><property name="age" value="18"></property><!-- 為car屬性注入下方配置的car對象 --><property name="car" ref="car"></property></bean><!-- 將car對象配置到容器中 --><bean name="car" class="com.learn.bean.Car"><property name="name" value="蘭博基尼"></property><property name="color" value="黃色"></property></bean><!-- ============================================================= --><!-- 構造函數注入 --><bean name="user2" class="com.learn.bean.User"><!-- name屬性:構造函數的參數名 --><!-- index屬性:構造函數的參數索引 --><!-- type屬性:構造函數的參數類型 --><constructor-arg name="name" value="999" index="0" type="java.lang.Integer"></constructor-arg><constructor-arg name="car" ref="car" index="1"></constructor-arg></bean><!-- ============================================================= --><!-- p名稱空間注入 1.導入p名稱空間 xmlns:p="http://www.springframework.org/schema/p"2.使用p:屬性完成注入|-值類型: p:屬性名="值"|-對象類型: p:屬性名-ref="bean名稱"--><bean name="user3" class="com.learn.bean.User" p:name="jack" p:age="20" p:car-ref="car"></bean>
</beans>
獲得一個對象,user3,然后看一下user3是不是20歲的jack
@Testpublic void fun3() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/c_injection/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user3");/*** 打印user對象*/System.out.println(u);}
User空參構造方法
User(Integer name, Car car)
User空參構造方法
User [name=jack, age=20, car=Car [name=蘭博基尼, color=黃色]]
是不是注入成功了,第二種方案,接下來看第四種方式,第四種方式的話,咱們最后一種方式,SPEL注入,全寫是Spring Expression Language,Spring研發出來的腳本表達式語言,Spring表達式語言,那這種語言的話,其實感覺理論上來講,有點像以前用過的EL,還有咱們的OGNL寫法,感受一下看看,還是來一個bean,user4就好了,實際上他這種寫法是基于咱們的,像什么property注入啊,基于咱們的set方法注入,基于咱們的構造函數注入,都是可以在這兩種注入的基礎上,使用咱們的SPEL的,看是啥意思,來一個property,name等于name,然后呢,value等于,在這的話,可以使用,使用井號,井號大括號,這個是一個固定的格式寫法,你要這么寫的話,表示在這里要寫SPEL表達式了,就好像你在JSP再搞一個,是不是搞一個${},說明你要寫EL表達式一個意思,跟EL表達式,這怎么搞呢,比如說,當你需要這種需求的時候,比如我先做user4的名字,我想取user1的名字,作為user4的名字,那你就可以寫,user.name,看明白啥意思不,這個user就會去找你這個user對象,點name就是去找user的name屬性,取出這個值,作為咱們user4的name,看明白啥意思不,然后呢,age是不是也是同理,age的話你也可以寫這種形式,age咱們取user3,user3的age屬性,回寫吧,user3點age,這樣的話就可以動態去取了,然后呢最后一個,引用類型,咱們來一個car,這個引用類型注意,不允許你使用,因為也沒必要用,這個對象的名字,這個是不支持SPEL的,別寫一個井號大括號car,反而報錯,這樣的話就可以取值類型的,取其他對象的值類型,那這樣的話,user4一會要打印出來的話,他的名字應該叫什么來的,tom,是不是20歲,jack的歲數是20歲,tom的名字,tom 20歲,有輛蘭博基尼,咱們打印咱們的user4
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "><!-- set方式注入 --><bean name="user" class="com.learn.bean.User"><!-- 為User對象中名為name的屬性注入tom作為值 --><property name="name" value="tom"></property><property name="age" value="18"></property><!-- 為car屬性注入下方配置的car對象 --><property name="car" ref="car"></property></bean><!-- 將car對象配置到容器中 --><bean name="car" class="com.learn.bean.Car"><property name="name" value="蘭博基尼"></property><property name="color" value="黃色"></property></bean><!-- ============================================================= --><!-- 構造函數注入 --><bean name="user2" class="com.learn.bean.User"><!-- name屬性:構造函數的參數名 --><!-- index屬性:構造函數的參數索引 --><!-- type屬性:構造函數的參數類型 --><constructor-arg name="name" value="999" index="0" type="java.lang.Integer"></constructor-arg><constructor-arg name="car" ref="car" index="1"></constructor-arg></bean><!-- ============================================================= --><!-- p名稱空間注入 1.導入p名稱空間 xmlns:p="http://www.springframework.org/schema/p"2.使用p:屬性完成注入|-值類型: p:屬性名="值"|-對象類型: p:屬性名-ref="bean名稱"--><bean name="user3" class="com.learn.bean.User" p:name="jack" p:age="20" p:car-ref="car"></bean><!-- ============================================================= --><!-- spel注入:spring Expression Language spring表達式語言 --><bean name="user4" class="com.learn.bean.User" ><property name="name" value="#{user.name}"></property><property name="age" value="#{user3.age}"></property><property name="car" ref="car"></property></bean>
</beans>
@Testpublic void fun4() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/c_injection/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user4");/*** 打印user對象*/System.out.println(u);}
User空參構造方法
User(Integer name, Car car)
User空參構造方法
User空參構造方法
User [name=tom, age=20, car=Car [name=蘭博基尼, color=黃色]]
錯誤信息要看描述,尤其我們要養成會看錯誤的情況,他這個錯首先是BeanCreationException,Bean的創建異常,Error creating bean with "user4",創建名字為user4的對象,失敗,為啥失敗了呢,Failed to convert propertyvalue of type to ... car.他這里說不能夠轉換,Failed是失敗,convert是不是轉換呢,失敗的轉換,轉換什么呢,String類型,變成什么類型,變成Car類型,那我們類型的時候指定錯了,那你看一下剛才的配置當中,這里應該是ref,對不,明白啥意思不,咱們剛才用的value屬性忘改了,所以他這里報的異常,字符串轉成Car轉不了,明白這個異常啥意思,那這樣的話這個錯誤解決之后,再來執行一下,咱們現在是不是tom,20歲,這樣的話這是咱們的SPEL注入
?
總結
以上是生活随笔為你收集整理的spring配置详解-属性注入(p名称空间SPEL表达式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring配置详解-属性注入(构造函数
- 下一篇: spring配置详解-复杂类型注入