容纳你的bean
bean工厂:最简单的容器,提供了基础的依赖注入支持。创建各种类型的Bean。
应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务。
bean工厂介绍
工厂设计模式,创建分发各种bean。配置好它们之间的协作关系,参与bean的生命周期。
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
bean工厂只把bean的定义信息加载进来,用到的时候才实例化。
factory.getBean("mybean");就可得到一个bean
静态工厂方法实例
package com.test.srping.bean.factory; import java.util.HashMap; import java.util.Map; //静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例 public class StaticCarFactory { private static Map<String,Car> cars = new HashMap<String,Car>(); static{ cars.put("baoma", new Car("BaoMa",3000000)); cars.put("benci", new Car("BenCi",1000000)); } public StaticCarFactory(){ System.out.println("静态工厂方法构造函数被调用-StaticCarFactory"); } //静态工厂方法,不需要创建staticCarFactory对象情况下,通过该方法就可以得到对应的实例 public static Car getCar(String brand){ return cars.get(brand); } }
实例工厂方法实例
package com.test.srping.bean.factory; import java.util.HashMap; import java.util.Map; //实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 返回bean的实例 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",400000)); System.out.println("实例工厂方法构造函数被调用-InstanceCarFactory"); } public Car getCar(String brand){ return cars.get(brand); } }
package com.test.srping.bean.factory; 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(String brand, double price) { super(); this.brand = brand; this.price = price; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例, 且注意对应类是包含静态工厂方法的类 class属性:指向静态工厂方法的全类名 factory-method:指向静态工厂方法中的名字 constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数 --> <bean id="car1" class="com.test.srping.bean.factory.StaticCarFactory" factory-method="getCar"> <constructor-arg value="baoma"></constructor-arg> </bean> <!-- 1.配置工厂的实例 --> <bean id="carFactory" class="com.test.srping.bean.factory.InstanceCarFactory"></bean> <!-- 2.通过实例工厂来配置bean class属性:指向实例工厂方法的全类名 factory-method:指向实例工厂方法的名字 constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数 --> <bean id="car2" factory-bean="carFactory" factory-method="getCar"> <constructor-arg value="ford"></constructor-arg> </bean> </beans>
package com.test.srping.bean.factory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /* * 1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例) 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法, 而不关心创建对象的细节。 要声明通过静态方法创建bean: 1.需要在bean的class属性里指定拥有该方法的类, 2.同时在factory-method属性里指定工厂方法的名称, 3.最后,使用<constrctor-arg>元素为该方法传递方法参数。 */ //spring通过工厂方法配置Bean public class Mainfactory { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml"); //静态工厂方法测试: Car car1 = (Car) ctx.getBean("car1"); System.out.println(car1); //实例工厂方法测试: Car car2 = (Car) ctx.getBean("car2"); System.out.println(car2); } }
运行结果
实例工厂方法构造函数被调用-InstanceCarFactory
Car [brand=BaoMa, price=3000000.0]
Car [brand=Ford, price=400000.0]
实例工厂方法在加载过程中对象被创建,静态工厂方法没有被创建直接被调用
--------------------------------------------------------------------------------------------
通过实现FactoryBean接口来配置bean
package com.test.spring.bean.factorybean; import org.springframework.beans.factory.FactoryBean; //自定义的Factory需要实现FactoryBean接口 public class CarFactoryBean implements FactoryBean<Car>{ private String brand; public void setBrand(String brand) { this.brand = brand; } //返回bean的对象 public Car getObject() throws Exception { return new Car(brand,500000); } //返回的bean的类型 public Class<?> getObjectType() { return Car.class; } //是否是单例的 public boolean isSingleton() { return true; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 通过FactoryBean来配置Bean的实例 class:指向FactoryBean的全类名 property:配置FactoryBean的属性 注意:实际返回的实例是FactoryBean的getObject()方法返回的实例 --> <bean id="car1" class="com.test.spring.bean.factorybean.CarFactoryBean"> <property name="brand" value="BMW"></property> </bean> </beans>
package com.test.spring.bean.factorybean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例) 实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。 1.先声明实例工厂类的bean 声明通过实例工厂方法创建的bean: 2.在bean的factory-bean属性里指定拥有该该工厂方法的bean 3.在factory-method属性里指定该工厂方法的名称。 4.使用constructor-arg元素为工厂方法传递方法参数。 * */ //通过FactoryBean来配置Bean public class MainFactoryBean { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml"); Car car = (Car) ctx.getBean("car1"); System.out.println(car); } }