如果我是你,我不会将光盘类比为 Spring bean,尤其是关于你后来的问题。很明显,任何 Java 对象都可以在 Spring 中声明为 bean,无论您使用的是 XML 配置还是 Java 配置。
假设我有这两个类:
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 的参数和返回值。