[英]Wiring Database Object with Spring Bean
从“ Spring in Action”一书中可以看到一个Spring Bean的示例。 它使用Compact Disc
类比。 当应用程序需要"The Beatles" album
,它将创建"The Beatles" album bean
以及其他唱片集。
n
相册,那么我应该创建n
相册bean吗? n
张专辑? 仅仅是POJO域模型(不是bean)吗? 您只需要具有一个Album类并将其注释为@Component
或通过xml进行注释即可。
术语bean
和POJO
是可以互换的。 根据Spring in action 4rd edition
,Spring努力成为一个非侵入性框架。
(...)基于Spring的应用程序中的类通常没有迹象表明它们正在被Spring使用。 在最坏的情况下,一个类可能会用Spring的注释之一进行注释,但否则就是POJO
和
尽管Spring在引用应用程序组件时会宽松地使用Bean和JavaBean一词,但这并不意味着Spring组件必须遵循JavaBeans规范。 Spring组件可以是任何类型的POJO。
简而言之,您所引用的Spring bean只是在Spring Application上下文中使用的POJO。 如果您使用xml映射而不是注释,则您的类将是另一个常规Java类,即Plain Old Java Object。
如果数据库中有n个相册,那么我应该创建n个相册bean吗?
我不会。 如果有n张专辑,那么将它们全部明确地包含在App.config
文件中将非常麻烦。 但是你可以。 您可能会添加一个AlbumService (@Service)
@Bean
和相关@Repository
处理写作和从数据库中检索它们。
如果不是,如何在应用程序中代表n张专辑? 仅仅是POJO域模型(不是bean)吗?
您可以使用具有Album
属性的Album
@Entity
bean。 保存相册时,您将设置属性,而不是让单个组件实现一个公共界面。 您的数据库中将包含n个相册。 例如,如果您只需要检索一张披头士乐队的专辑,则可以根据专辑标题进行查询。 如果您想要它们,您可以做albumService.findAll()
; 并得到一个容器。
使用Spring Bean的真正用例是什么?
Spring是Spring Bean的真正用例。 根据Spring IoC容器参考 :
在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。 Bean是由Spring IoC容器实例化,组装和以其他方式管理的对象。 否则,bean仅仅是应用程序中许多对象之一。 Bean及其之间的依赖关系反映在容器使用的配置元数据中。
如果我是您,那么我将不同于光盘作为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的参数和返回值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.