`
dbjoy
  • 浏览: 9503 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

通过注解自动暴露Hessian服务

阅读更多
一、Hessian与spring集成

Hessian可以与spring完美无缝的集成,我们先来看一下如何集成:

服务端服务暴露
@Autowired
private HelloService helloService;

@Bean(name = "/helloService")
public HessianServiceExporter exportHelloService() {
    HessianServiceExporter exporter = new HessianServiceExporter();
    exporter.setService(helloService);
    exporter.setServiceInterface(HelloService .class);
    return exporter;
}

以上使用spring在代码配置声明bean的方式暴露了一个hession服务:http://localhost:8080/Hello/helloService

客户端声明与调用
声明

<bean id="studentService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
        <!-- 请求代理Servlet路径 -->
        <property name="serviceUrl">
            <value>http://localhost:8080/Hello/helloService</value>
        </property>
        <!-- 接口定义 -->
        <property name="serviceInterface">
            <value>com.test.hello.service.HelloService</value>
        </property>
</bean>

调用

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:/spring/ApplicationContext.xml");
HelloService helloService = (HelloService) context.getBean("helloService");
helloService.sayHi("hi, i am client");

二、存在的问题

上述的方法是最常用的集成方式,但存在一个问题,如果我们现在要在服务端暴露另外一个服务,那么需要添加如下代码:

@Autowired
private AnotherService1 anotherService;

@Bean(name = "/anotherService")
public HessianServiceExporter exportAnotherService() {
    HessianServiceExporter exporter = new HessianServiceExporter();
    exporter.setService(anotherService);
    exporter.setServiceInterface(AnotherService .class);
    return exporter;
}

如果再来一个服务呢,那我们就再添加类似的代码,能不能不重复添加这些类似的暴露代码呢?

三、使用注解自动暴露服务

首先,新建一个叫HessianService的注解类,注意这个注解类包含了spring的Service注解

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Service;

@Target({ java.lang.annotation.ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface HessianService {
    public abstract String value() default "";
}

接着,我们把原先用@Service注解的服务类换成@HessianService

@HessianService
public class HelloServiceImpl implements HelloService {
    ...
    ...
}

然后,我们使用spring的BeanFactoryPostProcessor机制,动态暴露hessian服务

@Component
public class HessianServiceScanner implements BeanFactoryPostProcessor {

    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String[] beanNames = beanFactory
                .getBeanNamesForAnnotation(HessianService.class);
        for (String beanName : beanNames) {
            String className = beanFactory.getBeanDefinition(beanName)
                    .getBeanClassName();
            Class<?> clasz = null;
            try {
                clasz = Class.forName(className);
            } catch (ClassNotFoundException e) {
                throw new BeanInitializationException(e.getMessage(), e);
            }
            String hessianServiceBeanName = "/" + beanName.replace("Impl", "");

            BeanDefinitionBuilder builder = BeanDefinitionBuilder
                    .rootBeanDefinition(HessianServiceExporter.class);
            builder.addPropertyReference("service", beanName);
            builder.addPropertyValue("serviceInterface",
                    clasz.getInterfaces()[0].getName());
            ((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(
                    hessianServiceBeanName, builder.getBeanDefinition());
        }
    }

}
0
1
分享到:
评论

相关推荐

    spring使用注解暴露remoting服务

    在Spring中,可以使用`HessianServiceExporter`类来暴露一个服务为Hessian服务,通过简单的配置,就可以让其他客户端通过Hessian协议访问这个服务。 下面是一个简单的例子,展示如何使用注解暴露一个基于Hessian的...

    dubbo-hessian协议http请求demo(java)

    - 在服务消费者端,你需要创建一个服务引用,使用`@Reference`注解,指定服务接口和版本,Dubbo会根据配置自动从注册中心获取服务提供者的地址。 - 注意,消费者端并不需要直接处理HTTP请求,Dubbo会处理底层通信...

    Springmvc+Hibernate+Hessian架包整合

    3. **Hessian服务暴露**:使用Spring的AOP(面向切面编程)和HessianProxyFactoryBean,将服务接口暴露为Hessian服务。这样,客户端可以通过HTTP请求调用这些服务。 4. **配置Hibernate**:在Spring配置文件中设置...

    Java Hessian小试(转)

    在服务器端,使用HessianServlet启动Hessian服务,将服务注册到Servlet容器中。 ```java public class HessianServer { public static void main(String[] args) throws IOException { HessianServlet servlet = ...

    spring aop hessian 基础demo 部署即可运行

    5. **部署和运行**:部署服务端和客户端,客户端通过Hessian客户端API调用服务端的Hessian服务,AOP通知会在适当的时候执行。 在提供的"AopTest"文件中,可能包含了上述步骤的示例代码,如Hessian服务的定义、AOP切...

    spring+hessian+maven整合.zip

    2. "H1":这个文件可能是Hessian服务的一个具体实现或者相关的测试类,可能包含了Hession客户端和服务端的具体交互逻辑。 详细知识点: 1. **Spring框架**:Spring提供了bean的生命周期管理,依赖注入,以及AOP切...

    外部接口调用 使用spring4+hessian4实例(二)

    在Spring中配置Hessian服务,我们可以利用Spring的自动装配能力,简化服务的发布和消费过程。 要实现Spring4与Hessian4的结合,你需要完成以下步骤: 1. **配置服务提供方**: - 首先,创建一个服务接口和其实现...

    jinrongjuServer

    接着,我们利用`HessianExporter`将这个bean暴露为Hessian服务,可以通过`@Bean`注解或在配置文件中进行配置。 2. **服务消费方(Client)** 在客户端,我们需要创建一个HessianProxyFactoryBean,设置服务URL和...

    hessoa:Hessoa是基于Hessian的SOA框架

    Hessoa通过注解的方式暴露服务,通过手工配置hosts路由的方式发现服务,但已经具备负载均衡和自动摘除和恢复服务的特性。 hessoa的使用请详见hessoa-demo。【必须】请先在本地安装一个redis,默认端口无密码即可,...

    dubbo服务提供者的web应用实例

    4. **服务暴露**:通过Dubbo的Provider接口,服务提供者将服务暴露出去,使得服务消费者可以通过网络调用。暴露服务时,需要指定服务的注册中心和通信协议。 5. **注册中心**:Dubbo支持多种注册中心,如Zookeeper...

    分布式服务之Dubbo基础架构搭建Demo

    这样,服务提供者和服务消费者可以通过Spring的XML配置或注解方式来声明和引用服务。 搭建步骤如下: 1. **环境准备**:确保安装了Java开发环境,以及Zookeeper服务的运行环境。 2. **创建服务接口**:定义业务...

    基于springboot的rpc服务

    RPC允许服务提供者暴露一组服务接口,服务消费者通过这些接口像调用本地方法一样调用远程服务。整个过程对调用者透明,隐藏了网络通信和数据序列化的细节。 在SpringBoot中实现RPC服务,我们通常会借助于第三方RPC...

    2023年1月最新dubbo面试题

    服务提供者通过 Netty 协议暴露服务,服务消费者则通过服务目录获取服务提供者的地址,进而通过负载均衡策略选择服务实例进行通信。服务注册和发现是通过注册中心(如 Nacos 或 Zookeeper)来实现的,确保服务的动态...

    dubbo入门案例

    然后,通过`@Service`注解标记实现类,指定接口类型和服务版本,Dubbo会自动扫描并暴露这个服务。 2. **配置文件**:Dubbo的配置通常在`dubbo.properties`或XML配置文件中进行,包括服务端口、注册中心地址、服务...

    Dubbo分布式服务框架

    2. **服务消费者(Consumer)**:服务消费者通过配置或者编程方式引用服务提供者提供的服务,Dubbo会自动进行服务发现和调用。消费者也可以配置消费策略,如异步调用、缓存策略等。 3. **注册中心(Registry)**:...

    Springboot整合Dubbo

    SpringBoot通过`@EnableDubbo`注解启动Dubbo的自动配置,这个注解会扫描并加载相关的配置,包括服务提供者和服务消费者的配置。 6. **测试与监控**: - 使用`@Autowired`的`MockMvc`进行服务接口的单元测试。 - ...

    SpringBoot-Dubbo.zip

    1. **自动配置**: SpringBoot通过`@EnableAutoConfiguration`注解自动配置了各种常见的Bean,如数据源、JdbcTemplate、Redis等,减少了大量XML配置。 2. **起步依赖(Starter)**: SpringBoot通过起步依赖提供了一种...

    dubbo test

    - 在Spring框架下,Dubbo可以通过XML配置或注解进行服务的声明式管理。服务接口、实现类、服务版本、调用超时、重试次数等都可以通过配置进行控制。 - Dubbo还提供了丰富的API,用于动态修改服务行为、监控服务...

    Springboot+Dubbo+Zookeeper船新版本

    2. 创建服务提供者,定义服务接口和实现,并通过Dubbo的@Service和@Reference注解进行服务暴露和服务引用。 3. 设置Zookeeper客户端,连接Zookeeper服务器,完成服务的注册与发现。 4. 使用Spring Boot的启动类启动...

Global site tag (gtag.js) - Google Analytics