Wiring Database Object with Spring Bean
从动作书《春》中,有一个关于春豆的例子。它使用
如果我是你的话,我将不再把光盘比作春豆,特别是在你以后的问题上。很明显,无论是使用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对象,并设置其所有属性,包括
总之,为了用这个简单的例子结束,下面的代码行将打印10:
1 |
在这个例子中,我使用了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张专辑,那么将它们全部明确地包含在您的
If it is not, how the n albums represented in application? Is it just
a POJO domain model (not a bean)?
你可以有一个拥有专辑属性的
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.
我无法提供比文档中包含或给出的答案更好的答案。
您只需要有一个相册类,并将其注释为
术语
(...)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.
简而言之,您所指的SpringBean只是在Spring应用程序上下文中使用的POJO。如果使用XML映射而不是注释,那么您的类将只是另一个常规Java类,一个普通的Java对象。