1. 程式人生 > >1.springIOC以及相關的使用

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]]