使用Spring Beans和不使用Spring Beans有什么区别?

2023-12-24

可能我会得到很多反对票,但是对于我来说是否使用 bean 的所有事实都让我感到困惑。让我们假设这个例子

interface ICurrency {
       String getSymbol();
}


public class CurrencyProcessor {

    private ICurrency currency ;

    public CurrencyProcessor(ICurrency currency) {
        this.currency = currency;
    }

    public void doOperation(){
        String symbol = currency.getSymbol();
        System.out.println("Doing process with " + symbol + " currency");
        // Some process...
    }

}

因此,要注入 ICurrency impl 注入,我认为可以通过两种方式来实现:


方式一:不使用 Spring beans

public class CurrencyOperator {

    private ICurrency currency ;
    private CurrencyProcessor processor;

    public void operateDefault(){
        currency = new USDollarCurrency();
        processor = new CurrencyProcessor(currency)
        this.processor.doOperation();
    }

}

其中 USDollarCurrency 是 ICurrency 接口实现


方式2:使用Spring bean

@ContextConfiguration(classes = CurrencyConfig.class)
public class CurrencyOperator {

    @Autowired private ICurrency currency ;
    @Autowired private CurrencyProcessor processor;

    public void operateDefault(){
        this.processor.doOperation();
    }

}

@Configuration
public class CurrencyConfig {

    @Bean
    public CurrencyProcessor currencyProcessor() {
        return new CurrencyProcessor(currency());
    }

    @Bean
    public ICurrency currency() {
        return new USDollarCurrency();
}

我实在不明白使用Spring的bean有什么好处。我读了一些东西,但我最发现的是使用 DI 的好处,据我了解,两种方式都注入了CurrencyProcessor 所需的依赖项,正在改变的是我创建和使用对象的方式,我错了吗?具体来说,我的问题是: 1. 在这种情况下使用Bean有什么好处? 2.为什么我应该使用Spring而不是像第一种方式那样手动执行? 3. 说到性能,这两种情况哪个更好?


假设您有 2 个 DAO 类,第一个用于 Oracle,第二个用于 MySQL,并且两个类都实现 DAO 接口。您可以在 Spring 配置文件中将实现定义为 bean。在业务类中你有一个 DAO 类型的属性,而在 spring 配置文件中你选择真实类型 Oracle 或 MySQL 来注入或使用 spring 注解@Autowired

这减少了耦合,并且很容易从 Oracle 迁移到 MySQL。

@Service
public class Business {
    @Autowired
    private Dao daoImpl;

    //Business methods that invoks Dao methods 
}

在 Spring 配置文件(XML 文件)中,您使用以下内容:

<bean id="daoImpl" class="app.com.MySQLDaoImpl OR app.com.OracleDaoImpl"/>

只需更改 bean 的类属性,您就可以更改整个实现,而无需更改业务类!
祝你好运。

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

使用Spring Beans和不使用Spring Beans有什么区别? 的相关文章

随机推荐

  • 使用 sklearn 对单变量时间序列进行聚类

    我有一个 panda DataFrame 我想从中对每一列进行聚类 我正在使用 sklearn 这就是我所拥有的 data pd read csv data csv data pd DataFrame data data data set
  • 两个python脚本之间的通信

    一个方法论问题 我有一个 主 python 脚本 它在我的系统上无限循环运行 我想偶尔向它发送信息 例如 json 数据字符串 以及一些其他 python 脚本 这些脚本稍后将由我自己或另一个程序启动并在发送字符串后立即结束 我不能在这里使
  • WPF如何使文本框在按回车键后失去焦点

    我创建了一些文本框 我希望用户在其中输入十进制值 在我使用过的每个应用程序中 当我在文本框中输入内容并按 Enter 键时 该值将被接受并且文本框会失去焦点 我怎样才能在我的应用程序中做到这一点 我知道通过关键事件应该相对容易做到这一点 但
  • CQRS(事件溯源):具有多个聚合的预测

    我有一个关于 CQRS 架构上涉及多个聚合的投影的问题 例如 假设我有两个聚合WorkItem and Developer并且以下事件按顺序发生 但不是立即发生 工作项已创建 工作项Id WorkItemTitleChanged workI
  • 将索引中的 meta_search gem 与现有的地理编码器 gem 搜索集成 (rails)

    我已经使用地理编码器实现了基于位置的搜索 但在集成 meta search gem 时遇到了问题 我正在尝试将 meta search 集成到我的object controller index允许用户按对象过滤和排序搜索结果 attribu
  • Twitter API 错误 215

    今天 我们发现我的一位客户的 Twitter 信息被破坏了 我尝试切换到使用新的 API 1 1 但出现以下错误 errors message Bad Authentication data code 215 即使使用他们自己的示例也会生成
  • 透明、点击、始终位于顶部的 JFrame [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 因此 我目前有一个透明的 JFram
  • TweenLite 没有动画

    我正在尝试使用 GreenSocks TweenLite for Javascript 制作一个简单的上边距动画 我已经使用过该库很多次了 但是由于某种原因 这次它不起作用 注意 onComplete 正在触发 但是无论我使用什么元素 我都
  • 内容安全策略:允许所有外部图像?

    我希望只允许来自本地服务器的脚本 但有某些例外 例如 jQuery 等 但可以灵活地加载外部图像 我知道有一个像这样的指令 Content Security Policy script src self https apis google
  • 将 ADT 和 Android sdk 工具更新到最新版本 22 后出现类未找到错误

    早些时候它工作正常 当我将我的 adt 和 android sdk 工具更新到最新版本 rev 22 时 我的应用程序停止工作 下面是 logcat 输出 请帮忙 05 16 16 36 01 922 E AndroidRuntime 12
  • 使用 Highcharts.js 的圆边仪表

    我正在使用 Highcharts 创建自定义仪表 窗格形状应如所附图片所示为圆形 想知道是否有人知道如何使用该库实现此布局 这是http jsfiddle net ao9fv2yh http jsfiddle net ao9fv2yh 我正
  • Git:忽略已编译的 Google Go

    我编译的 Go 代码在 Linux 上没有以扩展结尾 对于处理忽略 gitignore 文件中的这些内容有什么技巧吗 如果您正在使用go您可以使用构建代码的工具 o标志来指定输出文件名 因此您可以使用go build o bin elf然后
  • .NET 世界中的 ORM 和 SOA [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 根据我的经验 NET 的主要 ORM 框架 NHibernate http nhforge org Linq 转 Sql http msdn m
  • 为什么 Android 会截断我的 ActionBar 标题?

    在我的应用程序中 我更改了 ActionBar 中显示的每个片段的标题 当我第一次启动我的应用程序时 我收到了一个请求列表 因此我的标题是 我的请求 20 然后 当您单击该列表中的某个项目时 它会替换我的活动中的一个片段 并将标题设置为 操
  • 如何在子例程内引用哈希?

    我正在尝试使用模块的 tie 功能配置 Ini文件 http search cpan org shlomif Config IniFiles 2 65 lib Config IniFiles pm但我不知道如何引用子例程内部的哈希 如果我从
  • 查询或过滤最小字段值?

    示例 存储在索引中的文档表示测试分数和有关每个测试的元数据 test 1 user 1 score 100 meta other data test 2 user 2 score 65 meta other data test 3 user
  • Pylint 未在 VScode 中按预期运行

    当我通过 shell 运行时pylint pylint decorator py No config file found using default configuration Module decorator C 7 0 Unneces
  • EC2 无法解析私有 DNS 主机名

    我是 Amazon Web Service AWS 的新手 我刚刚创建了一个 VPC 和一个位于其中的子网 但是 我无法解析该子网中的任何主机名 当我停留在该子网中的任何主机中时 ec2 user ip 192 168 1 86 nsloo
  • 根据 rowwise 函数 (dplyr) 过滤行

    您能帮我在下面的最后一个命令中使用过滤dplyr代替apply 我试图解决发布的问题here https twitter com delta dc status 585478403463245826 photo 1 library gtoo
  • 使用Spring Beans和不使用Spring Beans有什么区别?

    可能我会得到很多反对票 但是对于我来说是否使用 bean 的所有事实都让我感到困惑 让我们假设这个例子 interface ICurrency String getSymbol public class CurrencyProcessor