问题,在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 进行测试
Dubbo-Zookeeper-Netty-SpringMVC, 使用dubbo注册服务,netty做服务器,springmvc提供restful接口
NULL 博文链接:https://bijian1013.iteye.com/blog/2310240
可以拿过来直接使用的基于springmvc+dubbo+mybatis+zookeeper的框架demo
整合 Dubbo + SpringMvc 4.3.1 的服务器maven工程样例,使用注解方式定义服务及IOC装配,采用Hessian协议传输 三个工程,在 cnetAdmin 和 cnetBlu 中,要引用 cnetCommon 工程。
springmvc+springboot+dubbo,开发文档
该demo是基于maven搭建的,项目架构基于SpringMVC,这里忽略Spring的基本配置,着重介绍下dubbo部分的配置,以及dubbo后台管理系统
Maven+SpringMVC+Dubbo 简单的入门demo配置
springmvc+mybatis+dubbo 搭建实现数据库查询
SpringMVC ModelAndView、Model及Map、@SessionAttributes场景与应用
SpringMVC九大常用注解 SpringMVC
NULL 博文链接:https://bijian1013.iteye.com/blog/2310236
通过注解配置完全代替web.xml、Spring的xml文件配置,jquery递归遍历后台返回的json对象并进行拼接
NULL 博文链接:https://zhaoshunxin.iteye.com/blog/1166266
maven spring mvc + dubbo demo 配置jdbc.properties, 写一个mapper就可以运行了
Spring MVC 全注解配置,吾运行环境:server tomcat8,elcipse,jdk1.8. 注:任何服务器必须是servlet是3.0以上的,否则不能运行,当然也有解决办法,自己百度吧
资源是springMVC注解和非注解两个版本
SpringMVC 注解和非注解demo。有关注解方式和非注解方式的讲解和demo
dubbo zookeeper springmvc 集成
spring+springMvc+MyBatis+注解