赞
踩
IoC通过工厂模式创建bean有两种方式:
1、静态工厂方法
2、实例工厂方法
区别:静态工厂类不需要实例化,实例工厂类需要实例化
静态工厂类加工Car对象是用的类方法static方法,不需要创建工厂对象;实例工厂类加工Car对象使用的是工厂对象的构造方法,需要创建工厂对象
1、创建Car类
2、创建静态工厂类、静态工厂方法
3、xml
不能这么写,这样就是普通的车,不是被工厂加工了的车。而且报错,因为有参构造会把无参构造覆盖掉
正确方法:
<?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 id="car1" class="com.lmh.factory.StaticCarFactory" factory-method="getCar">
<constructor-arg value="1"></constructor-arg>
</bean>
<bean id="car2" class="com.lmh.factory.StaticCarFactory" factory-method="getCar">
<constructor-arg value="2"></constructor-arg>
</bean>
</beans>
factory-method 指向静态方法。
constructor-arg 的value属性是调用静态方法传入的参数。
1、创建实例工厂类、工厂方法
2、Spring.xml
<!-- 实例工厂-->
<!-- 实例工厂类的对象-->
<bean id="instanceCarFactory" class="com.lmh.factory.InstanceCarFactory">
</bean>
<!--Car对象,通过调用实例工厂 对象(factory-bean) 的getCar方法 获取 -->
<bean id="car_1" factory-bean="instanceCarFactory" factory-method="getCar">
<constructor-arg value="1"></constructor-arg>
</bean>
<bean id="car_2" factory-bean="instanceCarFactory" factory-method="getCar">
<constructor-arg value="2"></constructor-arg>
</bean>
3、测试一下
//实例化工厂类
InstanceCarFactory instanceCarFactory = new InstanceCarFactory();
Car car = instanceCarFactory.getCar(1);
System.out.println(car);
//IoC实例化工厂方法
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_factory.xml");
Car car1 = (Car) applicationContext.getBean("car_1");
Car car2 = (Car)applicationContext.getBean("car_2");
System.out.println(car1);
System.out.println(car2);
区别:静态工厂方法 加工Car对象是用的类方法static方法,不需要创建工厂对象;实例工厂方法 加工Car对象使用的是工厂对象的构造方法,需要创建工厂对象
静态工厂方法在Spring.xml中只需配置一个bean,即最终的结果Car即可。
而实例工厂方法在Spring.xml中需要配置两个bean。 一个是工厂的bean,再根据工厂的bean得到Car的bean(对象)。因为getCar()方法是非static的,需要用对象调用。
spring.xml 中 class + factory-method的形式是直接调用类中的工厂方法。
– 静态工厂
<bean id="car1" class="com.lmh.factory.StaticCarFactory" factory-method="getCar"></bean>
spring.xml中factory-bean + factory-method的形式则是调用工厂bean 中的工厂方法,就必须先创建工厂bean,再得到Car的Bean。
– 实例工厂
<bean id="car_1" factory-bean="instanceCarFactory" factory-method="getCar">
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。