在Spring中當(dāng)需要實(shí)例化第三方類庫中的類時(shí)幌衣,可以使用FactoryMethod或者FactoryBean實(shí)現(xiàn)解耦。例如Car是第三方類庫中的一個(gè)類郎逃,當(dāng)我們需要使用Car對(duì)象時(shí)哥童,可以有如下幾種方式。
Instance Factory Method
-
靜態(tài)方法
public class StaticFactory { public static Car getInstance() { return new Car(); } }
-
XML配置
<!--靜態(tài)工廠方法模式配置--> <bean id="car" class="com.sac.factory.StaticFactory" factory-method="getInstance"> </bean>
Instance Factory Method
-
實(shí)例方法
public class NoneStaticFactory { public Car getInstance() { return new Car(); } }
-
XML配置
<!--實(shí)例工廠方法模式配置--> <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時(shí)褒翰,如果想獲取FactoryBean的實(shí)例則需要在bean名稱前添加&如蚜,否則獲取的是getObject方法中返回的實(shí)例压恒。
例如,獲取Bean帶著&ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); System.out.println(ctx.getBean("&car"));
輸出結(jié)果
com.sac.factorybean.CarFactoryBean@7d70d1b1
不帶著&
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); System.out.println(ctx.getBean("car"));
輸出結(jié)果
com.sac.bean.Car@7d70d1b1