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

来源:互联网 发布:免费聊天相亲软件 编辑:程序博客网 时间:2024/04/29 14:35

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

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

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

在src下创建一个db.properties

jdbc.user=rootjdbc.password=rootjdbc.driverClass=com.mysql.jdbc.Driver#jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test,如果是localhost:3306是可以省略不写的,初学者建议不要偷懒jdbc.jdbcUrl=jdbc:mysql:///testjdbc.initPoolSize=5jdbc.maxPoolSize=10
在bean.xml配置连接池

<!-- 导入外部的资源文件 --><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>
当然需要导入c3p0的jar包

<dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.1</version></dependency>
测试类及结果

@Testpublic void C3p0Connection() throws SQLException{DataSource dataSource = (DataSource) ctx.getBean("dataSource");System.out.println(dataSource.getConnection());}
com.mchange.v2.c3p0.impl.NewProxyConnection@1bc4c37

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

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)
在网上找了很多,原来是数据库驱动的问题,把驱动缓存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配置

<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>

测试代码及结果

@Testpublic void Autowire(){Person person = ctx.getBean(Person.class);System.out.println(person.toString());}
Person [address=Address [city=HuBei, street=GuangShanStreet], position=Position [salary=$4000]]

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

Person [address=null, position=Position [salary=$4000]]
如果换成 byType 是没有问题的,但是如果有多个address 或者是多个 position就会有问题,因为这个不怎么重要,我就简单的谈谈,各位不要嫌弃我懒。


bean的作用域

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

默认是单例的

@Testpublic void Scope(){Person person = ctx.getBean(Person.class);Person person1 = ctx.getBean(Person.class);System.out.println(person == person1);}
结果是:true

原型的,添加scope="prototype"

<bean id="person" class="com.spring.entity.Person" autowire="byName" scope="prototype"></bean>
相同的测试方法结果是:false


bean之间的关系

继承 parent=""

<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>
测试方法及结果:

@Testpublic void Relation(){Address address = (Address) ctx.getBean("address1");System.out.println(address.toString());}
Address [city=HuBei, street=ITDragonStreet]
其实和java里面的继承差不多,也可以覆盖父类,如果想要父类做模版,设置abstract="true"

依赖 depends-on=""

<bean id="position-depend" parent="position" depends-on="address"></bean>
如果address不存在,在容器启动的时候就会报错。

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

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

更多干货等你来拿 http://www.itit123.cn/


3 0
原创粉丝点击