Bean(一)

Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean
子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置
子 Bean 也可以覆盖从父 Bean 继承过来的配置
父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean
并不是 <bean> 元素里的所有属性都会被继承 比如: autowire, abstract 等.

也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true

Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称
如果依赖的前置的Bean没有定义,就会报错

Spring IOC 容器对 Bean 的生命周期进行管理的过程:
通过构造器或工厂方法创建 Bean 实例
为 Bean 的属性设置值和对其他 Bean 的引用
将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
调用 Bean 的初始化方法
将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
Bean 可以使用了
当容器关闭时, 调用 Bean 的销毁方法

Person con--
setName
postProcessBeforeInitialization___
lz init
postProcessAfterInitialization___
lz 12 {branch='Fenghuang', price=100.0}
lz des

其中初始化方法和销毁方法,在 Bean 的声明里设置 init-method 和 destroy-method 属性

Bean前置处理器,需要实现BeanPostProcess接口,实现其中的两个方法,分别在初始化前后进行调用

public class MyBeanPostProcess implements BeanPostProcessor{

    @Override
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("postProcessBeforeInitialization___");
        return o;
    }

    @Override
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("postProcessAfterInitialization___");
        return o;
    }
}

MyBeanPostProcess 需要进行Bean的声明,不需要指定id。
Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例

Bean 的配置方式:通过全类名(反射)、通过工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean

1,通过工厂方法来配置bean

//静态工厂,直接调用工厂方法就可以了,方法发参数,使用constructor-arg来指定
<bean id="bikestatic" class="com.zview.test.StaticFactory" factory-method="getBike">
<constructor-arg value="1"></constructor-arg>
</bean>
//实例工厂,需要新实例化工厂Bean,之后再创建的时候,指定factory-bean为该工厂bean就可以了
<bean id="instanceFactory" class="com.zview.test.InstanceFactory"></bean>
<bean id="bikeinstance" factory-bean="instanceFactory" factory-method="getBike">
<constructor-arg value="2"></constructor-arg>
</bean>

2,通过FactoryBean来配置Bean

Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean.
工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象

通过指定的FactoryBean,直接找到他产生的Bean对象即可,FactoryBean是一个接口,需要指定实现 的类

根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,

如果要获取FactoryBean对象,可以在id前面加一个&符号来获取

 <bean id="bikeFactoryBean" class="com.zview.test.MyFactoryBean" p:initstr="lz,100.2"/>
public class MyFactoryBean implements FactoryBean {

    private String initstr;

    public void setInitstr(String initstr) {
        this.initstr = initstr;
    }

    @Override
    public Object getObject() throws Exception {

        String [] t= initstr.split(",");
        return new Bike(t[0],Double.parseDouble(t[1]));
    }

    @Override
    public Class<?> getObjectType() {
        return Bike.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

这样就能通过FactoryBean直接生产出Bike的实例了,

注意还有一个叫做BeanFactory的东西,她是存在Bean的工厂,而上面是一个工厂Bean,本身是一个Bean,只不过是能够产生Bean的Bean。

<context:property-placeholder location="PlaceHolder.test,jdbcConfig"></context:property-placeholder>

这个用来导入外部的配置文件,但是要注意,在一个Spring配置文件中,这个标签只能存在一份,不能够去重复的定义他。。。。

原文地址:https://www.cnblogs.com/Coder-Pig/p/7300527.html