Spring中@Service注释的功能

时间:2015-03-31 09:38:11

标签: java spring spring-mvc service spring-messaging

这是一种“什么是@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
  2. 中配置

    喜欢:

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

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

      差异是:

      • SomeBean具有@Service注释时,它会成功响应客户端,但当 NOT 具有时,客户端不会收到响应消息,尽管有没有例外。

      以下是问题:

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

2 个答案:

答案 0 :(得分:1)

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

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

这就是javadoc所说的:

  

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

     

也可能表明一个班级是“商业服务门面”(在   核心J2EE模式感觉)或类似的东西。这个注释是一个   通用刻板印象和个别团队可能会缩小他们的范围   语义和适当的使用。

     

此注释用作@Component的特化,允许   要通过类路径扫描自动检测的实现类。

答案 1 :(得分:1)

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

Plus @Service@Component的专精。假设bean类名称为“CustomerService”,因为您没有选择XML bean配置方式,因此您使用@Component注释bean以将其指示为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");