2015-03-31 49 views
2

这是一种“什么是@Service注释?”问题,但用另一种方法。因为,我不知道是怎么回事:Spring中@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> 
    
  2. SomeBean被注释为服务(在第一一个它没有):

像:

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

只有区别是:

  • SomeBean@Service注解,它给客户端成功的响应,但是当它有,客户端不接收响应消息,虽然没有任何例外。

这里有一个问题:

  • 在这种情况下,究竟是什么呢@服务?有人能解释一下这里发生了什么吗?
+0

获得bean对象没有文件包org.springframework.stereotype的service.java指明服务注释为何使用?我看到它的确如此。 – 2015-03-31 12:04:08

+0

我很难相信你对事件的描述;由于多种原因,未能发送消息会产生相应的异常。其他的东西是不同的。你可能会考虑在服务方法中设置一个断点,并在每种情况下逐步完成。 – chrylis 2015-03-31 17:20:45

+0

@chrylis,也许你是对的,我也想知道为什么我没有得到任何异常,但只是默默无闻的客户端收到什么,当没有服务注释。 – 2015-03-31 17:37:42

回答

1

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

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

这是javadoc这样说:

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

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

此批注用作@Component的特殊功能,允许通过类路径扫描自动检测 实现类。

+0

谢谢ksokol。那么你能否告诉我,在我的问题中,2例中的行为应该是相同的?我确实读过这个javadoc,但我无法解释我的情况,所以我虽然错过了一些东西。 – 2015-03-31 17:35:26

+0

@ mert-mertce是的,你是对的。行为完全一样。 – 2015-03-31 18:26:17

1

@Service:这告诉Hibernate它是一个服务类,您将有@Transactional等服务层相关的注解,因为Hibernate把它当作一个服务组件。

Plus @Service是@Component的进步。假设bean类名称为CustomerService,因为您没有选择XML bean配置方式,因此您使用@Component注释bean以将其指示为Bean。所以在获取bean对象时CustomerService cust = (CustomerService)context.getBean("customerService");默认情况下,Spring将小写组件的第一个字符 - 从'CustomerService'变为'customerService'。你可以用'customerService'来检索这个组件。

但是如果你使用@Service注解为bean类,你可以通过

@Service("AAA") 
public class CustomerService{ 

提供其特定的bean的名称,你可以通过

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