Spring学习笔记 使用Static Factory(静态工厂类)创建Bean
2012-07-11 22:33
603 查看
普通定义Bean并且进行初始化的方法一般通过property(属性)的setter方法或者构造方法进行。例如
[html] view
plaincopy
<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方法类:
[java] view
plaincopy
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:
[html] view
plaincopy
<?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>
静态工厂类:
[java] view
plaincopy
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接口:
[java] view
plaincopy
package injection;
public interface MailConfig
{
public void doIt();
}
实现MailConfig接口的MailConfigOfCompanyOne类 :
[java] view
plaincopy
package factorybean;
import injection.MailConfig;
public class MailConfigOfCompanyOne implements MailConfig
{
@Override
public void doIt()
{
System.out.print("companyOne's mailConfig is created.");
}
}
实现MailConfig接口的MailConfigOfCompanyTwo类:
[java] view
plaincopy
package factorybean;
import injection.MailConfig;
public class MailConfigOfCompanyTwo implements MailConfig
{
@Override
public void doIt()
{
System.out.print("companyTwo's mailConfig is created.");
}
}
[html] view
plaincopy
<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方法类:
[java] view
plaincopy
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:
[html] view
plaincopy
<?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>
静态工厂类:
[java] view
plaincopy
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接口:
[java] view
plaincopy
package injection;
public interface MailConfig
{
public void doIt();
}
实现MailConfig接口的MailConfigOfCompanyOne类 :
[java] view
plaincopy
package factorybean;
import injection.MailConfig;
public class MailConfigOfCompanyOne implements MailConfig
{
@Override
public void doIt()
{
System.out.print("companyOne's mailConfig is created.");
}
}
实现MailConfig接口的MailConfigOfCompanyTwo类:
[java] view
plaincopy
package factorybean;
import injection.MailConfig;
public class MailConfigOfCompanyTwo implements MailConfig
{
@Override
public void doIt()
{
System.out.print("companyTwo's mailConfig is created.");
}
}
相关文章推荐
- Spring学习笔记 使用Static Factory(静态工厂类)创建Bean
- Spring学习笔记 使用Non-Static Factory(非静态工厂类)创建Bean
- Spring学习笔记(四) JavaConfig创建Bean与AOP编程相结合的Demo
- spring in action 学习笔记(三)通过工厂方法创建bean
- Spring学习笔记 关于Spring创建Bean的模式-Singleton(单例模式)和Prototype
- Java框架spring 学习笔记(十):bean管理(注解和配置文件混合使用)
- Spring学习笔记 关于Bean定义的重用-使用abstract以及parent标签属性
- Spring学习(三)使用Spring容器创建bean
- Spring学习笔记 关于Bean定义的重用-使用abstract以及parent标签属性
- Spring学习笔记 —— AOP(面向切面编程) 之使用ProxyFactoryBean实现AOP
- 【spring学习笔记一】使用xml文件配置bean
- Spring学习笔记 使用annotation配置实现Bean的auto-wiring (自动绑定)
- spring学习笔记(12)——使用注解方式配置bean
- Spring学习笔记--通过构造方法创建Bean
- Spring 学习笔记2 - Bean的定义与Ioc的使用
- Spring学习笔记 关于Spring创建Bean的模式-Singleton(单例模式)和Prototype
- 【Spring学习笔记】之【5.4 Bean中使用EL】
- Spring学习笔记 创建自动扫描并注入的bean
- Spring入门学习——使用Spring的FactoryBean创建Bean
- Spring学习笔记 关于FactoryBean接口的使用