在spring的IOC容器中配置Bean
一,在xml中通過bean節點來配置bean:
class:bean的類名,通過反射的方式在IOC容器中建立Bean,所以要求bean中必須有無參的構造器
id:標識容器中的bean,id唯一
在IOC容器讀取bean配置建立Bean例項之前,必須對他進行初始化,只有例項化之後,才可以從IOC容器獲取bean例項並使用。
spring提高了兩種型別的IOC實現。
applicationContext主要實現類:
applicationContext在初始化上下文的shi'h就例項化所有單例的bean。
從IOC容器獲取bean的方式:
//利用ID定位到IOC容器的bean HelloWord helloword=(HelloWord) ctx.getBean("helloWord");//getBean裡面的引數是配置的bean的ID //利用型別返回IOC容器中的bean,但要求該容器中只能有一種該型別的bean HelloWord helloword2=(HelloWord) ctx.getBean(HelloWord.class);//getBean裡面的引數是配置的bean的ID
spring依賴注入的三種方式:
1,屬性注入
2,構造器注入,
3,工廠方法注入(很少使用,不推薦)
第二種方法:
例子:
建立一個car類:下面有兩個過載的構造方法。
package com.spring.beans; public class Car { private String brand; private String crop; private int price; private double maxSpeed; public Car(String brand, String crop, int price) { super(); this.brand = brand; this.crop = crop; this.price = price; } public Car(String brand, String crop, double maxSpeed) { super(); this.brand = brand; this.crop = crop; this.maxSpeed = maxSpeed; } @Override public String toString() { return "Car [brand=" + brand + ", crop=" + crop + ", price=" + price + ", maxSpeed=" + maxSpeed + "]"; } }
新增配置:通過constructor-arg配置value,分別對應構造方法裡面的引數。
由於上面的類有兩個構造方法,使用構造器注入屬性值可以指定引數的位置和引數型別,用以區分過載的構造器。
<!-- 通過構造方法配置bean的屬性 --> <bean id="car" class="com.spring.beans.Car" > <constructor-arg value="Audi" index="0"></constructor-arg> <constructor-arg value="shanghai" index="1"></constructor-arg> <constructor-arg value="3000" index="2" type="double"></constructor-arg> </bean> <!-- 使用構造器注入屬性值可以指定引數的位置和引數型別,用以區分過載的構造器--> <bean id="car2" class="com.spring.beans.Car" > <constructor-arg value="Audi" index="0" type="java.lang.String"></constructor-arg> <constructor-arg value="shanghai" index="1" type="java.lang.String"></constructor-arg> <constructor-arg value="200" index="2" type="int"></constructor-arg> </bean>
在main方法裡面使用:把car列印出來(呼叫car的tostring方法)
//1,建立spring的IOC容器物件 //ApplicationContext代表IOC容器 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");//指定配置檔名 Car car=(Car) ctx.getBean("car"); Car car2=(Car) ctx.getBean("car2"); System.out.println(car); System.out.println(car2);
結果:
上面的配置出來這個寫法,還可以寫成value子節點的形式:
<bean id="car2" class="com.spring.beans.Car" > <constructor-arg value="Audi" index="0" type="java.lang.String"></constructor-arg> <constructor-arg value="shanghai" index="1" type="java.lang.String"></constructor-arg> <constructor-arg type="double"> <value>250</value> </constructor-arg> </bean>