使用注释来注入依赖项是否会消除依赖项注入(外部配置)的主要好处?

2024-01-28

我正在使用 Spring,这是一个控制器:

@Controller
public class PersonController {

@Resource(name="PersonService")
private PersonService personService;

    @RequestMapping(value = "/Person", method = RequestMethod.GET)
    public String getPersons(Model model) {

    // Retrieve all persons by delegating the call to PersonService
    List<Person> persons = personService.getAll();

    // Attach persons to the Model
    model.addAttribute("persons", persons);
    //then return to view jsp       
}

这是一项服务:

@Service("personService")
@Transactional
public class PersonService {

    public List<Person> getAll() {
        //do whatever
       }
}

但是,为了正确使用 DI,我应该更改控制器以使用接口(?),如下所示:

@Controller
public class PersonController {

@Resource(name="personService")
private IPersonService personService; //Now an interface
}

例如,这将允许我使用两项服务,一项是测试,一项是实时服务。我可以通过添加/删除服务上的注释来更改:

@Service("personService") // this line would be added/removed
@Transactional
public class LivePersonService implements IPersonService {

    public List<Person> getAll() {
        //do whatever
       }
}

and

@Service("personService") //this line would be added/removed
@Transactional
public class TestPersonService implements IPersonService {

    public List<Person> getAll() {
        //do something else
       }
}

然而,由于代码必须重新编译,主要好处之一就丧失了?然而,如果我使用 xml 查找,我可以即时更改依赖项吗?


配置仍然是外部的,因为它位于您定义哪个实现的外部即将被注射。在课堂上,你只需硬编码"name" of 某物班上依赖于取决于(这没关系,因为这种依赖性是类固有的)。

这就是说,你可以使用XML覆盖注释用于测试执行的代码(您将拥有用于测试的特定 XML 应用程序上下文)并指定您将注入哪个实现。

所以,你不需要改变你的代码运行测试。看看这个答案 https://stackoverflow.com/questions/4943475/can-spring-framework-override-annotation-based-configuration-with-xml-based-confi/4943673#4943673.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用注释来注入依赖项是否会消除依赖项注入(外部配置)的主要好处? 的相关文章

  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • 在 Java 中将字符串复制到文件的开头

    我想将一个字符串写入文件的开头 我该怎么做 我根本不知道如何添加字符串 这就是我到目前为止所做的 public static void prepend String filename String data throws IOExcepti
  • Netbeans 雷达插件配置

    我使用的是 Netbeans 8 0 1 在提交到 SVN 之前 我需要从 IDE 运行并检查 SonarQube 分析 我已经安装了 Netbeans Radar 插件 用于启动本地分析并检查结果 这个插件有一个名为 Get Issues
  • Java TCP Echo 服务器 - 广播

    我有一个简单的回显服务器 我希望当连接的用户向服务器键入任何内容时 所有其他客户端和该客户端都会收到消息 MOD 它现在不会发送给所有客户端 但它应该发送 而且我只是不知道我的代码出了什么问题 所以现在它只会将消息 MOD 发送给发送消息的
  • Runtime.getRuntime().exec(cmd) 挂起

    我正在执行一个命令 该命令返回文件的修订号 文件名 但如果执行命令时出现问题 应用程序就会挂起 我可以做什么来避免这种情况 请在下面找到我的代码 String cmd cmd C si viewhistory fields revision
  • 使用 PowerMock 和 TestNG 模拟单个静态方法

    class StaticClass public static String a return a public static String ab return a b 我想嘲笑StaticClass a以便它返回 x 并致电StaticC
  • 控制启动时的竞争条件

    我有一些代码想要执行一些一次性初始化 但这段代码没有明确的生命周期 因此在初始化完成之前 我的逻辑可能会被多个线程调用 所以 我想基本上确保我的逻辑代码 等待 直到初始化完成 这是我的第一次剪辑 public class MyClass p
  • 无法从 PDFA1-a 格式文档中提取图像

    我正在使用以下代码从 PDFA1 a 格式的 pdf 中提取图像 但我无法获取图像 List
  • 如何使用 Java 文档 API 为 OrientDB 数据库创建自动递增索引/序列?

    我通过其文档 API 将 OrientDB 与 Java 结合使用 我有一个简单的类叫做items它有一个属性ID 我明确声明架构如下 OSchema schema db getMetadata getSchema OClass items
  • 如何在 HashiCorp Vault 中安全地存储 Spring Boot 应用程序的机密?

    我已阅读以下教程 保险库配置 https spring io guides gs vault config 好的 我们安装了 Vault 服务器并放置了 2 对秘密属性 vault kv put secret gs vault config
  • Apache Camel - 路由中的事务

    我有一个关于 Apache Camel 的一般性问题 我无法找到聚合器是否已进行交易 如果是交易 交易是如何实现的 聚合的速度有多快 将消息发送到聚合器可以在事务中运行 您需要一个带有聚合器的持久存储来让传出消息充当事务 请参阅有关持久性的
  • 如何查找类路径中具有指定名称的所有资源?

    我想列出类路径中具有特定名称的所有文件 我预计会发生多次 因此Class getResource String 不管用 基本上 我必须识别类路径中任何位置具有特定名称 例如 xyz properties 的所有文件 然后累积读取其中的元数据
  • 使用会话空闲超时进行轮询

    我对 Tomcat 中的所有应用程序使用单点登录 我的要求是 我必须轮询应从后端获取的事务状态 但它也不应该影响会话的空闲超时 有人可以建议是否可以做点什么吗 Thanx 我不知道是否有标准方法可以做到这一点 如果没有 你可以写一个过滤器
  • TestMethod:异步任务 TestSth() 不适用于 .NET 4.0

    我正在尝试使用 NET 4 0 BCL Async 和 MsTest 运行异步测试方法 看来这个设置不能处理 测试方法 异步Task测试Sth 由于测试用例资源管理器中缺少条目 将签名更改为异步后void 我可以运行测试用例 但结果错误 根
  • 如何根据受保护的 String doInBackground 方法中 AsyncTask 的结果调用 Toast.makeText() ?

    我从 AsyncTask 中的数据库中获取数据 如果它为空 我想吐司一个警告文本 我在 AsyncTask 中尝试过 但我了解到它不是在工作线程中调用的 这是我的 doInBackground 方法 protected String doI
  • 枚举

    我试图拥有一组扩展通用接口的枚举 例如 interface Fooable void someCommonMethod enum E1 implements Fooable some enumuerations and a definiti
  • 在android中测量不规则多边形的面积

    我正在开发一个应用程序 在其中我在地图上绘制多边形 并且我使用的地图不是谷歌 它的Mapsforge开源离线地图库 我可以通过将地理点转换为像素点来轻松在地图上绘制多边形 但在这里我想发现是不规则的多边形 为此我做了很多尝试 但它让我失败了
  • Hibernate 返回 PersistentBag 而不是 List

    我在下面给出的两个实体之间有以下关系 当我从存储库获取 OutletProductVariety 对象时 即使在使用 fetchtype Eager 后 价格也会出现在 PersistentBag 中 而不是作为列表 Entity publ
  • 在 React 中使用 setTimeout() 并测试它

    我意识到我一直在使用setTimeout 在我的项目中 也许 比我应该做的更多 我进行了快速研究并浏览了 Github 上的一些开源 React 项目 并决定我应该询问一下 I use setTimeout主要是为了更改类名或添加样式以对
  • Cassandra 会话与集群 有什么可分享的?

    考虑 Cassandra 的 Session 和 Cluster 类 Java 驱动程序 我想知道有什么区别 在 Hibernate 中 每次都会创建一个会话并共享会话工厂 从许多来源我了解到 它被认为是创建一个会话并在多个线程之间共享它

随机推荐

  • 如何限制链接在新标签中仅打开一次?

    在我的代码中 单击链接后 我在新选项卡中打开一个 pdf 文件 但第二次单击后 如果该文件已打开 那么我想重定向到该文件的打开选项卡 而不是在新选项卡中打开 我的代码 span style margin left 10 a href ima
  • 操作方法:Teamcity + GitHub

    有人成功配置 Teamcity 以从 GitHub 进行监控 提取和构建吗 我似乎不知道如何在哪里以及如何配置 Teamcity 的 SSH 密钥 我将 Teamcity 作为系统服务在系统帐户下运行 那么 Teamcity 将其 SSH
  • 如何将形状为 64x4x4x3 的张量的形状更改为与网络输入相同的另一个形状?

    我正在尝试将 jpeg 压缩实现为 keras 中的噪声层 在我的实现过程中 我需要改变形状 我很困惑如何才能做到这一点 所以我尝试解释我做了什么以及我想做什么 首先 在下面的函数中 我生成了 8x8 块的所有 DCT 系数 该块生成形状为
  • Flask-SQLAlchemy数据库引擎返回表名,但元数据中的表键为空

    我已连接到 MS SQL Server 以下返回数据库中的所有表名 app config from object config db SQLAlchemy app db engine table names 然而 这并不 db metada
  • 直接通道使用与使用代理?

    正如标题所暗示的 我试图理解为什么在 WCF 中有时人们选择 生成代理 而不是使用 ChannelFactory 手动创建新的通道实例 我已经看过每一种的例子 但还没有真正找到任何解释为什么你会选择其中一种 老实说 我只与渠道合作过Chan
  • 响应式网站图像问题

    如果你看一下该网站 http cornerstonecastings com http cornerstonecastings com 这是我的第一个响应式网站 它是用 Wordpress 构建的 我遇到的问题是网站上图像的响应能力 如果您
  • DRF ListSerializer 和 ListField

    我在我的项目中使用 django rest 到目前为止我使用的对象列表列表序列化器 http www django rest framework org api guide serializers listserializer 当我需要列表
  • 将眼动追踪 .edf 文件转换为 ASC/CSV 格式

    我有 edf 格式的跟踪数据记录 SR RESEARCH eyelink 我想在 python 中将其转换为 ASC CSV 格式 我有 GUI 应用程序 但我想以编程方式 在 Python 中 进行操作 我找到了 pyEDFlib 包 但
  • 变量声明与变量绑定相同吗?

    MDN 文档 https developer mozilla org en US docs Web JavaScript Reference Statements let状态 let 绑定是在包含的 块 范围的顶部创建的 该声明通常称为 吊
  • Matlab - 加速嵌套 For 循环

    一个简单的问题 但我不太擅长 MATLAB 我有向量x n 1 y 米 1 和w x y 我想定义M n m x 1 as M i x 中小于或等于 w i 的元素数量 w 已排序 这只是没有削减它 N n m M zeros N 1 fo
  • ARMv8 AArch32模式是否向后兼容armv4、armv5或armv6?

    众所周知 ARMv8 AArch32 位模式完全向后兼容 ARMv7 架构 并且ARMv7向后兼容ARMv4 ARMv5te和ARMv6 从上面的说法 我们可以说ARMv8 AArch32模式也向下兼容ARMv4 ARMv5te和ARMv6
  • 如何手动打开休眠会话?

    我有一个相当大的项目 涉及 spring 和 hibernate 现在 我正在将某些对象从休眠状态恢复到内存中 但我遇到了一些障碍 我有以下设置 A 类包含多个基元和一个 B 类 B 包含基元和一个 C 类 以前是惰性加载 现在我有这个 服
  • 如何阻止嵌套列表与父列表重叠?

    看这里 http jsfiddle net wHztz 67 http jsfiddle net wHztz 67 在此示例中 颜色是背景图像的占位符 我注意到当嵌套列表停止重叠时display block被移除自 innerLeft ul
  • 部署后 ASP.NET 网站看起来有所不同

    我已经用谷歌搜索了这个问题的答案 但还没有找到任何答案 也许我使用的搜索词太通用了 无论如何 这里是 我发现了网页设计和 ASP NET 的乐趣 也发现了尝试在 IE 和所有其他浏览器中以相同方式显示内容的噩梦 我正在 VS2010 中工作
  • 使用R语言进行冒泡排序?

    我是编程新手 刚刚开始学习R语言 我正在尝试进行冒泡排序 但它显示以下错误消息 谁能帮我解决这个问题吗 x lt sample 1 100 10 n lt length x example lt function x for i in 1
  • 如何只显示 1 条得分最低的记录?

    我只想显示 DL 列表中的 1 条记录 该记录具有所有 DL 中的最低分数 目前它正在显示所有记录 在 stackblitz 的示例中 您可以看到第一条记录的 DL 分数为 54 20 并已更新 我不想显示所有 3 条记录 而是只想显示 1
  • 缺少 Idlj 编译器 (Linux/JDK 11)

    找不到idlj编译工具 idl文件 已检查 usr bin and usr lib jvm java 11 jdk 它不是和JDK捆绑在一起的吗 如何添加idlj编译器 附 我更喜欢Python 不太使用Java 如果这是一个愚蠢的问题 我
  • 从 facebookomniauth 获取名字和姓氏字段

    我现在正在我的应用程序中实现omniauth 功能 一切正常 除了我无法从 Facebook 上获取名字和姓氏 这是我的模型代码 def self from omniauth auth user User where email auth
  • 在 Python 3 中未显式打开文件时处理从字节到字符串的转换

    我使用 Requests 模块进行授权 然后从 Web API 中提取 csv 内容 并使其在 Python 2 7 中正常运行 我现在想在 Python 3 5 中编写相同的脚本 但遇到一些问题 iterator should retur
  • 使用注释来注入依赖项是否会消除依赖项注入(外部配置)的主要好处?

    我正在使用 Spring 这是一个控制器 Controller public class PersonController Resource name PersonService private PersonService personSe