繁体   English   中英

使用Spring Bean连接数据库对象

[英]Wiring Database Object with Spring Bean

从“ Spring in Action”一书中可以看到一个Spring Bean的示例。 它使用Compact Disc类比。 当应用程序需要"The Beatles" album ,它将创建"The Beatles" album bean以及其他唱片集。

  1. 如果数据库中有n相册,那么我应该创建n相册bean吗?
  2. 如果不是,如何在应用程序中代表n张专辑? 仅仅是POJO域模型(不是bean)吗?
  3. 使用Spring Bean的真正用例是什么?
  1. 您只需要具有一个Album类并将其注释为@Component或通过xml进行注释即可。

  2. 术语beanPOJO是可以互换的。 根据Spring in action 4rd edition ,Spring努力成为一个非侵入性框架。

(...)基于Spring的应用程序中的类通常没有迹象表明它们正在被Spring使用。 在最坏的情况下,一个类可能会用Spring的注释之一进行注释,但否则就是POJO

尽管Spring在引用应用程序组件时会宽松地使用Bean和JavaBean一词,但这并不意味着Spring组件必须遵循JavaBeans规范。 Spring组件可以是任何类型的POJO。

  1. 用例是您可以使用Spring Dependency Injection在运行时连接bean,您的应用程序可以从Spring的简单性,可测试性和松散耦合中受益。

简而言之,您所引用的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM