dangdangdotcom / dubbox

Dubbox now means Dubbo eXtensions, and it adds features like RESTful remoting, Kyro/FST serialization, etc to the Dubbo service framework.
http://dangdangdotcom.github.io/dubbox
Apache License 2.0
4.9k stars 2.06k forks source link

@Reference如何向spring注册bean或者告诉我怎么被AOP? #261

Open gMan1990 opened 7 years ago

gMan1990 commented 7 years ago

暂定解决:com.alibaba.dubbo.rpc.Filter

qct commented 7 years ago

在spring 直接用 @Service 注册

gMan1990 commented 7 years ago

@qct 你是说再加上@org.springframework.stereotype.Service么

qct commented 7 years ago

是的

zylele commented 7 years ago

@gMan1990 @qct 通过注解加载的话,应该需要配置或者dubbo的AnnotationBean,否则注册不了

gMan1990 commented 7 years ago

@qct @zylele com.alibaba.dubbo.rpc.Filter,是不是可以用这个实现类似AOP的功能,dubbo内部还有其它的么?

yunhaibin commented 7 years ago

Filter可以实现类似AOP的功能,但是为何要用dubbo的Filter来实现AOP,完全可以用Sping原生的哦,而且Spring的AOP可以实现比Filter更丰富的功能。

gMan1990 commented 7 years ago

@yunhaibin 但通过注解@Reference,如何向spring注册bean呢然后被AOP到呢

gMan1990 commented 7 years ago

@qct @zylele @yunhaibin 看下1楼更新的图片

yunhaibin commented 7 years ago

@gMan1990

@Path("userInfo")
@Component
public class UserInfoAction {
    private static final Logger logger = LogManager.getLogger(UserInfoAction.class);

    @Autowired
    private UserInfoService userInfoService;
gMan1990 commented 7 years ago

@yunhaibin 我说的是@Reference注解。ps:你这个Path是哪个类?

yunhaibin commented 7 years ago

@gMan1990 Path是javax.ws.rs.Path; 我们没有用@Reference来注入,我们是用xml文件管理起来所有引用的生产服务接口,xml里面可以清晰明了看到所有提供的服务:

<dubbo:reference id="userInfoService" interface="cn.nickid.dbapi.leancloud.service.UserInfoService" />

代码里面用@Autowired来注入就行了

qct commented 7 years ago

使用 @Reference 之后,你已经可以拿到这个bean了,在这里就可以把 @Reference理解成 @Autowired。spring已经帮你注入了远程服务代理。

但是这时候拿到的bean是代理对象,所以如果想做AOP,最好做一次包装。对包装类的包装方法做AOP。

gMan1990 commented 7 years ago

@qct @Reference之后bean是拿到了,但spring容器内并不会设入这个类(spring.getBean是没有的),那怎么spring aop

yunhaibin commented 7 years ago

@gMan1990 我们没有用过aop的功能,回头可以写个测试看一下……

qct commented 7 years ago

@gMan1990 这个bean当然在spring容器里! getbean 当然可以拿到,拿到的是代理对象。你可以把所有注册的bean的名字打印出来看一下。

gMan1990 commented 7 years ago

@qct 我就是试过了,才说的。真木有 用xml: <dubbo:reference id="必填" 是有的,比如class com.alibaba.dubbo.common.bytecode.proxy4,可以直接对该interface作spring aop,不需要关心这个proxy。

Xiaobaxi commented 7 years ago

@gMan1990 如果被@transitional注解过的,@Reference是有bug的,这个你知道的吧?是不是已经屏蔽了这个