爱情就在不经意间遇到了。dubbo的注入为空问题一不留神也就解决了。前面那句解释不了,后面的请听我道来。
当dubbo的refrence注入为空时,网上说了spring-mvc的上下文和spring的上下文是不一样的。当把dubbo服务的注入实例放到了spring的上下文。而用spring-mvc的上下文去调用dubbo服务的实例时,是注入不进去的。
然而哥搭建的dubbo应用框架,并没有spring-mvc,就一个spring。苦恼啊,郁闷啊,最后请教了公司的美丽程序媛依旧没解决。然后去公司的 各个同事那转悠转悠,突然,代码给了我一个眼神,我发现了refrence这个注解不是dubbo的注解,我写错了。。。。。。
先总结,后代码
使用dubbo的service注解可以注册服务到zookeeper,使用dubbo的refrence注解,可以把远程调用的服务注入实例。
也就是说:当项目的service需要暴露时,就使用dubbo的service,否则就使用spring的service。当然喽,使用不同的service就得使用不同的扫描包配置。dubbo的service对应dubbo的扫描包方式,spring的service对应spring的扫描包方式。
当项目的service不需要暴露时,就使用spring的service注解。需要引用dubbo暴露的服务时,使用dubbo的refrence注解。
下面就是代码和配置文件了,看的人,还望给点建议。
配置文件结构:
spring-mybatis配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd"> <context:property-placeholder location="classpath:db.properties"/> <!--https://blog.csdn.net/zz210891470/article/details/68949525--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="${db.url}" /> <property name="driverClassName" value="${db.driver}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> <property name="filters" value="${db.filters}"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="spring/mybatis-config.xml"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="dubbo.wk.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> </beans>
mybatis-config配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="logImpl" value="LOG4J" /> </settings> <typeHandlers> <typeHandler javaType="dubbo.wk.model.domain.enmus.SexEnums" handler="dubbo.wk.dao.config.SexEnumHandler"/> </typeHandlers> </configuration>
spring-context配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" xmlns:mvc="http://www.alibaba.com/schema/stat" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd http://www.alibaba.com/schema/stat http://www.alibaba.com/schema/stat.xsd"> <import resource="spring-mybatis.xml"/> <import resource="classpath:dubbo-provider.xml"/> </beans>
dubbo-previder配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--<!–搭建dubbo环境的第一次配置–>--> <!--<dubbo:application name="dubbo-consumer"/>--> <!--<dubbo:registry address="zookeeper://localhost:2181"/>--> <!--<bean id="demoService" class="dubbo.wk.service.impl.DemoServiceImpl"/>--> <!--<dubbo:service interface="dubbo.wk.service.IDemoService" ref="demoService"/>--> <dubbo:protocol name="dubbo" port="20891"/> <dubbo:provider timeout="3000"/> <dubbo:application name="dubbo-provider"/> <dubbo:registry address="zookeeper://localhost:2181"/> <dubbo:annotation package="dubbo.wk.service.impl" /> </beans>
消费者项目配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--搭建dubbo环境的第一次配置--> <!--<dubbo:application name="dubbo-consumer"/>--> <!--<dubbo:registry address="zookeeper://localhost:2181"/>--> <!--<dubbo:reference id="demoService" interface="dubbo.wk.service.IDemoService"/>--> <!--<bean id="demoController" class="dubbo.wk.controller.DemoController">--> <!--<property name="iDemoService" ref="demoService"/>--> <!--</bean>--> <!--****************************************************--> <dubbo:annotation/> <dubbo:application name="dubbo-consumer"/> <dubbo:registry protocol="zookeeper" address="zookeeper://localhost:2181" register="true"/> <dubbo:protocol port="20895" name="dubbo"/> </beans>
消费者的spring-context配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" xmlns:mvc="http://www.alibaba.com/schema/stat" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd http://www.alibaba.com/schema/stat http://www.alibaba.com/schema/stat.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <import resource="classpath:dubbo-consumer.xml"/> <context:component-scan base-package="dubbo.wk.service.impl"/> </beans>
提供者测试类
@com.alibaba.dubbo.config.annotation.Service public class DemoServiceImpl implements IDemoService { @Autowired private UserMapper userMapper; @Override public DemoRemoteModel findDemoModel() { DemoRemoteModel model = new DemoRemoteModel(); model.setId(1L); UserEntity userEntity = userMapper.findByPrimaryKey(1L); model.setUserName(userEntity.getUserName()); model.setId(userEntity.getId()); return model; } }
public class provider { public static void main(String[] args)throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml"); context.start(); System.out.println("提供者启动成功!"); System.in.read(); } }
消费者测试类
public class consumer { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml"); CourseService iDemoService = context.getBean(CourseService.class); DemoRemoteModel model = iDemoService.findDemoModel(); System.out.println(model.getUserName()); } }
@org.springframework.stereotype.Service public class CourseServiceImpl implements CourseService { @com.alibaba.dubbo.config.annotation.Reference private IDemoService iDemoService; @Override public CourseEntity findCourseByPrimeryKey(Long id) { return null; } @Override public DemoRemoteModel findDemoModel() { return iDemoService.findDemoModel(); } }