问题描述:
最近在做一个功能时,要用到dubbo的filter。于是在实现接口
com.alibaba.dubbo.rpc.Filter后,按照正常思路添加了属性,代码如下:
@Activate(group = {Constants.PROVIDER})
public class CatFilterImpl implements Filter {
@Autowired
private ServClientService scService;
.....
}
在invoke方法里使用到该scService时,却发现为NULL,导致本人惊愕。作为一个新人,在公司里又只有本人在弄这dubbo。又。。。省去。。
所以是不可能有那么多时间了解dubbo内部,只能找一个土办法。见笑。
(2017/10/13 发现用Dubbo提供的ServiceBean可获取dubbobean,因为该类已经实现了ApplicationContextAware,所以以下做法不用了)
本bo在这里为了获取scService对象。新建一个类,并使之继承ApplicationContextAware
本代码取自网络, 代码作者忘记了。。。见谅。
@Controller
public class SpringContextHolder implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
checkApplicationContext();
return applicationContext;
}
@SuppressWarnings("unchecked")
public static Object getBean(String name) {
checkApplicationContext();
return applicationContext.getBean(name);
}
@SuppressWarnings("unchecked")
public static T getBean(Class clazz) {
checkApplicationContext();
Map beanMaps = applicationContext.getBeansOfType(clazz);
if (beanMaps!=null && !beanMaps.isEmpty()) {
return (T) beanMaps.values().iterator().next();
} else{
return null;
}
}
private static void checkApplicationContext() {
if (applicationContext == null) {
throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
}
}
}
在这代码里,本bo添加了@controller注解,是为了不用写配置文件bean。
要注意这里只能用controller,不能改为@Service或@Component。改了后果为applicationContext 将为空(我也不知道为什么只能controller,我一次次试出来的,心疼自己)
若是要写配置文件bean的话,这个bean也只能写在controller注解扫描之后才可。当然这些是为了让spring发现ApplicationContextAware有实现类。但是在实际过程中,本bo发现还是不行。苦思不得,穷举法。
在大量的实验后,发现只要在控制层的类里面添加
@Autowired
private SpringContextHolder sh;
就可以使得SpringContextHolder 被spring发现,也就是可以在别的地方使用该类获取bean对象。
但是由此有引发一个问题,总不能让他人想用我的filter就得在他人的代码里添加这两行吧于是,本bo自己又新建了一个类
@Controller
@RequestMapping("fff")
public class Centre {
@Autowired
private SpringContextHolder sh;
@RequestMapping("/i")
@ResponseBody
public Object index() throws Exception{
return null;
}
}
好了这样就不需要麻烦他人了。
总结:本来只是想拿个对象,却额外的建了两个类。说明实力太弱。。
若是有哪只猿在这个有方便的做法,请告知,感激不尽!