我正在尝试理解Spring bean背后的编程逻辑。在示例中,通常会为它们指定一个具体的名称,如"Duke“或"Kenny",此外,还会为xml中注入的构造函数和setter函数提供具体的值。我以更一般的方式来考虑bean,比如:
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?
谢谢,
发布于 2011-08-09 01:07:18
Spring通常是一个支持企业开发的框架,它几乎总是意味着嵌入了一些业务逻辑的某种web应用程序(GUI或API)。如果您要编写一个简单的Java web应用程序并为其提供一些有意义的结构--这意味着您的代码不会全部打包到一个没有责任划分的大型类中--您很快就会遇到这样的问题:“谁/什么应该负责创建这些类的实例?”以及,“实例如何获取它们所需的其他实例(依赖项)?”这些问题自然导致了对依赖注入/控制反转容器的需求,Spring就是这样的容器。
此外,如果你正在实践测试驱动的开发,任何新的开发人员都没有理由不去实践,你会发现“获取依赖项”这个问题更加紧张,因为与allows its dependencies to be injected对象相比,在内部创建自己的依赖项的对象非常难以测试。
这只是一个答案的最基本的开始,但如果它有帮助,如果还有其他我可以澄清的事情,请告诉我。
Spring:关于创建beans来表示每个的问题,学生:这不是--或者一般的依赖注入容器--打算使用的方式。您不会为应用程序中的每个学生编写XML bean定义。在不同的“种类”对象之间有一条有时模糊的界限。
有些对象具有不同的状态,将它们与相同类型的其他对象区分开来。我们倾向于将这种类型的对象称为“实体”或“域对象”。你的学生和老师都是完美的例子。这些对象的每个实例都代表一个特定的人。
另一种对象是没有区别于同类对象的不同状态的对象。更重要的是,它没有关于任何特定实体实例的状态。这方面的一个例子可能是数据访问对象(DAO),它封装并隐藏了与关系数据库交互的复杂性。它有状态,就像一个连接池,它从连接池中提取数据库连接以执行其工作,但无论您有一个DAO实例还是100个实例,它们都是相同的和可互换的。
我们总是使用Spring来管理后一类对象--相对于与之交互的其他对象而言是无状态的对象。通常,我们只创建其中的一个(scope="singleton",这是Spring的默认设置),并让Spring将它们连接在一起,以便填充所有依赖项。
对于另一类实体,有些人使用Spring向它们注入依赖项,有些人不这样做,但是没有人在XML文件中显式地将每个实体对象创建为Spring bean。实体总是使用new
操作符创建的,无论是由您创建的,还是由为您处理它们的其他框架创建的。不过,还有其他让Spring管理对象的方法。例如,using AspectJ,您可以这样编织字节码:当您调用构造函数时(就像使用new Student()
一样),不仅会创建实例,还会对其执行依赖项注入。这更像是你在实体中使用的DI风格。
发布于 2011-08-09 00:49:56
我认为您的困惑在于Java beans和Spring beans之间的区别。Spring beans是Java beans,但Spring通常管理的beans的级别更高。
Student
类是一个Java bean,可以在应用程序中用作“数据对象”(DAO)。它们将在运行时通过用户输入、数据库访问、从文件读取等创建。用于创建这些Student对象的类是Spring bean的更好候选者-这将是通常设计模式命名方案中的“StudentFactory”。
由StudentFactory管理Spring意味着生成学生的方法是可配置的。对于生产环境,您可以使用一个从数据库读取数据的DBStudentFactory
。对于测试,您可以有一个TestStudent
工厂,它只加载一个地图。
发布于 2011-08-09 00:46:38
使用bean有很多优点。
http://en.wikipedia.org/wiki/Inversion_of_Control
https://stackoverflow.com/questions/6984396
复制相似问题