本人遇到的问题是:生产者一次就注册上去了,但是到消费者这里一直注册不上去,调试了好长时间。

本人问题所在:问题本来挺简单的就是由于自己对@Reference与@Autowired和@Resource这三个注解不够理解造成项目可以跑起来但是就是注册不上去的原因

浅度解析:

@Autowired注解是根据类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。而且Autowired可以和Qualifier一起使用

例如:

@Configuration
public class TestConfiguration {
   @Bean("testClass1")
   TestClass testClass1(){
       return new TestClass("TestClass1");
   }
   @Bean("testClass2")
   TestClass testClass2(){
       return new TestClass("TestClass2");
   }
}
@RestController
public class TestController {

    //此时这两个注解的连用就类似 @Resource(name="testClass1")
    @Autowired
    @Qualifier("testClass1")
    private TestClass testClass;

    @GetMapping("/test")
    public Object test(){
        return testClassList;
    }

}

@Resource注解与@Autowired注解类似区别是:

@Autowired先查找Type再Name ,@Resource先查找Name再Type(当指定@Resource name属性时,只会Name)

@Reference注解是用于dubbo消费者服务指明引用哪个提供者接口服务,在工程项目中会有很多模块,每个模块是一个服务,一个服务调用另一个服务都需要使用@Reference注解

例如:

@Service(interfaceClass = TestService.class)
@Transactional
public class TestServiceImpl implements TestService {
    void add(TestPojo test){

    }
}
@RestController
@RequestMapping("test")
public class TestController {
    @Reference
    private TestService TestService;
}

两个位置的代码属于两个服务。

总结:@Reference注入的是分布式中的远程服务的对象,@Resource和@Autowired注入的是本地spring容器中的对象

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐