1. 静态工厂创建Bean
1 |
|
1 | /** 静态工厂类 */ |
1 | <bean id="car1" class="bean.CarStaticFactory" |
1 |
|
运行。可知通过静态工厂类创建Bean的原理是:直接调用静态方法
- 调用CarStaticFactory.getCart1()
- 调用CarStaticFactory.getCart2(name, price)
2. 实例工厂
1 | public class CarInstanceFactory { |
1 | <!-- 先注册实例工厂类 --> |
1 |
|
运行。可知通过实例工厂类创建Bean的原理是:
- 先注册实例工厂类到IOC容器,即IOC容器创建时,会先创建一个工厂类实例
- 有了工厂类实例之后,会调用工厂方法,创建对应的Bean
3. FactoryBean工厂接口
1 | package bean; |
1 | <bean id="carFactoryBeanImpl" class="bean.CarFactoryBeanImpl"/> |
1 |
|
3.1. 单例与多例
实现FactoryBean接口时,isSingleton() 决定了对象是单例还是多例1
2
3
4
5/** 创建的对象是单例还是多例 */
public boolean isSingleton() {
return true;
}
运行测试方法,可知单例模式下,从工厂中取出的是同一对象。但是与scope="singleton" 不同之处在于,只有你去取对象时,才会被实例化1
2
3
4
5
6
7
8
9
10
public void test() throws Exception {
// 在ioc创建时,car没有被实例化
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
// 在第1次获取Bean时,car才被实例化
Car car1 = (Car) ioc.getBean("carFactoryBeanImpl");
Car car2 = (Car) ioc.getBean("carFactoryBeanImpl");
// true
System.out.println(car1 == car2);
}
修改为多例1
2
3
4
public boolean isSingleton() {
return false;
}
1 |
|