dubbo的Filter实现类属性自动注入(Autowired)无效

问题描述:
最近在做一个功能时,要用到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;
    }
}

好了这样就不需要麻烦他人了。
总结:本来只是想拿个对象,却额外的建了两个类。说明实力太弱。。
若是有哪只猿在这个有方便的做法,请告知,感激不尽!

你可能感兴趣的:(dubbo学习笔记)