传统程序中采用new方法和反射机制来实例化对象,在IOC容器中采用.xml中bean的配置数据配合反射机制来实例化bean。Spring IOC实例化Bean的方法有三种:
- 使用构造器实例化bean
- 使用静态工厂实例化bean
- 使用实例工厂实例化bean
下面是三种方法的代码实现:(我的bean类包名为com.yangwan.beans,配置文件为application-config.xml)
- 使用构造器实例化bean
注解:Car有一个带参数的构造函数,在xml文件中对bean进行配置,利用constructor-arg来配置对象的参数。如果使用无参数构造器实例化bean,在类的代码中必须实习类的无参数构造函数,通常情况下,不写构造函数,JVM会自动为对象实现构造函数,如果参数无参数构造器实例化bean,类中重载了构造函数的情况下,必须手动实现无参数构造函数。public class Car { String brand; double price; public Car(String brand,double price){ this.brand = brand; this.price = price; } public void printCarInformation(){ System.out.println("brand: "+this.brand+" price: "+price); } }
.xml配置文件代码,带参数构造器
注解:这里配置带参数的构造器有多种写法,也可以使用index,和name属性。如下:<bean id="car" class="com.yangwan.beans.Car"> <constructor-arg type="double" value="333233"></constructor-arg> <constructor-arg type="String" value="大众"></constructor-arg> </bean>
<bean id="car" class="com.yangwan.beans.Car"> <constructor-arg index="0" value="大众"></constructor-arg> <constructor-arg index="1" value="88888"></constructor-arg> </bean>
使用属性设置也可以实例化bean注解:实现属性的getter & setter方法,通过配置文件中的property属性可以实例化bean。该类重载构造函数是为了实现第三章实例化bean方法的带参数实例化。public class Bicycle { String brand; double price; public Bicycle(){ } public Bicycle(String brand,double price){ this.brand = brand; this.price = price; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public void printBicycleInformation(){ System.out.println("brand: "+this.brand+" price: "+price); } }
<bean id="bicycle" class="com.yangwan.beans.Bicycle"> <property name="brand" value="Ferfly"></property> <property name="price" value="389.4"></property> </bean>
- 使用静态工厂实例化bean
注解:CarFactory中只有一个静态方法,用来返回一个Car实例。package com.yangwan.beans; //静态工厂方法返回实例 public class CarFactory { public static Car getInstance(String brand,double price){ return new Car(brand,price); } }
.xml配置文件代码
注解:静态工厂实例化bean要设置bean对象的factory-method实例bean对象的方法名。bean id="carstaticfactory" class="com.yangwan.beans.CarFactory" factory-method="getInstance"> <constructor-arg index="0" value="奥迪"></constructor-arg> <constructor-arg index="1" value="78872"></constructor-arg> </bean>
- 使用实例工厂实例化bean
package com.yangwan.beans; public class BicycleInstanceFactory { public Bicycle getInstance(String brand,double price){ return new Bicycle(brand,price); } }
.xml配置文件代码
<!-- 定义实例工厂 --> <bean id="bicycleinstancefactory" class="com.yangwan.beans.BicycleInstanceFactory"></bean> <!-- 利用实例工厂创建bean --> <bean id="bicycleinstance" factory-bean="bicycleinstancefactory" factory-method="getInstance"> <constructor-arg index="0" value="HariErfi"></constructor-arg> <constructor-arg index="1" value="899"></constructor-arg> </bean>
- 三种方法的测试函数
package com.yangwan.test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import com.yangwan.beans.Bicycle; import com.yangwan.beans.Car; public class Main { public static void main(String[] args) { Resource resource = new FileSystemResource("src/main/resources/spring/application-config.xml"); BeanFactory beanFactory = new XmlBeanFactory(resource); Car tempCar = beanFactory.getBean("car",Car.class); tempCar.printCarInformation(); Bicycle bicycle = beanFactory.getBean("bicycle",Bicycle.class); bicycle.printBicycleInformation(); Car carTemp = beanFactory.getBean("carstaticfactory",Car.class); carTemp.printCarInformation(); Bicycle bicycleTemp = beanFactory.getBean("bicycleinstance",Bicycle.class); bicycleTemp.printBicycleInformation(); } }