簡體   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