使用Spring Bean连接数据库对象

时间:2016-08-17 17:58:39

标签: java spring

从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的真实用例是什么?

3 个答案:

答案 0 :(得分:1)

  1. 您只需拥有一个相册类并将其注释为@Component或通过xml进行注释。

  2. 条款beanPOJO可以互换。按照Spring in action 4rd edition,Spring努力成为一个非侵入式框架。

  3.   

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

      

    尽管Spring大量使用bean和JavaBean这两个词   在引用应用程序组件时,这并不意味着Spring组件   必须遵循JavaBeans规范。一个Spring组件可以   任何类型的POJO。

    1. 用例是您可以使用Spring依赖注入在运行时连接bean,您的应用程序可以从简单性,可测试性和松散耦合方面受益于Spring。
    2. 简而言之,您引用的 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返回值。