配置bean(下)之自动装备,依赖关系,作用域,生命周期

2018年02月16日 09:55 | 2774次浏览

上一章讲解了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



小说《我是全球混乱的源头》

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程


上一篇:配置 bean上 下一篇:python 切片详解
^