7.5.10 Spring的Bean和JavaBean
Spring
容器对Bean
没有特殊要求,甚至不要求该Bean
像**标准的JavaBean
(标准的JavaBean
要求必须为每个属性提供对应的getter
和setter
方法)**。
Spring
中的Bean
是Java
实例、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 id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <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 { @SuppressWarnings("resource") ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); DataSource ds = ctx.getBean("dataSource", DataSource.class); Connection conn = ds.getConnection(); PreparedStatement pstmt = conn.prepareStatement( "insert into news_inf values(null , ? , ?)"); pstmt.setString(1 , "疯狂Java联盟成立了"); pstmt.setString(2 , "疯狂Java地址:www.crazyit.org"); pstmt.executeUpdate(); if (pstmt != null)pstmt.close(); if (conn != null)conn.close(); } }
|
上面程序从Spring
容器中获得了一个DataSource
对象,通过该DataSource
对象就可以获取简单的数据库连接。执行上面程序,将看到spring
数据库的news_inf
数据表中多了一条记录。
从该实例可以看出, Spring
的Bean
远远超出值对象的JavaBean
范畴,Bean
可以代表应用中的任何组件、任何资源实例
Spring中的Bean要满足的原则
虽然Spring
对Bean
没有特殊要求,但依然建议Spring
中的Bean
应满足如下几个原则。
- 尽量为每个
Bean
实现类提供无参数的构造器。
- 接受构造注入的
Bean
,则应提供对应的、带参数的构造函数。
- 接受设值注入的
Bean
,则应提供对应的setter
方法,并不要求提供对应的getter
方法。
Java Bean和Spring中的Bean的区别
传统的Java Bean
和Spring
中的Bean
存在如下区别。
- 用处不同:传统的
JavaBean
更多是作为值对象传递参数; Spring
的Bean
用处几乎无所不包任何应用组件都被称为Bean
- 写法不同:传统的
JavaBean
作为值对象,要求每个属性都提供getter
和setter
方法;但Spring
的Bean
只需为接受设值注入的属性提供setter
方法即可。
- 生命周期不同:传统的
JavaBean
作为值对象传递,不接受任何容器管理其生命周期; Spring
中的Bean
由Spring
管理其生命周期行为。