春豆生活

时间:2011-08-08 15:19:42

标签: spring javabeans

我试图理解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?

谢谢,

4 个答案:

答案 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有很多好处。

  1. 您有一个IOC容器:http://en.wikipedia.org/wiki/Inversion_of_Control
  2. IoC容器节省了大量时间,消除了简单的任务,例如为数据库访问设置数据源。数据源可以自动注入
  3. 测试更容易,因为您可以轻松地拆开对象。

答案 3 :(得分:0)

将bean声明为XML文件或将其作为框架的注释提供,以了解它应该做什么。

enter image description here

预订: Just Spring