`
wanxiaotao12
  • 浏览: 456219 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring工厂方法

 
阅读更多

问题:

1、某一对象A依赖于接口B, 当使用spring为对象A注入接口B的实现类时, 接口B的实现类可能不确定,对于这种情况我们怎么处理?

 

2、某一对象A依赖于接口B, 但是接口B的实现类, 依赖于第三方库, 第三方库需要初始化、处理相关的类, 这种情况我们怎么处理?

 

针对上面的情况, 我们可以自己创建一个工厂, 让工厂创建所需要的实现类, 然后注入到对象A中

方法一:静态工厂方法

//静态工厂类
public class StaticFactory {
   
  //静态工厂方法
    public static Bean3 getBean3Instance(String param){
	System.out.println(param);
        return new Bean3Impl();
    }
}


//XML文件配置
<bean id="bean3" class="com.spring.bean.StaticFactory" factory-method="getBean3Instance">
	<!-- 传入工厂方法的参数-->
	<constructor-arg><value>paramvalue</value></constructor-arg>
    
</bean>

//需要注入bean3的地方
    <bean name="bean" class="com.spring.bean.BeanImpl">
        
      <property name="bean3" ref="bean3" />
   </bean>


 

方法二:实例工厂方法

 

public class NoStaticFactory {

    public Bean3 getBean3Instance() {
        return new Bean3Impl();
    }
}
    
<bean id="noStaticFactory" class="com.spring.bean.NoStaticFactory">
</bean>

<bean id="bean3" factory-bean="noStaticFactory" factory-method="getBean3Instance"/>

 

 

方法三:继承spring提供的FactoryBean, 实现getObject方法

 

public class Bean3FactoryBean implements FactoryBean{
    @Override
    public Object getObject() throws Exception {
        return new Bean3Impl();
    }

    @Override
    public Class getObjectType() {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public boolean isSingleton() {
        return false;  //To change body of implemented methods use File | Settings | File Templates.
    }
}


<bean id="bean3" class="com.spring.bean.Bean3FactoryBean" />


factory.getBean("bean3")是获取Bean3接口的实现类, 

factory.getBean("&bean3")获取Bean3FactoryBean 工厂实例

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics