我试图理解Spring的bean背后的编程逻辑。在示例中,通常给它们一个具体的名称,如“Duke”或“Kenny”,而且还给出了以xml注入的构造函数和setter的具体值。我更多地考虑豆类,比如说:
Student basicStudent = new Student(grade, name); // gives me certain amount of flexibility where say for grade and name I can have different values, then I can deploy this new student to database. And every unique web request, lets say, I can recreate various instances of different students with this line.
但是用.xml我该怎么办?我检索具有预定义值的静态bean:
Student Bob= (Student)appContext.getBean("Bob"); // where this bean is set with predefined values
希望我的困惑能被理解,我想不到Spring Beans的应用。我不是生产开发人员,只是学生,所以我可能会错过这里的一些重要概念。为什么我需要具有类的唯一实例的预加载bean?
谢谢,
答案 0 :(得分:2)
我认为你的困惑在于Java bean和Spring bean之间的区别。 Spring beans 是 Java bean,但Spring通常管理的bean类型更高。
Student
类是一个Java bean,可以在应用程序中用作“数据对象”(DAO)。它们将在运行时从用户输入,数据库访问,从文件读取等创建。用于创建这些Student对象的类是Spring bean的更好的候选者 - 这将是一个通常的设计模式命名方案中的'StudentFactory'。
使用Spring管理的StudentFactory bean意味着生成学生的方法是可配置的。对于生产,您可以从数据库中读取DBStudentFactory
。对于测试,您可以拥有一个只加载Map的TestStudent
工厂。
答案 1 :(得分:1)
Spring通常是一个支持企业开发的框架,它几乎总是意味着某种嵌入了一些业务逻辑的Web应用程序(GUI或API)。如果您要编写一个简单的Java Web应用程序并为其提供一些有意义的结构 - 这意味着您的代码并非全部包含在一个没有责任分工的大型类中 - 您很快就会开始遇到类似的问题, “谁/什么应该负责创建这些类的实例?”并且,“实例如何获得他们需要的其他实例(依赖项)?”这些问题自然导致需要依赖注入/控制反转容器,Spring就是这样。
此外,如果你正在练习测试驱动的开发,没有任何理由让任何新的开发人员不进行练习,你会发现“获取依赖关系”问题的进一步紧张,如与allows its dependencies to be injected的对象相比,内部创建自己的依赖项的对象很难测试。
这只能是答案的最开始,但如果有帮助,请告诉我,如果还有其他问题我可以澄清。
更新:关于创建bean来代表每个学生的问题:这不是一般的Spring - 或依赖注入容器 - 的使用方式。您不会为应用中的每个学生编写XML bean定义。在不同的“种类”物体之间存在有时模糊的界限。
有些对象具有不同的状态,可以将它们与同类型的其他对象区分开来。我们倾向于将这种类型的对象称为“实体”或“域对象”。您的学生和老师就是完美的榜样。这些对象的每个实例都代表一个特定的人。
另一种对象是具有 no 不同状态的对象,它将其与同类型的其他对象区分开来。更重要的是,它没有任何特定实体实例的状态。这方面的一个例子可能是数据访问对象(DAO),它封装并隐藏了与关系数据库交互的复杂性。它具有状态,就像连接池一样,它为了完成它的工作而从中提取数据库连接,但无论你有DAO还是100的一个实例,它们都是相同的并且可以互换。
我们总是使用Spring来管理后一类对象 - 与他们交互的其他对象相比无状态的对象。通常,我们只创建其中一个(scope =“singleton”,这是Spring的默认值),让Spring将它们连接在一起,以便填充所有依赖项。
对于其他类别 - 实体 - 有些人使用Spring将依赖项注入其中,而有些人则不这样做。但是,没有人明确地将每个实体对象创建为XML文件中的Spring bean。实体总是使用new
运算符创建,无论是由您还是由您处理它们的其他框架。但是,还有其他方法可以让Spring管理一个对象。例如,using AspectJ,你可以编织字节码,这样当你调用构造函数(比如new Student()
)时,不仅创建了实例,而且Spring也对它执行依赖注入。这更像是你将与实体一起使用的DI风格。
答案 2 :(得分:0)
使用bean有很多好处。
答案 3 :(得分:0)