您的位置:首页 > 编程语言 > Java开发

获得spring容器中,实现某接口的所有实例;

2016-02-22 10:56 477 查看
从spring容器中,获得实现指定接口的所有实例

@Component
public class SpringBeanUtil implements ApplicationContextAware
{

private Map<String, Object> serviceBeans;

@Override
public void setApplicationContext(ApplicationContext ac)
throws BeansException
{
//获得所有serviceBeans
serviceBeans =ac.getBeansWithAnnotation(org.springframework.stereotype.Service.class);
}

/**
* 从spring容器中获得指定接口实现实例
* 从spring容器中获得实现@service 所有bean中实现 interfaceType接口的实例
*
* @param interfaceType 需要和 I.class一样
* @return
*/
public  List<Object> getBeansByInterface(Class<?> interfaceType)
{
List<Object> tList = new ArrayList<Object>();
for(String key : serviceBeans.keySet())
{
Object obj = serviceBeans.get(key);
for(Class<?> c : obj.getClass().getInterfaces())
{
if(c.getName().equals(interfaceType.getName()))
{
tList.add(obj);
}
}
}
return tList;
}

}

@Component
public class SpringBeanUtil implements ApplicationContextAware
{

private Map<String, Object> serviceBeans;

@Override
public void setApplicationContext(ApplicationContext ac)
throws BeansException
{
//获得所有serviceBeans
serviceBeans =ac.getBeansWithAnnotation(org.springframework.stereotype.Service.class);
}

/**
* 从spring容器中获得指定接口实现实例
* 从spring容器中获得实现@service 所有bean中实现 interfaceType接口的实例
*
* @param interfaceType 需要和 I.class一样
* @return
*/
public  List<Object> getBeansByInterface(Class<?> interfaceType)
{
List<Object> tList = new ArrayList<Object>();
for(String key : serviceBeans.keySet())
{
Object obj = serviceBeans.get(key);
for(Class<?> c : obj.getClass().getInterfaces())
{
if(c.getName().equals(interfaceType.getName()))
{
tList.add(obj);
}
}
}
return tList;
}


通过放射调用对象接口方法,从而实现,自动调用实现接口的某方法:例如日终任务:

@Service
public class DayEndJob
{
@Autowired
private SpringBeanUtil springBeanUtil;

List<Object> beans;

public void execute()
{
if (null == beans)
{
beans = springBeanUtil.getBeansByInterface(IDayEndJob.class);
}
for (Object obj : beans)
{
IDayEndJob job = (IDayEndJob)obj;
try
{
job.runDayEndJob(new Date());
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: