发表于: 2017-07-17 15:02:15
2 1139
今天完成的:
Task8的任务1,任务2差了一点
收获:
1.父工程使用空maven模板,二级工程commons和manager使用portlet模板,子工程均使用quickstart模板。
父工程和commons和manager打包成pom,子工程jar,web工程war
注意上图这里的构造路径,它将决定子工程在idea中显示和父工程的同级目录还是下级目录。
随后在写代码的时候,快速添加依赖,可以直接右键add dependency,它导入的将是父工程pom中规定的依赖。
2.springRMI整合
注意服务端和客户端的service路径以及调用的pojo路径必须相同,否则客户端可能找不到类。
spring对RMI的客户端支持是通过一个RmiProxyFactoryBean的代理工厂实现的。服务端通过RmiServiceExporter实现的。对多个接口的映射应该在一个端口中,设置不同的serviceName以便区别。
服务端:
<bean id="studentService" class="com.jnshu.serviceImpl.StudentServiceImpl"/>
<bean id="service1" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="studentService"/>
<property name="service" ref="studentService"/>
<property name="serviceInterface"
value="com.jnshu.service.StudentService"/>
<property name="registryPort" value="8080"/>
<property name="servicePort" value="8088"/>
</bean>
<bean id="developerService" class="com.jnshu.serviceImpl.DeveloperServiceImpl"/>
<bean id="service2" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- 配置自定义serviceName-->
<property name="serviceName" value="developerService"/>
<!-- RMI服务,ref引用接口的实现类-->
<property name="service" ref="developerService"/>
<!-- RMI服务,声明接口-->
<property name="serviceInterface"
value="com.jnshu.service.DeveloperService"/>
<property name="registryPort" value="8080"/>
<property name="servicePort" value="8088"/>
</bean>
<bean id="loginService" class="com.jnshu.serviceImpl.LoginServiceImpl"/>
<bean id="service3" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- 配置自定义serviceName-->
<property name="serviceName" value="loginService"/>
<!-- RMI服务,ref引用接口的实现类-->
<property name="service" ref="loginService"/>
<!-- RMI服务,声明接口-->
<property name="serviceInterface"
value="com.jnshu.service.LoginService"/>
<property name="registryPort" value="8080"/>
<property name="servicePort" value="8088"/>
</bean>
客户端:
<!-- spring支持RMI的代理工厂类-->
<bean id="studentService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<!-- 指定url和接口-->
<property name="serviceUrl" value="rmi://127.0.0.1:8080/studentService" />
<property name="serviceInterface"
value="com.jnshu.service.StudentService" />
</bean>
<bean id="developerService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://127.0.0.1:8080/developerService" />
<property name="serviceInterface"
value="com.jnshu.service.DeveloperService" />
</bean>
<bean id="loginService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://127.0.0.1:8080/loginService" />
<property name="serviceInterface"
value="com.jnshu.service.LoginService" />
</bean>
调用的时候直接从spring中拿接口的bean就行。
3.Show dapendencies显示依赖树,比如你引用的包1也可能依赖别的包2。如果你又添加了依赖包2,两者版本冲突,而在pom文件中不可能直接找得到。可以用于解决依赖版本不一致的情况,
遇到的问题:
1.遇到了一个问题,项目没拆分之前,有两个地方用到了redis的实现类,控制器和service。我想把redis也封进服务端的service里,再通过客户端的controller调用。启动服务报出异常发现了一个以上的bean,注入失败。一个bean是以前service层包扫描器扫描的redisUtil,另一个似乎是RMI注入进去的。两个bean冲突了。
后来研究了一下,spring容器允许一个类注册出两个bean实例,此时可以用@Qualifier表明使用的是哪个bean。
感觉这个是设计的时候结构不合理。
redis在service和controller部分耦合了。最好是将发送短信ip限制的代码写到service里而不是controller。但我写进去之后需要将request和response传进service里,但是不行,有异常。所以就先这么用吧。
2.非常头疼,本地可以远程调用,服务器上就不行,有一种说法是linux服务器的hosts中的127.0.0.1代表本机,而直接连服务器外网ip是连不到的,需要改hosts。暂时不好用。
明天的计划:
就剩下搭服务器了,完成Task8
评论