问题,在controller中无法通过注解自动注入dubbo服务,
但是在service中可以自动注入。
注解放入的对象在spring root上下文中(服务层的就是spring,就是根),配置的在mvc的上下文中所以配置的mvc可以拿到,根上下文可以拿到子上下文东西,子上下文不可拿到根的东西,和配置化bean的方式配置资源文件一样,mvc层需要获取需要在mvc的配置文件也配置一遍
package com.sl;
@Controller
public class P{
//期望注入dubbo服务
@Reference(version="1.0.0")
private I0 o;
//注入service
@Autowired
private S s;
@RequestMapping("p")
public void p() throws IOException{
//o is null!没有自动注入
//s 自动注入且s.s()中dubbo服务也注入成功
}
}
package com.sl;
@Service
public class S{
//成功注入dubbo
@Reference(version="1.0.0")
private I0 o;
public void s() throws IOException{
//o is not null!可以直接使用
}
}
经过分析,原来配置导致两个上下文,一个是根上下文,一个是springMVC的上下文,
dubbo的注解配置在根上下文中,因此无法解析springMVC bean的注入。
当前配置:
web.xml
....
<!--
tomcat启动后,此设置导致spring生成根上下文,且使用默认的applicationContext.xml来获得其他设置。
根上下文保存在ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
可以用spring工具类获得:WebApplicationContextUtils.getWebApplicationContext(ServletContext);
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
...
<!--
这里再生成springMVC的上下文,其父是根上下文。
使用默认的springMVC-servlet.xml配置文件
当一个Request对象产生时,会把这个WebApplicationContext上下文保存在Request对象中,
key是DispatcherServlet.class.getName() + ".CONTEXT"。
可以用spring工具类获得:RequestContextUtils.getWebApplicationContext(request);
-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
applicationContext.xml
...
<!-- dubbo使用注解 -->
<dubbo:annotation />
<!-- 需要扫描注解的包 -->
<context:component-scan base-package="com.sl" />
<!-- dubbo会在根上下文注册postProcessBeforeInitialization,
所以以后这里生成的bean中的@Reference都会被正确解析注入
-->
springMVC-servlet.xml
...
<!-- MVC注解驱动 -->
<mvc:annotation-driven />
<!-- sprint MVC 注解扫描包-->
<context:component-scan base-package="com.sl" />
<!-- springMVC中并没有dubbo配置所以这里生成的controll bean不会解析 @Reference-->
...
解决办法:
1.只将dubbo服务注入到service和Repository中而不是Controller中,其实大部分时候都可如此
2.去掉web.xml中listener,将全部配置都放到springMVC-servlet.xml,这样只生成一个上下文。
3.在springMVC-servlet.xml也加入duboo的配置,这样虽然有了冗余,但是可以保证两个上下文。
相关推荐
基于springMVC框架的dubbo注解配置。需自己安装zookeeper,否则修改注册地址为multicast方式。两个web项目启动后,访问http://localhost:8080/dubboconsumer/DubboController/testDubboAnnotation.do 进行测试
创建Controller类并使用注解如@RequestMapping来定义路由,以及@Service和@Autowired注解来注入服务和依赖。 然后是Dubbo的核心部分。Dubbo是一个高性能、轻量级的服务治理框架,主要用于实现微服务间的远程调用。...
"SpringMVC纯注解配置"是SpringMVC框架的一种高级用法,旨在减少XML配置文件的使用,提高开发效率和代码可读性。在这个主题中,我们将深入探讨如何利用注解实现SpringMVC的配置以及jQuery如何处理后台返回的JSON对象...
在Spring MVC框架中,`@Resource`注解是用来管理依赖注入(Dependency Injection,简称DI)的一种方式。这个注解主要用于标注字段或者方法,以便Spring容器能够自动为它们提供实例化对象。本文将深入探讨`@Resource`...
项目可能包含了配置文件、接口定义、服务实现以及消费者端代码,展示了如何将 SpringMVC、MyBatis 与 Dubbo 结合,实现高效、分布式的数据库查询服务。 总结来说,SpringMVC、MyBatis 和 Dubbo 是构建大型分布式...
Dubbo 可以与 SpringMVC 框架进行整合,提供基于注解的服务调用方式,简化服务调用过程。 Dubbo 的服务调用可以使用 SpringMVC 的 Controller 来调用,提供更加灵活和简洁的服务调用方式。 五、基本概念 * RMI...
Spring MVC、Spring Boot和Dubbo是Java开发领域中极为重要的技术框架,它们分别在Web应用、微服务管理和分布式服务调用方面发挥着关键作用。这篇文档将深入探讨这三者的核心概念、工作原理以及如何结合使用。 **...
【标题】:“Dubbo 简单的入门【Maven+SpringMVC+Dubbo 】源码”指的是一个教程项目,旨在引导初学者了解如何将Apache Dubbo整合到Maven管理和SpringMVC框架中,以构建分布式服务。在这个项目中,我们将探讨Dubbo的...
在IT行业中,构建高效、可扩展的企业级应用是至关重要的,而"Maven+SpringMVC+Dubbo"的组合正是为了实现这一目标。这个入门demo配置将帮助开发者快速理解和掌握这三个关键技术,从而能够构建分布式服务架构的应用。 ...
全注解配置是Spring MVC中的一种现代配置方式,它允许开发者在不使用XML配置文件的情况下,通过注解来声明和管理组件。这种方式简化了项目的配置,提高了代码的可读性和可维护性。 在Java环境下,我们通常使用...
整合 Dubbo + SpringMvc 4.3.1 的服务器maven工程样例,使用注解方式定义服务及IOC装配,采用Hessian协议传输 三个工程,在 cnetAdmin 和 cnetBlu 中,要引用 cnetCommon 工程。
通过注解配置,如@Controller和@RequestMapping,可以简化开发,使得代码更加简洁。 【Spring】 Spring是一个全面的Java企业级应用开发框架,提供依赖注入(DI)、面向切面编程(AOP)、事务管理、JDBC抽象、数据...
MyBatis 是一个优秀的持久层框架,它简化了Java应用与数据库的交互,通过XML或注解配置映射SQL语句,使得开发者能够将精力集中在业务逻辑上而不是繁琐的JDBC代码。MyBatis 提供了动态 SQL 功能,允许在 SQL 查询中...
在 SpringMVC 框架中,注解标签扮演着非常重要的角色,它们使得开发者可以轻松地定义控制器、请求映射、依赖注入等内容。在本文中,我们将详细地解释 SpringMVC 中常用的注解标签,包括@Controller、@RequestMapping...
标题中的"spring+springMvc+MyBatis+注解"提到了四个关键点:Spring、SpringMVC、MyBatis以及注解。这四者构成了一个经典的Java Web开发框架组合,通常被称为SSM(Spring、SpringMVC、MyBatis)。下面将详细解释这些...
在 Spring 中,这些信息可以通过 `PropertyPlaceholderConfigurer` 或 `@Value` 注解注入到配置类或 Bean 中。 **Dubbo 知识点:** 1. **服务提供者(Provider)**:提供服务的模块,通过注册中心将自己的服务暴露...
在Dubbo中,Zookeeper常被用作服务注册中心,负责存储服务提供者的元数据信息,使服务消费者可以找到并调用相应服务。 SpringMVC是Spring框架的一部分,用于构建Web应用的模型-视图-控制器(MVC)架构。它简化了Web...
在本项目"Dubbo-Zookeeper-Netty-SpringMVC"中,我们主要关注四个关键技术和框架的集成与应用。这四个技术分别是Dubbo、Zookeeper、Netty和SpringMVC,它们在分布式系统开发中各自扮演着重要的角色。让我们详细探讨...
### Dubbo与Zookeeper、SpringMVC整合和使用 随着互联网技术的发展,网站应用规模的扩大,传统的垂直架构已经难以满足需求,分布式服务架构成为解决大规模应用难题的关键方案之一。Dubbo作为一款分布式服务框架,...
`MyBatis`是一个SQL映射框架,它允许开发者将SQL语句直接写在XML配置文件或注解中,消除了DAO层的大量重复代码。通过`MyBatis`,开发者可以灵活地进行SQL操作,同时保持良好的编程习惯。 在项目构建过程中,通常会...