spring配置详解-属性注入(构造函数)
生活随笔
收集整理的這篇文章主要介紹了
spring配置详解-属性注入(构造函数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
再來看一下構造函數注入,構造函數注入呢,我還是在這個配置文件里演示,構造函數了,我分割一下,華麗的分割線下方,來演示一下構造函數注入,構造函數注入,現在不走set方法了,我是不是要走構造,那走構造的前提,你得有構造,所以先的準備一個帶有參數的構造,選擇生成構造,這個的話咱們這樣,挑一個name,挑一個car,這樣出一個代表,一個是值類型代表,一個是對象類型代表,那接下來看一下,走這個構造,完成對象的創建,為了標識,我把構造函數打印一下,打印出來了,能看到走的他,配置一個還是bean元素,然后name,class,然后看好,我要走構造注入的話,下面這不一樣了,要用constructor-arg,Spring連元素的起名都是這么清晰,你看constructor是不是構造,arg就是arguments參數,叫構造參數,咱們這種情況可以使用到name屬性,value屬性,以及咱們的name屬性,ref屬性,我這么一寫你就明白啥意思了,因為咱們的聲明構造是不是兩個參數,所以咱們添加兩個構造,參數的意思,添加兩個參數,然后第一個參數你看,第一個參數的名字叫name,這里是不是給他一個值,值的名字,比如咱們叫jerry,咱們第二個屬性名是不是叫car,復制變量名到這兒來,ref表示對象的引用,那咱們是不是要把上面的車搞下來,這里是User,這個構造函數寫在User里面,這是咱們創建一個新的User對象,咱們新的User對象是構造函數,聲明兩個參數的構造函數,一個name,一個car,這里咱們應該叫user2
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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"><constructor-arg name="name" value="jerry"></constructor-arg><constructor-arg name="car" ref="car"></constructor-arg></bean></beans>
然后把測試方法復制,然后這個叫user2,那怎么證明他走了構造呢,這會再執行一下,走的是不是構造
@Testpublic void fun2() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/c_injection/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user2");/*** 打印user對象*/System.out.println(u);}
User空參構造方法
User(String name, Car car)
User [name=jerry, age=null, car=Car [name=蘭博基尼, color=黃色]]
這個是不是對構造器打印,再看這個jerry,是不是有值,后面這車是不是還是黃色的車,這個age咱們是沒有注入,構造注入學到這個程度,就夠了嗎,不夠,這怎能夠了呢,看好啊,假設現在構造函數不止這兩個,還有第三個呢,第三個構造呢,我是Car在前,name在后,你看有問題嗎,打印的時候Car在前面name在后,你敢說這兩個是一個構造嗎,顯然不是吧,是不是有可能咱們真正做的時候,構造里面的業務邏輯是不是一樣的,那第二個方法你看,好像這兩個構造函數,從配置上來講,都有一個構造函數的參數叫name,都有一個叫car,只是順序不同而已
package com.learn.bean;/*** @author Leon.Sun*/
public class User {public User() {System.out.println("User空參構造方法");}private String name;private Integer age;private Car car;public User(String name, Car car) {System.out.println("User(String name, Car car)");this.name = name;this.car = car;}public User(Car car, String name) {System.out.println("User(Car car, String name)");this.name = name;this.car = car;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public void init() {System.out.println("我是初始化方法!");}public void destory() {System.out.println("我是銷毀方法!");}public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}@Overridepublic String toString() {return "User [name=" + name + ", age=" + age + ", car=" + car + "]";}}
@Testpublic void fun2() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/c_injection/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user2");/*** 打印user對象*/System.out.println(u);}
User空參構造方法
User(Car car, String name)
User [name=jerry, age=null, car=Car [name=蘭博基尼, color=黃色]]
現在的話走哪個不重要,他走的是Car在前邊,他永遠走的Car在前面,那你怎么指定name在前面呢,介紹另外一個參數,叫做index,你看到名字就知道是索引,剛才Car一直在前面,當我想走name在前面,寫一個0,下面要寫的話你就寫index等于1,name是參數第0個的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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"><constructor-arg name="name" value="jerry" index="0"></constructor-arg><constructor-arg name="car" ref="car" index="1"></constructor-arg></bean></beans>
@Testpublic void fun2() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/c_injection/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user2");/*** 打印user對象*/System.out.println(u);}
這個時候再執行一下Demo,是不是name在前面,看明白啥意思不,那構造函數,那咱們學到這一步,還差啥呢,還差什么呢,我這里又有一個構造,這個構造呢,name在前,但是呢,第一個參數雖然是name,但是類型是Integer,是一個數字,咱們加一個字符串就是String了,你不要管我業務上的意義,那你看我現在要走,我現在想name在第一個,car在第二個,這個構造函數,并且這個類型是Integer類型的,那你看,咱們這個配置是不是又有兩個符合了
package com.learn.bean;/*** @author Leon.Sun*/
public class User {public User() {System.out.println("User空參構造方法");}private String name;private Integer age;private Car car;public User(String name, Car car) {System.out.println("User(String name, Car car)");this.name = name;this.car = car;}public User(Car car, String name) {System.out.println("User(Car car, String name)");this.name = name;this.car = car;}public User(Integer name, Car car) {System.out.println("User(Integer name, Car car)");this.name = name + "";this.car = car;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public void init() {System.out.println("我是初始化方法!");}public void destory() {System.out.println("我是銷毀方法!");}public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}@Overridepublic String toString() {return "User [name=" + name + ", age=" + age + ", car=" + car + "]";}}
第一個參數名為name的,這是不是有兩,是不是都符合,那這種情況下,需要怎么指定,最后有一個屬性type,type這里的話,第一個是Integer類型的,那你就把Integer的完整類名復制,知道啥意思不,這就表示我要走第一個參數名為name,并且類型是Integer類型的,當然這塊的話你得給他整成數字,等下會報錯,因為這里傳參必須是Integer,但是你這里不是Integer,再給他來一個999
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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"><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></beans>
@Testpublic void fun2() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/c_injection/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user2");/*** 打印user對象*/System.out.println(u);}
User空參構造方法
User(Integer name, Car car)
User [name=999, age=null, car=Car [name=蘭博基尼, color=黃色]]
這回再來執行一下,是不是走的Integer這個,名字就叫999,有了這三個屬性,分別是index,type,name,這三個屬性,加一起就可以定位到任何一個構造了,任何一個再復雜的構造,有這三個屬性都可以定位的,這就是構造函數注入,咱們再簡單寫一下,name屬性指定構造函數的參數名,然后index屬性,指定構造函數的參數索引,他所在的索引,然后第三個type是指定什么,構造函數的參數類型,那這樣的話,構造函數注入就給演示完了,就這么多
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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></beans>
?
總結
以上是生活随笔為你收集整理的spring配置详解-属性注入(构造函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring配置详解-属性注入(set方
- 下一篇: spring配置详解-属性注入(p名称空