版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011171125/article/details/85715123
配置Bean的形式
- 基于XML文件的方式
- 基于注解的方式
Bean的配置方式
- 通过全类名(反射)
- 通过工厂方法(静态工厂方法和实例工厂方法)
- FactoryBean
静态工厂方法
静态工厂方法创建Bean是将对象的创建过程封装到静态方法中,客户端需要是只需要简单的调用就行,而不需要关心创建对象的细节
- 需要在Bean的class属性中指定拥有该工厂方法的类,同时再
factory-method
属性中指定工厂方法的名称,使用<constructor-arg>
元素设置传入的参数。 - 创建一个静态工厂类
StaticCarFactory.java
和Car.java
/** * 静态工厂方法:直接调用某一个类的静态方法就可以返回bean的实例 * @author Stark * */ public class StaticCarFactory { private static Map<String, Car> cars = new HashMap<String, Car>(); static{ cars.put("audi", new Car("audi",300000)); cars.put("ford", new Car("ford",300000)); } // 静态工厂方法 public static Car getCar(String name){ return cars.get(name); } } public class Car { private String brand; private double 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; } @Override public String toString() { return "Car [brand=" + brand + ", price=" + price + "]"; } public Car(){ System.out.println("Car's constructor...."); } public Car(String brand, double price) { super(); this.brand = brand; this.price = price; } }
- 创建一个
beans-factory.xml
配置文件<!-- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例 --> <!-- class属性:指向静态工厂方法的全类名 factory-method: 指向静态工厂方法的名字 constructor-arg: 如果工厂方法需要传入参数,则使用constructor-arg 来配置参数 --> <bean id="car1" class="com.fafa.spring.beans.factory.StaticCarFactory" factory-method="getCar"> <constructor-arg value="audi"></constructor-arg> </bean>
- 创建一个
Main
函数进行测试:
测试结果:public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:beans-factory.xml"); Car car1 = (Car) ctx.getBean("car1"); System.out.println(car1); } }
Car [brand=audi, price=300000.0]
显而易见该方式是从静态方法中获取的值
实例工厂方法
实例工厂方法是将对象的创建过程封装到另一个对象实例的方法里,客户端需要时可直接调用
- 先创建一个实例工厂类
InstanceCarFactory.java
/** * 实例工厂方法:实例工厂的方法,即现需要创建工厂的本身,再调用工厂的实例方法来返回bean的实例 * @author Stark * */ public class InstanceCarFactory { private Map<String, Car> cars = null; public InstanceCarFactory() { cars = new HashMap<String, Car>(); cars.put("audi", new Car("audi", 300000)); cars.put("ford", new Car("ford", 300000)); } public Car getCar(String brand) { return cars.get(brand); } }
- 再在xml配置文件中配置工厂实例
<!-- 配置工厂的实例 --> <bean id="carFactory" class="com.fafa.spring.beans.factory.InstanceCarFactory"></bean>
- 创建一个bean,使用
factory-bean
属性来指向工厂实例bean,factory-method
指向工厂方法的名称,constructor-arg
传入工厂方法的参数(可选)
测试结果:<!-- 通过实例工厂的方法来配置bean --> <!-- factory-bean: 指向实例工厂方法的bean factory-method: 指向实例工厂方法的名字 constructor-arg: 如果工厂方法需要传入参数,则使用constructor-arg 来配置参数 --> <bean id="car2" factory-bean="carFactory" factory-method="getCar"> <constructor-arg value="ford"></constructor-arg> </bean>
Car [brand=ford, price=300000.0]
容器初始化的时候InstanceCarFactory
被实例化了,因此car2在指向carFactory
bean的时候直接调用getCar
方法获取对应的car。