关于java:使用Spring Bean连接数据库对象

Wiring Database Object with Spring Bean

从动作书《春》中,有一个关于春豆的例子。它使用Compact Disc类比。当一个应用程序需要一个"The Beatles" album时,它会创建"The Beatles" album bean和其他专辑。

  • 如果数据库中有n张专辑,那么我应该创建n张专辑bean吗?
  • 如果不是,那么应用程序中的n专辑是如何表示的?它只是一个pojo域模型(而不是bean)吗?
  • 使用SpringBean的真正用例是什么?

  • 如果我是你的话,我将不再把光盘比作春豆,特别是在你以后的问题上。很明显,无论是使用XML配置还是Java配置,任何Java对象都可以在Spring中声明为bean。

    假设我有这两个类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Foo {

        private String s;

        private Bar bar;

        // getters & setters

    }

    public class Bar {

        private int i;

        // getter & setter

    }

    我可以在XML配置文件中声明前者,使其成为SpringBean:

    1
    2
    3
    4
    5
    6
    7
    8
    <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>

    现在,有了这两行代码:

    1
    2
    ApplicationContext ctx = new ClassPathXmlApplicationContext("app.xml");
    Foo foo = ctx.getBean(Foo.class);

    可以检索配置的foo对象,并设置其所有属性,包括bar。这是Spring的核心用例,即允许您配置应用程序的构建块如何在运行时解析它们的依赖关系。最初,Spring都是关于代码之外的配置,但是现在焦点已经稍微改变了,比如组件扫描和Java配置…

    总之,为了用这个简单的例子结束,下面的代码行将打印10:

    1
    System.out.println(foo.getBar().getI());

    在这个例子中,我使用了foo和bar,但它也可以是Web服务、实现某些业务逻辑的服务、数据库、ORM外观、模板引擎、线程池等等……但大多数处理数据对象的组件,而不是数据对象本身,尽管这是完全可能的。

    现在,为了返回您的用例,在Spring应用程序中,如果使用数据库对Web应用程序进行编码,我通常会拥有这些组件:控制器(Web边界)、服务(用于业务逻辑)、存储库(用于查询)以及数据源。我不会在这里钻研太多细节(例如,没有声明性事务)。注意,在这种配置下,没有将特定的数据提供程序编译到Java代码中,它仍然处于配置中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <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>

    对于您的域,存储库会将光盘从数据库返回到服务,将服务返回到控制器,将控制器返回到用户。光盘不会被描述为SpringBeans,但肯定是实际SpringBeans的参数和返回值。


    If there are n albums in database, so should I create n album beans?

    我想不会。如果有n张专辑,那么将它们全部明确地包含在您的App.config文件中是非常麻烦的,如果这是您所指的话;但是您可以。您可能会添加一个AlbumService (@Service)@Bean和相关的@Repository来处理写入和从数据库中检索它们。

    If it is not, how the n albums represented in application? Is it just
    a POJO domain model (not a bean)?

    你可以有一个拥有专辑属性的Album@Entitybean。保存相册时,您将设置属性,而不是让单个组件实现公共接口。你的数据库中会有n张专辑。例如,如果只需要检索一张披头士专辑,可以根据专辑标题进行查询。如果你想得到它们,你可以做的就是得到一个容器。

    What is the real use case using Spring Bean?

    Spring是SpringBean的真实用例。根据春季国际奥委会集装箱参考:

    In Spring, the objects that form the backbone of your application and
    that are managed by the Spring IoC container are called beans. A bean
    is an object that is instantiated, assembled, and otherwise managed by
    a Spring IoC container. Otherwise, a bean is simply one of many
    objects in your application. Beans, and the dependencies among them,
    are reflected in the configuration metadata used by a container.

    我无法提供比文档中包含或给出的答案更好的答案。


  • 您只需要有一个相册类,并将其注释为@Component,或者通过XML进行注释。

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

  • (...)the classes in a Spring-based application often have no
    indication that they’re being used by Spring. At worst, a class may be annotated with one of Spring’s annotations, but it’s otherwise a POJO

    Although Spring uses the words bean and JavaBean liberally
    when referring to application components, this doesn’t mean a Spring component
    must follow the JavaBeans specification to the letter. A Spring component can be
    any type of POJO.

  • 用例是,您可以使用Spring依赖注入在运行时连接您的bean,您的应用程序可以从Spring中受益于简单性、可测试性和松耦合。
  • 简而言之,您所指的SpringBean只是在Spring应用程序上下文中使用的POJO。如果使用XML映射而不是注释,那么您的类将只是另一个常规Java类,一个普通的Java对象。