zoukankan      html  css  js  c++  java
  • 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配置文件中,这个标签只能存在一份,不能够去重复的定义他。。。。

  • 相关阅读:
    TensorFlow 学习(4)——MNIST机器学习进阶
    TensorFlow 学习(3)——MNIST机器学习入门
    TensorFlow 学习(2)——正式起步
    TensorFlow 学习(1)——第一个程序:线性回归
    OpenCV学习笔记(15)——更多的轮廓函数
    OpenCV学习笔记(14)——轮廓的性质
    OpenCV学习笔记(13)——轮廓特征
    OpenCV学习笔记(12)——OpenCV中的轮廓
    机器学习
    机器学习- Attention Model结构解释及其应用
  • 原文地址:https://www.cnblogs.com/Coder-Pig/p/7300527.html
Copyright © 2011-2022 走看看