使用弹簧定型的优点?
Posted
技术标签:
【中文标题】使用弹簧定型的优点?【英文标题】:Advantages of using spring stereotypes? 【发布时间】:2013-04-09 17:17:33 【问题描述】:我正在使用 spring-mvc 开发一个 Web 应用程序。
现在@Controller、@Service 和@Repository 构造型可用。
我发现@Controller 特别有用,特别是因为我正在使用
<context:component-scan base-package="my.cool.controller"/>
现在,关于@Service 和@Repository,到目前为止看起来像
-
如果使用正确的构造型注释类,则可以更好地处理异常,好的,我承认这是一个优势
我可以对服务和 DAO/存储库使用组件扫描,但是我不喜欢使用组件扫描的想法,因为它会减慢应用程序的启动时间,这对我来说是一个关键功能(即使只需 1 秒,我每周重新部署一次)
那么,除了更好的例外,还有其他优势吗?注释类对性能有影响吗?
【问题讨论】:
看看这个***.com/questions/5645864/… 【参考方案1】:刻板印象的解释:
@Service
- 使用 @Service 注释所有服务类。该层知道工作单元。您所有的业务逻辑都将在服务类中。通常,服务层的方法都包含在事务中。您可以从服务方法进行多次 DAO 调用,如果一个事务失败,所有事务都应该回滚。
@Repository
- 使用 @Repository 注释所有 DAO 类。您所有的数据库访问逻辑都应该在 DAO 类中。
@Component
- 使用组件原型注释您的其他组件(例如 REST 资源类)。
@Autowired
- 让 Spring 使用 @Autowired 注解将其他 bean 自动连接到您的类中。
@Component
是任何 Spring 管理的组件的通用原型。 @Repository
、@Service
和 @Controller
是 @Component
的特化,用于更具体的用例,例如,分别在持久层、服务层和表示层中。
使用它们的原因:
使用@Repository 或@Service 而不是@Component 的主要优点是可以轻松编写一个AOP 切入点,例如,所有使用@Repository 注释的类。 您不必在上下文 xml 文件中编写bean
定义。而是注释类并通过自动装配来使用它们。
专门的注释有助于清楚地划分应用层(在标准的 3 层应用中)。
现在,使用上下文 xml bean 和注释对性能的实际影响是相同的。组件扫描有点贵(当您扫描@Service 时,@Component)。注释通过反射“解析”,xml - 使用 xml 解析器。但是,正如您所说,这是启动时间 - 它只发生一次。在中等机器上,即使有注释,它也能很快启动。
【讨论】:
我不是自动装配的忠实拥护者,老实说,我更喜欢手动指定注入哪个 bean(使用 xml),使用 intellij 之类的工具,阅读代码没什么大不了的。除此之外,AOP 似乎很有趣,你能编辑你的答案并提供一个简单的例子吗(真的不需要代码,只是一个用例) 请浏览以下网站的文章:static.springsource.org/spring/docs/3.0.x/… 和mkyong.com/spring3/spring-aop-aspectj-annotation-example【参考方案2】:组件扫描使您免于通过 xml 或 java 配置手动定义每个 bean。
有多种立体类型来定义服务层、数据层等层。同样基于不同的立体类型,如果你想做一些特定的事情,那么你可以这样做。
【讨论】:
我知道组件扫描是做什么的,我也知道它是有代价的,使用xml对我来说没有问题。关于刻板印象和层次,很好,但是“如果你想做一些特定的事情,那么也可以基于不同的立体类型。”方法?有什么例子吗? 我的意思是,如果需要,您可以定义更多立体类型来创建更多层。 公平地说,这与说包或命名约定相比有什么优势(这里是魔鬼的拥护者,不要误会我的意思:)以上是关于使用弹簧定型的优点?的主要内容,如果未能解决你的问题,请参考以下文章