4

这是一种“什么是@Service注解”?问题,但用另一种方法。因为,我不确定这里发生了什么:

我有一个控制器类:

@Controller
public class GreetingController {
    @Autowired
    SomeBean someBean;

    @MessageMapping("/msg")
    public String msg() {
        someBean.handleMsg();
        return "";
    }
}

我尝试从内部someBean.handleMsg向目的地发送响应。像这样的一些事情:

public class SomeBean {
    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    public handleMsg() {
        messagingTemplate.convertAndSend("/topic/someTopic", "Response");
    }
}

两个版本的配置

  1. SomeBean 在.xml中配置:

喜欢:

< bean id="someBean" class="package.SomeBean"></bean>
  1. SomeBean 被注释为服务(在第一个它没有):

喜欢:

@Service
public class SomeBean{...}
  • 请注意,在这两种情况下,注入等没有任何问题。在这两种情况下,客户端都成功订阅、发送消息和处理消息。

唯一区别是:

  • SomeBean有注解时@Service,成功响应客户端,没有注解时,客户端收不到响应消息,虽然没有任何异常。

这是问题:

  • 在这种情况下,@Service 实际上是什么?有人可以解释一下这里发生了什么吗?
4

2 回答 2

2

@Service从技术角度来看,基于 xml 的配置几乎没有区别。这两种方法都用于将 Java 类声明为 Spring bean,这些 bean 在基于 Spring 的应用程序中被管理并用于依赖注入。

主要区别在于带有注释的类@Service是类路径扫描期间自动检测的候选。使用注解驱动的依赖注入,您不需要在 xml 配置中将每个 Java 类声明为 Spring bean。

这就是javadoc所说的:

表示带注释的类是“服务”,最初由域驱动设计(Evans,2003)定义为“作为独立于模型中的接口提供的操作,没有封装状态。”

也可能表明一个类是“业务服务外观”(在核心 J2EE 模式意义上),或类似的东西。此注释是通用的刻板印象,各个团队可能会缩小其语义并酌情使用。

这个注解作为@Component 的一个特化,允许通过类路径扫描自动检测实现类。

于 2015-03-31T17:10:34.353 回答
2

@Service:这告诉 Spring 它是一个 Service 类,您可能在其中有@Transactional等 Service 层相关的注释,因此 Spring 将其视为一个 Service 组件。

Plus@Service@Component. 假设 bean 类名为“CustomerService”,因为您没有选择 XML bean 配置方式,所以您对 bean 进行了注释@Component以指示它为 Bean。因此,您可以使用以下方法检索此 bean:

CustomerService cust = (CustomerService)context.getBean("customerService");

默认情况下,Spring 会将组件的第一个字符小写——从“CustomerService”到“customerService”。您可以使用名称“customerService”检索此组件。

就像@Component注解一样,如果您使用@Service注解,您可以为它提供一个特定的 bean 名称,如下所示:

@Service("myBeanName")
public class CustomerService{

您可以通过以下方式获取 bean 对象:

CustomerService cust = (CustomerService)context.getBean("myBeanName");
于 2017-11-09T13:35:31.147 回答