bean之间的关系
bean之间的关系有继承和依赖,一个bean可以继承父bean的属性和值,也可以覆盖父bean的属性和值,实例代码:
<bean id="address" class="cn.xjie.spring.beans.autowire.Address" p:city="BeiJing" p:street="HuiLongGuan"></bean>
<!-- bean 配置的继承:使用bean的parent属性指定继承哪个bean的配置 -->
<bean id="address2" p:street="DaZongShi" parent="address"></bean>
Main类
package cn.xjie.spring.beans.relation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.xjie.spring.beans.autowire.Address;
import cn.xjie.spring.beans.autowire.Person;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-relation.xml");
Address address = (Address) ctx.getBean("address");
System.out.println(address);
Address address2 = (Address) ctx.getBean("address2");
System.out.println(address2);
}
}
运行结果
Address [city=BeiJing, street=HuiLongGuan]
Address [city=BeiJing, street=DaZongShi]
bean的作用域
bean的四种作用域,分别为singleton,prototype,request,session,这里介绍singleton和prototype。
singleton:默认值,容器初始化时创建bean实例,在整个容器的生命周期内只创建这一个bean,所以是单例的。
prototype:原型的,容器初始化时不创建bean的实例,而在每次创建一个新的bean实例,并返回。
实例代码
package cn.xjie.spring.beans.scope;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.xjie.spring.beans.autowire.Car;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
Car car = (Car) ctx.getBean("car");
Car car2 = (Car) ctx.getBean("car");
System.out.println(car == car2);
}
}
当xml配置文件里scope属性为singleton时,程序运行结果为true,表示car和car2为同一个对象,而scope属性为prototype时,程序结果为false。
使用外部属性文件
Spring配置文件允许使用外部属性文件,比如配置数据源。
实例代码
我们现在src即类路径下创建一个properties文件,命名为db.properties
user=root
password=wxj111
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql:///pythontest
xml里配置代码
在xml配置文件里需要引入context命名空间,location指定外部属性文件位置,然后在value属性里以${value}这样的方式接收值
<!-- 导入属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
</bean>
Main类测试代码
package cn.xjie.spring.beans.properties;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.xjie.spring.beans.autowire.Address;
import cn.xjie.spring.beans.autowire.Person;
public class Main {
public static void main(String[] args) throws SQLException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-properties.xml");
DataSource dataSource = (DataSource) ctx.getBean("dataSource");
System.out.println(dataSource.getConnection());
}
}
运行结果
com.mchange.v2.c3p0.impl.NewProxyConnection@2fd7945d