1.springIOC以及相關的使用
新建工程,匯入jar,新增spring配置檔案(配置檔案xxxx.xml)!
1.Helloword實現
Helloword.java
public class HelloWord { private String name; public void hello(){ System.out.println("Hello:" + name); } public String getName() { return name; } public void setName(String name) { System.out.println("setname..."); this.name = name; } public HelloWord() { System.out.println("con.."); } }
applicationContext.xml
<!-- HelloWord --> <!-- 配置Bean class:是利用反射的原理,通過全類名方式在IOC容器中建立Bean,所以要求Bean必須有無參的構造器 id:標識容器中的Bean,id的值唯一
--> <!-- 屬性注入 --> <bean id="helloword" class="com.MrChengs1.HelloSpring.HelloWord"> <property name="name" value="spring"></property> </bean>
測試
//1建立Spring的IOC容器物件
//ApplicationContext代表IOC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//注意:此時setter方法和無參的構造器已經被呼叫了
//2.IOC容器獲得Bean實列
//getBean獲得的是配置檔案的 id的值
//利用id定位到容器中的Bean
HelloWord helloWord = (HelloWord) ctx.getBean("helloword");
//利用型別得到IOC中的Bean
//該方法不需要進行強制轉換,但是如果我們有兩個class類在Helloword的話,即在配置檔案中,例項化兩個HelloWord類,此時不知道返回哪一個類
//HelloWord helloWord = ctx.getBean(HelloWord.class);
//3.呼叫hello方法
helloWord.hello();
con..
setname...
Hello:spring
SpringIoc:IOC(控制反轉)
是一個比較抽象的概念,是spring框架的核心,用來消減計算機程式的耦合問題。
物件的例項不在由呼叫者進行建立,交給spring容器來建立。
spring容器負責控制程式之間的關係,而不是直接由呼叫者的程式程式碼直接控制。
這樣控制權由呼叫者轉到spring容器,控制權發生了翻轉-----spring的控制反轉
Dependency Injection:DI(依賴注入)
是IOC的另一個說法,從不同的角度描述相同的概念。
spring容器負責將依賴的物件賦給呼叫者的成員變數,相當於為呼叫者注入他所依賴的例項。
2.屬性注入
利用java Bean規範所定義的setter方法來完成注入,靈活性且可讀性高。
反射機制實現的。
<property name=".." value=".."></property>
<!-- 屬性注入 --> <bean id="helloword" class="com.MrChengs1.HelloSpring.HelloWord"> <property name="name" value="spring"></property> </bean>
3.構造器注入
由java反射機制,通過構造方法完成相關的依賴注入。
car.java
public class car { private String brand; private String corp; private double price; private int maxSpeech;
public car(String brand, String corp, double price) { super(); this.brand = brand; this.corp = corp; this.price = price; } public car(String brand, String corp, int maxSpeech) { super(); this.brand = brand; this.corp = corp; this.maxSpeech = maxSpeech; } public car() { super(); // TODO Auto-generated constructor stub } public car(String brand, String corp, double price, int maxSpeech) { super(); this.brand = brand; this.corp = corp; this.price = price; this.maxSpeech = maxSpeech; }
//setter..... }
applicationContext.xml
使用<constructor-arg value="..." index="..."></constructor-arg>
constructor-arg:元素用於定義構造器方法的引數
index:用於指定引數的位置,預設從零開始
value:對屬性進行賦值
<!-- 構造器注入
使用構造器方法可以指定引數的位置和型別,以區分過載構造器
--> <bean id="car" class="com.MrChengs1.HelloSpring.car"> <constructor-arg value="LeiNuo" index="0"></constructor-arg> <constructor-arg value="shanghai" index="1"></constructor-arg> <constructor-arg value="300" index="2"></constructor-arg> </bean>
測試:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
car car = (com.MrChengs1.HelloSpring.car) ctx.getBean("car");
System.out.println(car.toString());
car [brand=LeiNuo, corp=shanghai, price=0.0, maxSpeech=300]
注意此時構造器有多個,index會自動匹配資料的;
此時index=2,value=300,自動匹配 public car(String brand, String corp, int maxSpeech)
4.CDATA的使用
CDATA 指的是不應由 XML 解析器進行解析的文字資料(Unparsed Character Data)
即把所有的特殊字元都可以轉為純文字的方式進行輸出。
語法:<![CDATA[ 字元 ]]>
<bean id="car1" class="com.MrChengs1.HelloSpring.car"> <constructor-arg value="AoDI" index="0"></constructor-arg> <constructor-arg index="1"><value><![CDATA[<shanghai>]]></value></constructor-arg> <constructor-arg index="2" type="int"><value>245</value></constructor-arg> </bean>
測試:
car car1 = (com.MrChengs1.HelloSpring.car) ctx.getBean("car1"); System.out.println(car1.toString());
car [brand=AoDI, corp=<shanghai>, price=0.0, maxSpeech=245]
此時可以看到"<>"也進行純文字的輸出!
5.引入其他的bean/內部bean
內部Bean:就是在bean標籤裡面的bean,內部Bean不可以被外部bean引用
注:內部bean不需要進行寫id,內部bean外部的bean不能引用
ref:引用其他的bean
Person.java
public class Person { private String name; private int age; private car car;public Person(String name, int age, com.MrChengs1.HelloSpring.car car) { super(); this.name = name; this.age = age; this.car = car; } public Person() { super(); } //setter.... }
1).使用屬性注入
applicationContext.xml
<!-- 引用其他的bean 屬性注入--> <bean id='person' class="com.MrChengs1.HelloSpring.Person"> <property name="name" value="Tom"></property> <property name="age" value="18"></property>
<!--引用其他bean --> <!-- <property name="car"><ref bean="car"/></property> --> <!-- <property name="car" ref="car1"></property> --> <!-- 內部bean --> <property name="car"> <bean class="com.MrChengs1.HelloSpring.car"> <constructor-arg value="Ford" index="0"></constructor-arg> <constructor-arg value="beijing" index="1"></constructor-arg> <constructor-arg value="100000" index="2"></constructor-arg> </bean> </property> </bean>
測試:
Person p = (Person) ctx.getBean("person"); System.out.println(p);
Person [name=Tom, age=18, car=car [brand=Ford, corp=beijing, price=0.0, maxSpeech=100000]]
2).構造器注入
applicationContext.xml
<!-- 引用其他的bean 構造器注入--> <bean id="person1" class="com.MrChengs1.HelloSpring.Person" > <constructor-arg value="Jerry"></constructor-arg> <constructor-arg value="34"></constructor-arg> <constructor-arg ref="car"></constructor-arg> </bean>
測試:
Person p1 = (Person) ctx.getBean("person1"); System.out.println(p1);
Person [name=Jerry, age=34, car=car [brand=LeiNuo, corp=shanghai, price=0.0, maxSpeech=120]]
6.null和級聯屬性
applicationContext.xml
<!-- 測試null 和 級聯屬性 --> <bean id="person2" class="com.MrChengs1.HelloSpring.Person" > <constructor-arg value="Bob"></constructor-arg> <constructor-arg value="32"></constructor-arg> <!-- null --> <!-- <constructor-arg ><null/></constructor-arg> --> <!-- 級聯 此時沒有maxSpeech的值--> <!-- 屬性需要先初始化,後才可以為其級聯屬性賦值 --> <constructor-arg ref="car"></constructor-arg> <property name="car.maxSpeech" value="120"></property> </bean>
測試:
Person p2 = (Person) ctx.getBean("person2"); System.out.println(p2);
Person [name=Bob, age=32, car=car [brand=LeiNuo, corp=shanghai, price=0.0, maxSpeech=120]]