7.5.10 Spring的Bean和JavaBean

7.5.10 Spring的Bean和JavaBean

Spring容器对Bean没有特殊要求,甚至不要求该Bean像**标准的JavaBean(标准的JavaBean要求必须为每个属性提供对应的gettersetter方法)**。

  • Spring中的BeanJava实例、Java组件;
  • 而传统Java应用中的JavaBean通常作为DTO(数据传输对象),用来封装值对象,在各层之间传递数据。

程序示例

项目结构

1
2
3
4
5
6
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\DataSource
├─data.sql
└─src\
├─beans.xml
└─lee\
└─BeanTest.java

data.sql

1
2
3
4
5
6
7
8
9
10
drop database if exists spring;
create database spring;
use spring;

create table news_inf
(
news_id int auto_increment primary key,
news_title varchar(255),
news_content varchar(255)
);

beans.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:mysql://localhost/spring?useSSL=true"/>
<!-- 指定连接数据库的用户名 -->
<property name="user" value="root"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="root"/>
<!-- 指定连接数据库连接池的最大连接数 -->
<property name="maxPoolSize" value="200"/>
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize" value="2"/>
<!-- 指定连接数据库连接池的初始连接数 -->
<property name="initialPoolSize" value="2"/>
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxIdleTime" value="200"/>
</bean>
</beans>

主程序部分由Spring容器来获取该Bean的实例,获取实例时使用Bean的唯一标识:id属性,id属性是Bean实例在容器中的访问点。下面是主程序代码。

BeanTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package lee;

import javax.sql.DataSource;
import java.sql.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanTest
{
public static void main(String[] args)
throws Exception
{
// 实例化Spring容器。Spring容器负责实例化Bean
@SuppressWarnings("resource")
ApplicationContext ctx =
new ClassPathXmlApplicationContext("beans.xml");
// 获取容器中id为dataSource的Bean
DataSource ds = ctx.getBean("dataSource", DataSource.class);
// 通过DataSource来获取数据库连接
Connection conn = ds.getConnection();
// 通过数据库连接获取PreparedStatement
PreparedStatement pstmt = conn.prepareStatement(
"insert into news_inf values(null , ? , ?)");
pstmt.setString(1 , "疯狂Java联盟成立了");
pstmt.setString(2 , "疯狂Java地址:www.crazyit.org");
// 执行SQL语句
pstmt.executeUpdate();
// 清理资源,回收数据库连接资源。
if (pstmt != null)pstmt.close();
if (conn != null)conn.close();
}
}

上面程序从Spring容器中获得了一个DataSource对象,通过该DataSource对象就可以获取简单的数据库连接。执行上面程序,将看到spring数据库的news_inf数据表中多了一条记录。
从该实例可以看出, SpringBean远远超出值对象的JavaBean范畴,Bean可以代表应用中的任何组件、任何资源实例

Spring中的Bean要满足的原则

虽然SpringBean没有特殊要求,但依然建议Spring中的Bean应满足如下几个原则。

  1. 尽量为每个Bean实现类提供无参数的构造器。
  2. 接受构造注入的Bean,则应提供对应的、带参数的构造函数。
  3. 接受设值注入的Bean,则应提供对应的setter方法,并不要求提供对应的getter方法。

Java Bean和Spring中的Bean的区别

传统的Java BeanSpring中的Bean存在如下区别。

  1. 用处不同:传统的JavaBean更多是作为值对象传递参数; SpringBean用处几乎无所不包任何应用组件都被称为Bean
  2. 写法不同:传统的JavaBean作为值对象,要求每个属性都提供gettersetter方法;但SpringBean只需为接受设值注入的属性提供setter方法即可。
  3. 生命周期不同:传统的JavaBean作为值对象传递,不接受任何容器管理其生命周期; Spring中的BeanSpring管理其生命周期行为。