日期:2014-05-20  浏览次数:21013 次

spring如何动态获取bean,如何动态调用getBean方法。
事情是这个样子的,听我慢慢道来:

这里有102个beans,都是由spring管理的,

其中一个bean叫做工头,还有一个是公司老总。其他100个bean是工人,分别是张三、李四、王二麻子等等,张三、李四、王二麻子都继承自工人类。


每次有新的任务来(最多一次来一个任务),会交给工头,工头负责把合适这个任务的工人找出来,交给上面--公司老总。公司老总维护一个工人接口,他不关心哪个人是哪个人。工头必须返回一个工人接口,而不是具体的工人给老总。

现在问题来了,我如何在工头类中找到合适的工人然后返回呢?工头虽然知道用哪个工人,但是他如何获得具体工人的那个bean呢?

就是如何能实现类似getBean("张三")在工头类里面。

希望不使用ApplicationContextAware接口。



------解决方案--------------------
写一个工人接口,所有的工人实现这个接口。
写一个代理类,同样实现工人接口,每当需要一个工人Bean的时候,让代理类根据工人姓名获取一个实体Bean。
当工头需要得到工人接口时,接口的实现类为代理类。
------解决方案--------------------
我想你可以这样。
1 你设计一个工人的管理Bean,可以用工头的类哦
2 里面初始化所有的工人数据,然后用 Map<姓名,Bean> 的方法储存。并提供一个 get工人(姓名)的方法。 怎么初始化我就不说了
3 调用时,采用 
工人管理Bean bean = getBean("工人管理Bean");
工人 = benm.get(姓名);

就可以了。

同样,分配工人的步骤也是由 get工人的方法实现的。 如果工头还没有分配好,就先返回null拉!
------解决方案--------------------
又是老紫竹!
------解决方案--------------------
同3楼,20天,星星rush一波流.
这颗星星一推出来,严重打击了广大新人冲星星的积极性.

蹲角落里画圈圈诅咒竹子.
------解决方案--------------------
话说竹子怎么那么强?

太嫉妒了...
------解决方案--------------------
最终还是多态的问题
------解决方案--------------------
看了各位回的贴子,小弟我进步不小,就是如何在代理类中动态获取bean不解,能不能说清楚,或者给点源码参考下,谢了
------解决方案--------------------
就是把applicationContext通过ApplicationContextAware接口注入,然后applicationContext.getBeansOfType(Worker.class);

楼主提问的方式很有意思,呵呵。简单写了下,是下面代码的意思吧?

public interface Worker {

String getName();

void work(String condition);
}

public class Worker1 implements Worker{//工人1
public String getName() {
return "张三";
}

public void work(String condition) {
System.out.println(getName() + "在工作。");
}
}

public class Worker2 implements Worker{//工人2
public String getName() {
return "李四";
}

public void work(String condition) {
System.out.println(getName() + "在工作。");
}
}

public class WorkerMaster {//工头
private Map<String,Worker> nameWorkerMap;
Random random = new Random();

public Worker selectWorker(String condition){
String[] names = {"张三","李四"};
int i = random.nextInt(2);
String name = names[i];
return nameWorkerMap.get(name);
}


public void setWorkerList(List<Worker> workList) {
this.nameWorkerMap = new HashMap<String, Worker>();
for (Worker worker : workList) {
this.nameWorkerMap.put(worker.getName(),worker);
}
}
}

test.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-2.0.xsd">

<bean id="boss" class="Boss" autowire="byName">
</bean>

<bean id="workerMaster" class="WorkerMaster">
<property name="workerList">
<list>
<ref bean="worker1"/>
<ref bean="worker2"/>
</list>
</property>
</bean>
<bean id="worker1" class="Worker1" />
<bean id="worker2" class="Worker2" />
</beans>


测试:
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("test.xml");
Boss boss = (Boss)ac.getBean("boss");
boss.doBusiness("XXOO");
boss.doBusiness("XXOO");
boss.doBusiness("XXOO");
}
------解决方案--------------------
学习一下~~~~
------解决方案--------------------
11楼的真TM的不要脸,举报你的贴子都出来了,你还这干这勾当。

大家可以去这个贴去看看 
http://topic.csdn.net/u/20080124/08/b14ab841-be1e-4d0d-b16e-52f77fd3a764.html?seed=1435805093