Spring学习笔记 使用Static Factory(静态工厂类)创建Bean
普通定义Bean并且进行初始化的方法一般通过property(属性)的setter方法或者构造方法进行。例如
<bean id="beanName" class="com.csdn.net.arvin.BeanClass" > <constructor-arg value="***" /> <property name="propertyOne" value="" /></bean>
这种定义创建Bean相当于使用new com.csdn.net.arvin.BeanClass(); 的方法来新建Bean对象。在实际应用中很多情况下还会使用设计模式中的工厂模式来创建对象。使用静态工厂类即调用工厂类中的静态方法,比如public static 类名 getInstance()方法返回根据getInstance()方法内部逻辑判断后创建的我们实际需要的对象。
以下为完整的通过XML配置文件配置,在Spring中使用工厂类创建我们需要的Bean对象的Demo

这样的好处显而易见,即使实际获取的MailConfig类型对象发生了变化,main方法中的代码也不需要进行变动。
代码如下:
MAIN方法类:
package factorybean;import injection.MailConfig;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class FactoryBeanMain{ public static void main(String[] args) { String springConfig = "factorybean/spring-config.xml"; ApplicationContext context = new ClassPathXmlApplicationContext(springConfig); MailConfig mailConfig = context.getBean("mailConfig", MailConfig.class); mailConfig.doIt(); }}
Spring-config.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-3.0.xsd"><bean id="mailConfig" class="factorybean.StaticMailConfigFactory"factory-method="getMailConfig"><constructor-arg value="companyTwo" /></bean></beans>
静态工厂类:
package factorybean;import injection.MailConfig;public class StaticMailConfigFactory{ public static MailConfig getMailConfig(String mailServiceProvider) { if ("companyOne".equals(mailServiceProvider)) return new MailConfigOfCompanyOne(); if ("companyTwo".equals(mailServiceProvider)) return new MailConfigOfCompanyTwo(); return null; }}
MailConfig接口:
package injection;public interface MailConfig{ public void doIt();}实现MailConfig接口的MailConfigOfCompanyOne类 :
package factorybean;import injection.MailConfig;public class MailConfigOfCompanyOne implements MailConfig{ @Override public void doIt() { System.out.print("companyOne's mailConfig is created."); }}
实现MailConfig接口的MailConfigOfCompanyTwo类:
package factorybean;import injection.MailConfig;public class MailConfigOfCompanyTwo implements MailConfig{ @Override public void doIt() { System.out.print("companyTwo's mailConfig is created."); }}