Stackoverflow的见解:投票最多的是Spring 4问题

在Stackoverflow上对Spring 4问题进行最投票和回答最多的是什么? 以下是最常见的五个问题和解答。

  1. Spring中的@ Component,@ Controller,@ Repository和@Service批注有什么区别,它们可以互换使用还是具有特定功能?
  2. @Transaction注释在哪里? DAO类,调用DAO的服务还是两者?
  3. @Inject和@Autowired有什么区别? 在什么条件下使用哪一个?
  4. 我应该使用@Resource或@Autowired哪个注释? 有什么区别?
  5. Spring Framework的用途是什么?

Spring中的@ Component,@ Controller,@ Repository和@Service批注有什么区别,它们可以互换使用还是具有特定功能?

这些构造型旨在标记多层应用程序中的不同层。 业务,表示层和持久层中的组件分别由@ Service@ Component和@Repository进行注释,如下所示:

  • 数据访问组件带有@Repository批注
  • 服务组件@Service
  • 控制器组件带有@Controller批注
  • 其他任何组件都用@Component注释。

所有这些注释本身都使用@Component进行注释 所以问题是:我们可以对所有自动扫描的类使用@Component吗? 是的,没有!

所有带有此批注标记的类都将被自动扫描,但是,由于这些批注旨在帮助开发人员清楚地传达组件的意图,因此不会被视为一种好的做法。

这些注释的技术互换性有一个例外。 @Repository标记为其注释的所有bean赋予特殊行为。 PersistenceExceptionTranslationPostProcessor自动将持久性异常转换应用于标记有@Repository的任何bean。

考虑一下Spring框架参考手册中的以下段落。

后处理器自动查找所有异常转换器(PersistenceExceptionTranslator接口的实现),并建议所有标有@Repository批注的bean,以便发现的转换器可以拦截适当的转换并将其应用于引发的异常。

进一步的考虑是,在Spring框架的未来版本中,使用这些批注可能会传达与其各自层有关的特殊功能,并且通过适当地使用这些批注,您可以确保您的应用程序将受益于此类功能,而无需进行重构或进行最少的重构。

原始问题和答案可以在Stackoverflow网站上查看。 感谢以下回答它们构成本文一部分的海报: akash746 , nijogeorgep和Colin McCree提出了原始问题。

DAO类,调用DAO的服务还是两者?

答案分为两个阵营:那些赞成在服务层上注释类的人,以及那些对DAO进行注释的人。

服务层

传统的Spring体系结构建议事务性语义位于服务级别。 操作的原子性应为我们的决定提供依据。 事务注释应放在所有不可分割的操作周围。 考虑汇款的经典示例。 它包含以下调用:

  1. 记入发送帐户
  2. 扣款收款人帐户

这两个事务都必须成功或失败,因此事务必须同时包含调用1和2。

如果服务层必须在数据访问层中的DAO上调用不同的方法以执行完整的操作,并且其中一个调用失败,而其他成功则可能导致数据库状态不一致。 因此,在服务层进行的调用周围注释将保护操作的原子性。

为了进一步确定,您可能希望通过添加@Transactional(propagation = Propagation.MANDATORY)在数据访问层中注释借方和贷方通话。 这将确保事务已在调用方中启动,并且如果不存在活动事务,则将引发异常。

与在DAO方法上进行直接注释相比,对服务层进行注释可能会导致更持久的事务。 您做出的选择将取决于业务逻辑所需的级别事务隔离。

领域驱动设计正在出现一种新兴趋势。 Spring Roo是这种趋势的一个很好的例子。

这样做的目的是使域对象比传统的Spring架构丰富得多,通常它们是贫血的,尤其是将事务和持久性语义放在域对象本身上。

在仅需简单的CRUD操作的用例中,Web控制器将直接在域对象上运行(在此上下文中充当实体),并且没有服务层。

如果域对象之间需要某种形式的协调,则可以按照传统使用@Transaction来具有服务bean句柄。 您可以将域对象上的事务传播设置为REQUIRED之类,以便域对象使用任何现有事务,例如在服务bean处启动的事务。

原始问题和答案可以在Stackoverflow网站上查看。 感谢以下回答这些问题的张贴者,这些张贴者构成了本文的一部分: Willie Wheeler , Michael Wiles , mnp , tweekran , djt和Thomas Einwaller提出了原始问题。

在什么条件下使用哪一个?

简短的答案:没有区别,可以互换使用。

更详细地,@ Inject注释是Java EE 7的上下文和依赖性注入框架的一部分( JSR 346另请参见JSR 365 for Java 2.0),而@Autowired是Spring框架自己的实现(请参阅Java doc )。

原始问题和答案可以在Stackoverflow网站上查看。 感谢以下回答它们构成本文一部分的海报: pap和Rachel提出了原始问题。

有什么区别?

@Autowired (或@Inject )和@Resource批注具有相同的功能。 但是有一个概念上的区别:

  • @Resource应该用于通过名称获取已知资源。 名称是从带注释的设置器或字段中提取的,或者是从注释的名称参数的名称中获取的。
  • @Inject@Autowired批注尝试按类型注入合适的组件。

本质上,这是两个不同的概念。 令人失望的是,Spring的@Resource批注实现具有内置的回退,当解析按名称失败时会触发该回退。 它回退到@Autowired批注所使用的分辨率类型。 尽管这种回退很方便,但是由于人们没有意识到概念上的差异,因此可能会造成混乱,并且倾向于使用@Resource进行基于类型的注入。

选择依赖项的方式特定于注释。 以下是每个批注解决注入的方式:

@Autowired和@Inject

  1. 按类型匹配
  2. 受预选赛限制
  3. 按名称匹配

@资源

  1. 按名称匹配
  2. 按类型匹配
  3. 受限定词限制(如果按名称找到匹配项则忽略)

Spring参考手册中的这句话建议使用@Resource而不是@Autowired ,其中首选使用名称注入。

如果您打算通过名称表示注释驱动的注入,则即使技术上可以通过@Qualifier值引用bean名称,也不要主要使用@Autowired 而是使用JSR-250 @Resource批注,该批注的语义定义是通过其唯一名称标识特定的目标组件,而声明的类型与匹配过程无关。

由于这种语义差异的特定结果,本身定义为集合或映射类型的bean无法通过@Autowired注入,因为类型匹配不适用于它们。 对此类bean使用@Resource ,通过唯一名称引用特定的collection或map bean。

@Autowired适用于字段,构造函数和多参数方法,从而允许在参数级别缩小限定符注释的范围。 相比之下,只有具有单个参数的字段和bean属性设置器方法才支持@Resource 因此,如果注入目标是构造函数或多参数方法,请坚持使用限定符。

原始问题和答案可以在Stackoverflow网站上查看。 谢谢以下海报谁的答案这篇文章的组成部分: 卡尔蒂克 , 斯蒂芬 , Ichthyo和mlo55谁问原来的问题。

Spring Framework的用途是什么?

Spring Framework可以描述为三种方式:

  1. Spring是用于依赖项注入的框架:一种设计模式,允许开发人员通过将依赖项注入到类中来构建非常分离的系统。
  2. 它优雅地包装了Java库,从而使它在您的应用程序中更容易使用。
  3. 该框架中包括常用模式的实现,例如REST和MVC Web框架,这些模式主要在Web应用程序中使用。

原始问题和答案可以在Stackoverflow网站上查看。 感谢以下回答这些问题的海报,它们是本文的一部分: karstensrage和maksim ,他们提出了原始问题。

我希望您发现对stackoverflow上最受欢迎的问题的理解很有意思。 如果您有任何反馈意见,请发表评论。 可以在这里找到本文的原始文章: Stackoverflow的见解:Spring 4投票最多的问题。

如果您对设计模式感兴趣,那么您可能会对我的新书感兴趣: Professional Java EE Design Patterns 。 对于想要更有效地使用Java EE的任何人来说,它都是一个完美的伴侣,并且是涵盖解决实际问题的设计模式的理论和应用的唯一资源。

翻译自: https://www.javacodegeeks.com/2016/02/insights-stackoverflow-voted-spring-4-questions.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java记录登陆时间_Spring security如何实现记录用户登录时间功能

一、原理分析spring security提供了一个接口 AuthenticationSuccessHandler,该接口中只有一个方法,用来进行登录成功后的操作public interface AuthenticationSuccessHandler {/*** Called when a user has been successfully authenticated.** param request the r…

bzoj3680

$模拟退火$ $这种全局最优的问题用模拟退火$ $模拟退火就是每次向四周随机移动,移动的幅度和温度成正比,如果新的位置更优就接受,否则按一定概率接收,概率和温度成正比$ $最后稳定后再在最优解附近蹦跶几下看看有没有更好的$ $你问…

JLBH示例3 –吞吐量对延迟的影响

在这篇文章中: 关于吞吐量对延迟的影响的讨论 如何使用JLBH测量TCP回送 添加探针以测试TCP往返的两半 观察增加吞吐量对延迟的影响 了解必须降低吞吐量才能在高百分位数时获得良好的延迟。 在帖子中,我们看到了考虑协调遗漏的影响或测量延迟一次迭…

java 输入正整数n_java如何输入一个整数 c语言如何输入一个正整数N,再输入N个整数,按从小......

导航:网站首页 > java如何输入一个整数 c语言如何输入一个正整数N,再输入N个整数,按从小... java如何输入一个整数 c语言如何输入一个正整数N,再输入N个整数,按从小... 相关问题: 匿名网友: 可以通过”Scanner“函数 直接输入参数的形式,来实现输入语句,举例: impor…

fastJson去掉指定字段

public static String filterFieldsJson(Object src, Class<?> clazz, String... args) { SimplePropertyPreFilter filter new SimplePropertyPreFilter(clazz, args); return JSON.toJSONString(src, filter); }转载于:https://www.cnblogs.com/Eilen/p/8377953.html

maven依赖最佳实践_Maven最佳实践

maven依赖最佳实践尽管Maven提供了“配置之上的约定”解决方案&#xff0c;但是仍然有足够多的必要配置引起严重的头痛。 在这篇文章中&#xff0c;我将与您分享一些最佳实践&#xff0c;以简化对POM文件的维护。 请勿使用已弃用的引用&#xff0c;例如$ {artifactId}或$ {pom.…

PHP 异常处理

PHP 异常处理 异常用于在指定的错误发生时改变脚本的正常流程。 异常是什么 PHP 5 提供了一种新的面向对象的错误处理方法。 异常处理用于在指定的错误&#xff08;异常&#xff09;情况发生时改变脚本的正常流程。这种情况称为异常。 当异常被触发时&#xff0c;通常会发生&a…

如何使用Elixir和Phoenix快速入门构建CRUD REST API

这篇文章将展示如何使用Elixir和Phoenix框架构建REST API。 重点将是为持久化到Postgres数据库后端的模型提供CRUD&#xff08;创建&#xff0c;读取&#xff0c;更新&#xff0c;删除&#xff09;端点。 我应该警告你&#xff1b; 这是一个简单的例子。 但是&#xff0c;希望它…

01背包(修订版)

由于时间比较充裕&#xff0c;重新修订一部分。 这次把一些补充的放进来&#xff0c;其他的基础说明见后半部分 这些一共说明&#xff1a;01背包、完全背包、多重背包 将会详细说明。 三种背包混合、二维背包、分组背包、依赖背包、泛化背包 将大致说明。 01背包 如上次说明一…

java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...

前言需求今天我们学习的是马踏棋盘算法&#xff0c;我们还是从一个场景里引入看看马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的66棋盘Board0&#xff5e;5的某个方格中提示&#xff1a;马按走棋规则(马走日字)进行移动要求&#xff1a;每个方格只进入一次&#xff…

app engine_App Engine中的Google Services身份验证,第2部分

app engine在本教程的第一部分中&#xff0c; 我介绍了如何使用OAuth进行Google API服务的访问/身份验证。 不幸的是&#xff0c;正如我稍后发现的那样&#xff0c;我使用的方法是OAuth 1.0&#xff0c;显然现在Google正式弃用了OAuth 1.0&#xff0c;改用OAuth 2.0版本。 显然…

Django知识总结(一)

壹 ● 有关http协议 一 ● 全称 超文本传输协议(HyperText Transfer Protocol) 二 ● 协议 双方遵循的规范 http协议是属于应用层的协议(还有ftp, smtp等), 即浏览器请求消息和服务器响应消息的一系列规则 三 ● http协议的特性 http是无状态、无连接的协议(stateless, connect…

java数组使用实验报告_JAVA数组与类的定义-java实验报告

JAVA数组与类的定义-java实验报告JAVA数组与类的定义-java实验报告、实验目的与要求1、 熟悉Java类、对象和方法的一般操作练习等。2、 熟悉数组等的定义和使用。二、实验内容及步骤(包括源程序和运行结果截图)1. 编写Java小应用程序&#xff0c;程序中自定义一个方法&#xff…

JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)

Java EE 7已经存在了几年&#xff0c;它提供了一些非常有用且期待已久的功能&#xff0c;例如实体图以及对存储过程和结果映射的更好支持。 有关概述&#xff0c;请参阅Thorben Janssen的博客文章 。 但是&#xff0c;我想添加有关JPA查询语言功能的更详细的摘要。 在JPQL和Cri…

mysql+if+x+mod+2_Windows 下 MantisBT 2.X + Apache 2.4 + PHP 7 + MySQL 5.7 的环境配置

Apache 2.4.25~ Visual C Redistributable for Visual Studio 2015PHP 7.1.3~ mod_fcgid-2.3.9Mantisbt-2.2.1MySQL Database 5.7.17~ NET Framework 3.5安装 Apache前期准备1.若计算机已安装了 Apache2.4 以前的版本&#xff0c;请自行卸载并删除安装目录。2.以管理员身份运行…

ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性

一、ActionMethodSelectorAttribute 其是一个抽象类&#xff0c;继承自Attribute&#xff0c;子类有NonActionAttribute、HttpGetAttribute、HttpPostAttribute、HttpPutAttribute、HttpDeleteAttribute、HttpPatchAttribute、HttpHeadAttribute、HttpOptionsAttribute和Accept…

java 中map_Java中Map集合

1. Java中Map集合1. Map中value可以重复&#xff0c;key不能重复。对于重复的key值来说&#xff0c;后放置的值对覆盖前放置的值。import java.util.HashMap;public class MapTest1{public static void main(String[] args){HashMap map new HashMap();map.put("a",…

如何在Java中对文件进行模式匹配和显示相邻行

最近&#xff0c;我们在jOOλ0.9.9中发布了有关超棒的窗口函数支持的文章 &#xff0c;我相信这是对我们所做的库的最佳补充。 今天&#xff0c;我们将在一个用例中研究窗口函数的出色应用&#xff0c;该用例受到以下堆栈溢出问题Sean Nguyen的启发&#xff1a; 如何从Java 8…

64位内核第二讲,进程保护之对象钩子

64位内核第二讲,进程保护. 一丶什么是保护. 什么是保护. 比如我们安装了xxx杀毒软件.那么此时你用任务管理器关闭.是关闭不了的.原因是内核已经做了保护. 那么去掉保护的前提就是你要给自己的软件做保护. 比如我们给计算器做保护. 例如下图. 做保护.以前的病毒作者.都是想要退出…

java 类 request_java普通类得到request对象

使用拦截器import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.…