在Spring中当需要实例化第三方类库中的类时,可以使用FactoryMethod或者FactoryBean实现解耦。例如Car是第三方类库中的一个类,当我们需要使用Car对象时,可以有如下几种方式。
Instance Factory Method
-
静态方法
public class StaticFactory { public static Car getInstance() { return new Car(); } }
-
XML配置
<!--静态工厂方法模式配置--> <bean id="car" class="com.sac.factory.StaticFactory" factory-method="getInstance"> </bean>
Instance Factory Method
-
实例方法
public class NoneStaticFactory { public Car getInstance() { return new Car(); } }
-
XML配置
<!--实例工厂方法模式配置--> <bean id="noneStaticFactory" class="com.sac.factory.NoneStaticFactory"></bean> <bean id="car" factory-bean="noneStaticFactory" factory-method="getInstance"></bean>
FactoryBean
-
CarFactoryBean
public class CarFactoryBean implements FactoryBean<Car> { @Override public Car getObject() { return new Car(); } @Override public Class<Car> getObjectType() { return Car.class; } @Override public boolean isSingleton() { return false; } }
-
XML 配置
<bean id="car" class="com.sac.factorybean.CarFactoryBean"></bean>
-
加&与不加&
在使用FactoryBean时,如果想获取FactoryBean的实例则需要在bean名称前添加&,否则获取的是getObject方法中返回的实例。
例如,获取Bean带着&ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); System.out.println(ctx.getBean("&car"));
输出结果
com.sac.factorybean.CarFactoryBean@7d70d1b1
不带着&
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); System.out.println(ctx.getBean("car"));
输出结果
com.sac.bean.Car@7d70d1b1