Spring4快速入门第三章配置bean(下)

上一章讲解了Spring bean配置中的依赖注入,处理特殊符号,引入其他bean,集合属性,p命名空间使用。接下来我们谈谈bean的自动装备,bean之间的依赖关系,bean的作用域,如何读取properties配置文件,bean的生命周期。

注*:需要的jar包在spring4快速入门第一章HelloWorld中有

趁大家有精力,想讲讲重点,如何读取properties配置文件,一般在配置连接池时用的比较多

在src下创建一个db.properties

<span style="font-family:Microsoft YaHei;font-size:18px;">jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
#jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test,如果是localhost:3306是可以省略不写的,初学者建议不要偷懒
jdbc.jdbcUrl=jdbc:mysql:///test
jdbc.initPoolSize=5
jdbc.maxPoolSize=10</span>
在bean.xml配置连接池

<span style="font-family:Microsoft YaHei;font-size:18px;"><!-- 导入外部的资源文件 -->
	<context:property-placeholder location="classpath:db.properties"/>
	
	<!-- 配置c3p0数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
		<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
	</bean></span>
当然需要导入c3p0的jar包

<span style="font-family:Microsoft YaHei;font-size:18px;"><dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.1</version>
		</dependency></span>
测试类及结果

<span style="font-family:Microsoft YaHei;font-size:18px;">@Test
	public void C3p0Connection() throws SQLException{
		DataSource dataSource = (DataSource) ctx.getBean("dataSource");
		System.out.println(dataSource.getConnection());
	}</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">com.mchange.v2.c3p0.impl.NewProxyConnection@1bc4c37</span>

现在遇到一个问题,在运行测试方法的时候出现以下错误:

<span style="font-family:Microsoft YaHei;font-size:18px;">org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown character set: 'utf8mb4'
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:382)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:456)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:464)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:472)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:477)
at org.springframework.jdbc.core.JdbcTemplate.queryForInt(JdbcTemplate.java:486)</span>
在网上找了很多,原来是数据库驱动的问题,把驱动缓存mysql-connector-java5.1.6就好了,具体为什么,我也不是很清楚。

bean的自动装备

主要有两种,但是两种都可以不用,有了注解@autowire就不需要在xml文件中配置

byType: 根据类型进行自动装配. 但要求 IOC 容器中有多个则无法完成自动装配.
byName: 若属性名和某一个 bean 的 id 名一致, 即可完成自动装配. 

创建一个Position,Address和Person类,为了不占用太多的篇幅,我就不贴实体类的代码,Position 只需要salary属性,Address 需要city 和 street属性,而Person 需要Position和Address字段。

bean配置

<span style="font-family:Microsoft YaHei;font-size:18px;"><bean id="address" class="com.spring.entity.Address">
		<property name="city" value="HuBei"></property>
		<property name="street" value="GuangShanStreet"></property>
	</bean>	
	
	<bean id="position" class="com.spring.entity.Position">
		<property name="salary" value="$4000"></property>
	</bean>
	
	<bean id="person" class="com.spring.entity.Person" autowire="byName">
	</bean></span>

测试代码及结果

<span style="font-family:Microsoft YaHei;font-size:18px;">@Test
	public void Autowire(){
		Person person = ctx.getBean(Person.class);
		System.out.println(person.toString());
	}</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">Person [address=Address [city=HuBei, street=GuangShanStreet], position=Position [salary=$4000]]</span>

如果把id="address"改为id="address1"

<span style="font-family:Microsoft YaHei;font-size:18px;">Person [address=null, position=Position [salary=$4000]]</span>
如果换成 byType 是没有问题的,但是如果有多个address 或者是多个 position就会有问题,因为这个不怎么重要,我就简单的谈谈,各位不要嫌弃我懒。


bean的作用域

prototype: 原型的. 每次调用 getBean 方法都会返回一个新的 bean. 且在第一次调用 getBean 方法时才创建实例
singleton: 单例的. 每次调用 getBean 方法都会返回同一个 bean. 且在 IOC 容器初始化时即创建 bean 的实例. 默认值 

默认是单例的

<span style="font-family:Microsoft YaHei;font-size:18px;">@Test
	public void Scope(){
		Person person = ctx.getBean(Person.class);
		Person person1 = ctx.getBean(Person.class);
		System.out.println(person == person1);
	}</span>
结果是:true

原型的,添加scope="prototype"

<span style="font-family:Microsoft YaHei;font-size:18px;"><bean id="person" class="com.spring.entity.Person" autowire="byName" scope="prototype">
	</bean></span>
相同的测试方法结果是:false


bean之间的关系

继承 parent=""

<span style="font-family:Microsoft YaHei;font-size:18px;"><bean id="address" class="com.spring.entity.Address">
		<property name="city" value="HuBei"></property>
		<property name="street" value="GuangShanStreet"></property>
	</bean>	
	
	<bean id="address1" parent="address">
		<property name="street" value="ITDragonStreet"></property>
	</bean>	</span>
测试方法及结果:

<span style="font-family:Microsoft YaHei;font-size:18px;">@Test
	public void Relation(){
		Address address = (Address) ctx.getBean("address1");
		System.out.println(address.toString());
	}</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">Address [city=HuBei, street=ITDragonStreet]</span>
其实和java里面的继承差不多,也可以覆盖父类,如果想要父类做模版,设置abstract="true"

依赖 depends-on=""

<span style="font-family:Microsoft YaHei;font-size:18px;"><bean id="position-depend" parent="position" depends-on="address">
	</bean></span>
如果address不存在,在容器启动的时候就会报错。

网址链接:http://blog.csdn.net/qq_19558705/article/details/50018469

后续内容,会及时更新,2015年11月25日23点17分的武汉有点冷,我在用发抖的双手敲这键盘。对博客有什么意见和问题的可以留言,我会及时处理。


















你可能感兴趣的:(spring)