spring-IOC容器(二)

一、bean配置里面使用外部属性文件:

<bean>中添加context Schema定义,Spring 提供了一个<property-placeholder>元素,可以在bean配置文件里使用形式为${var}的变量,property-placeholder从属性文件里加载属性,并使用这些属性替换变量。

Spring还允许在属性文件中使用${propName} ,以实现属性间的相互引用

    <!-- 导入属性文件 -->
    <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>

db.properties文件:

 spring-IOC容器(二)

 二、SpEL(Spring表达式语言):

SpEL使用#{....}作为定界符,所有在大括号中的字符都被将被认为是SpEL,SpEL位bean的属性进行动态赋值提供了便利

    <bean id="car" class="com.atguigu.spring.beans.spel.Car">
        <property name="carName" value="bieke"></property>
        <property name="carPrice" value="250000"></property>
        <property name="carType" value="SUV"></property>
        <!-- 使用SpEL引用类的静态属性 -->
        <property name="tyrePerimiter" value="#{T(java.lang.Math).PI * 80}"></property>
    </bean>
    
    <bean id="address" class="com.atguigu.spring.beans.spel.Address">
        <property name="city" value="puyang"></property>
    </bean>
    
    <bean id="person" class="com.atguigu.spring.beans.spel.Person">
        <property name="name" value="lee"></property>
        <property name="info" value="#{car.carPrice > 300000?'金领':'白领'}"></property>
        <!-- 使用SpEL来引用其他的 bean -->
        <property name="cars" value="#{car}"></property>
        <!-- 使用SpEL来引用其他的 bean 的属性-->
        <property name="home" value="#{address.city}"></property>
    </bean>

 三、bean的生命周期:

<!-- 在bean的声明里设置 init-method和destroy-method属性,为bean指定初始化和销毁的方法-->
    <bean id="car" class="com.atguigu.spring.beans.cycle.Car"
    init-method="init2" destroy-method="destroy">
        <property name="brand" value="Audi"></property>
    </bean>
    
    <!-- 实现MyBeanPostProcessor接口,并具体提供
        Object postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用
        Object postProcessAfterInitialization(Object bean, String beanName) :init-method之后被调用
        在两个方法中,可以修改bean-->
    <!-- 配置bean的后置处理器 :不需要配置id,IOC容器自动识别是一个 MyBeanPostProcessor-->
    <bean class="com.atguigu.spring.beans.cycle.MyBeanPostProcessor"></bean>