这是一种“什么是@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");
}
}
有两个版本的配置。
喜欢:
< bean id="someBean" class="package.SomeBean"></bean>
像:
@Service
public class SomeBean{...}
仅 差异是:
SomeBean
具有@Service
注释时,它会成功响应客户端,但当 NOT 具有时,客户端不会收到响应消息,尽管有没有例外。以下是问题:
答案 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。所以你可以用:
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");