spring怎么动态决定调用哪一个类

abc45628 发布于 2017/02/15 21:21
阅读 550
收藏 0

 

假设有接口A

public interface A {void dosome();}

2个实现类

public class B implements A {
	public void dosome() {System.out.println("run B");	}}

public class C implements A {
	public void dosome() {System.out.println("run C");	}}

然后还有一个

public class D {
	private A a;
	public D(A a) {this.a = a;}	
}

配置文件

<bean id="b" class="com.wxw.action.B"></bean>
<bean id="c" class="com.wxw.action.C"></bean>
<bean id="d" class="com.wxw.action.D">
	<constructor-arg>
<!--这里改怎么写 -->
	</constructor-arg>
</bean>

假如我程序运行时需要一个D,但是A用的是B还是C是动态决定的,那么配置文件改怎么写

加载中
3
大王来巡山
大王来巡山

如果你想在程序运行中动态确定需要调用哪一个,那么你需要增加一个代理类(类似于adapter模式),通过代理类中的逻辑来确定具体调用哪一个类

0
pointerException
pointerException
使用一个profile文件,编译时根据不同环境不同加载的spring上下文,然后配置不同的文件
a
abc45628
profile文件可能不行,因为是在同一次运行状态中,无论是B还是C都可能用到,取决于用户的选择
0
notreami
notreami

想起 Spring4.x的条件注解 @Conditional

0
_Mr_Right_
_Mr_Right_

目前是加一个代理类

根据条件  确定实现类  然后根据名称去spring 容器获取  

0
不会飞的小龙人

用spring中的@Conditional,可以动态切换;

http://blog.csdn.net/qq_26525215/article/details/53510156

0
91porn
91porn

最简单的做法,在D中同时注入B,C,然后根据上下文决定用哪个

public class D {
    @Resource("b")
    private A b;
    @Resource("c")
    private A c;

    public void test(Context context){
        if(context){
              b.doSomething();
        }else {
             c.doSomething();
        }
    }
	
}
0
魔力猫
魔力猫

Spring的SpringEL试试

0
whaon
whaon

spring的profile可以满足你的需求,貌似是4以后支持,记不大清了

返回顶部
顶部