gpt4 book ai didi

spring - 为什么使用spring bean而不是对象初始化

转载 作者:行者123 更新时间:2023-12-02 02:55:39 27 4
gpt4 key购买 nike

我试图理解 Spring Bean 的想法以及为什么我应该使用它们。如果我创建一个 bean 并用它来打印这样的东西。

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Account acc = (Account)context.getBean("account");
acc.printAccName();

为什么不像这样创建该类的对象
Account acc2 = new Account();
acc.printAccName();

我一直在观看一些视频并阅读了一些内容,但我没有得到答案,为什么它更好。

最佳答案

通常你注入(inject)的是业务逻辑或服务,它们通常是系统中的变化。

您正在尝试注入(inject)域对象 Account这些对象不会更改,因此可以通过 new 创建对象。也许,这就是它让你感到困惑的地方。

这个想法是让容器处理定期更改的逻辑或服务的实例化,这样您就可以轻松交换它们而无需打开客户端类,因为这些可能已经在生产中、经过测试,并且开发人员可能会引入新的错误并打破东西。避免这种情况的一种方法是遵循称为 Open-Closed principle 的原则。 .然后你对抽象进行编码,这样你就可以通过依赖注入(inject)轻松地注入(inject)具体的实现。

想象以下场景。对于书店,您有不同的实现方式来将书籍保存到数据库中,例如使用 JDBC BookServiceJDBCImpl ,或使用 ORM BookServiceHibernateImpl ETC..

    // Create & get the Spring container, where you configure your implementations
// e.g. bookServiceJDBC, or bookServiceHibernate
ApplicationContext container = new ClassPathXmlApplicationContext("spring-config.xml");

// the container loads the appropriate bean say bookServiceHibernate
BookService bookService = (BookService) container.getBean("bookService");

//Create a new book this is a domain object usually you use new
Book newBook = new Book("1234", "Spring in Action","Rod Johnson");
//Now save the book using the implementation defined in the
//container
bookService.registerNewBook(newBook);

这就是容器文件的一部分的样子,在这里你定义了具体的实现:
<bean id="bookService" class="service.BookServiceHibernateImpl"/>

通过让容器处理这个问题,您可以注入(inject)不同的实现,而无需接触客户端类,甚至无需知道将传递哪个实现。

检查此 Dependency Injection blog post它解释了一种使用 Spring 实现它的方法。

请记住,在 Spring 中,您可以使用 java 注释或 xml,并且有不同的方式来注入(inject)依赖项,例如通过 get/set、构造函数等,这只是一般 DI 概念的说明性示例。设计取决于开发人员。

关于spring - 为什么使用spring bean而不是对象初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49619248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com