上一章讲解了spring bean配置中的依赖注入,处理特殊符号,引入其他bean,集合属性,p命名空间使用。接下来我们谈谈bean的自动装备,bean之间的依赖关系,bean的作用域,如何读取properties配置文件,bean的生命周期。
趁大家有精力,想讲讲重点,如何读取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包
<dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.1</version> </dependency>
测试类及结果
public 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>
测试代码及结果
public 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 的实例. 默认值
默认是单例的
public 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>
测试方法及结果:
public 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
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程