从Spring in Action一书中,有一个Spring Bean的例子。它使用Compact Disc
类比。当应用程序需要"The Beatles" album
时,它会创建"The Beatles" album bean
以及其他相册。
n
个相册,那么我应该创建n
个相册bean吗?n
相册在申请中的表示方式如何?它只是一个POJO域模型(不是bean)吗?答案 0 :(得分:1)
您只需拥有一个相册类并将其注释为@Component
或通过xml进行注释。
条款bean
和POJO
可以互换。按照Spring in action 4rd edition
,Spring努力成为一个非侵入式框架。
(...)基于Spring的应用程序中的类通常没有 表明它们被Spring使用。在最坏的情况下,一个类可以使用Spring的注释之一进行注释,但它本身就是一个POJO
和
尽管Spring大量使用bean和JavaBean这两个词 在引用应用程序组件时,这并不意味着Spring组件 必须遵循JavaBeans规范。一个Spring组件可以 任何类型的POJO。
简而言之,您引用的 Spring bean 只是在Spring应用程序的上下文中使用的POJO。如果使用xml映射而不是注释,那么您的类将只是另一个常规Java类,即普通旧Java对象。
答案 1 :(得分:1)
如果数据库中有n个专辑,那么我应该创建n个专辑bean吗?
我想不会。如果有 n 相册,那么将它们全部明确地包含在您的App.config
文件中是非常麻烦的,如果这是您所指的内容;但你可以。您可能会添加AlbumService (@Service)
@Bean
和关联的@Repository
来处理从DB中写入和检索它们。
如果不是,n个专辑在申请中如何表示?它只是 POJO域模型(不是bean)?
您可以拥有一张包含相册属性的Album
@Entity
bean。保存相册时,您需要设置属性,而不是让各个组件实现通用界面。您的数据库中会包含 n 个相册。例如,如果您只需要检索一个披头士专辑,您可以根据专辑标题进行查询。如果你想要它们,你可以做albumService.findAll()
;并获得它们的容器。
使用Spring Bean的真实用例是什么?
Spring是Spring Bean的真实用例。根据{{3}}:
在Spring中,构成应用程序主干的对象 由Spring IoC容器管理的bean称为bean。一个豆子 是一个实例化,组装和管理的对象 一个Spring IoC容器。否则,豆只是其中之一 应用程序中的对象。豆类,以及它们之间的依赖关系, 反映在容器使用的配置元数据中。
我无法提供比文档中包含的内容或此Spring IoC Container Reference中提供的内容更好的答案。
答案 2 :(得分:1)
如果我是你,我会偏离光盘作为Spring bean的类比,特别是关于你后来的问题。很明显,无论您使用的是XML配置还是Java配置,任何Java对象都可以在Spring中声明为bean。
我们假设我有这两个类:
public class Foo {
private String s;
private Bar bar;
// getters & setters
}
public class Bar {
private int i;
// getter & setter
}
我可以通过在XML配置文件中声明它来使前者成为Spring Bean:
<bean id="foo" class="demo.Foo">
<property name="s" value="Hello, World!" />
<property name="bar">
<bean class="demo.Bar">
<property name="i" value="10" />
</bean>
</property>
</bean>
现在,使用以下两行代码:
ApplicationContext ctx = new ClassPathXmlApplicationContext("app.xml");
Foo foo = ctx.getBean(Foo.class);
可以检索已配置的foo对象,并将设置其所有属性,包括bar
。这是Spring的核心用例,即允许您配置应用程序的构建块如何在运行时解析其依赖项。最初Spring完全是关于代码之外的配置,但现在焦点已经略有改变,包括组件扫描和Java配置......
无论如何,以这个简短的例子结束,下面的代码行将打印10:
System.out.println(foo.getBar().getI());
在这个例子中,我选择了Foo和Bar,但它也可以是Web服务,实现一些业务逻辑的服务,数据库,ORM外观,模板引擎,线程池,任何东西......但是主要是处理数据对象的组件,而不是数据对象本身,尽管这是完全可能的。
现在回到您的用例,在Spring应用程序中,如果我使用数据库编写Web应用程序,我通常会拥有这些组件:控制器(Web边界),服务(用于业务逻辑),存储库(用于查询),当然还有数据源。我不会在这里深入研究太多细节(例如没有声明性事务)。请注意,使用此配置时,没有特定的数据提供程序编译到我的Java代码中,它仍保留在配置中:
<bean id="cdController" class="demo.compactdisc.CdController">
<property name="cdService" ref="cdService" />
</bean>
<bean id="cdService" class="demo.compactdisc.CdServiceImpl">
<property name="cdRepository" ref="cdRepository" />
</bean>
<bean id="cdRepository" class="demo.compactdisc.CdRepositoryImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="test"/>
<property name="password" value="s3cr3t"/>
</bean>
使用您的域,存储库会将光盘从数据库返回到服务,将服务返回给控制器,将控制器返回给用户。光盘不会被描述为Spring bean,但肯定是参数并从实际的Spring bean返回值。