• spring bean


    1、bean的加载

    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    import org.springframework.core.io.Resource;
    import org.springframework.web.context.support.XmlWebApplicationContext;
    
    /**
     *  @加载方式 spring有两种加载配置文件的方式ApplicationContext和BeanFactory
     *  @区别 ApplicationContext在容器启动就会实例化scope为singleton的bean,而BeanFactory不会,在应用使用时才创建
     */
    public class Model {
        public static void main(String[] args) {
    
            //上下文加载,从类路径加载
            ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    
            //上下文加载,从文件系统加载
            //ApplicationContext ac = new FileSystemXmlApplicationContext("D:\software\workspace\IOC\src\main\resources\applicationContext.xml");
    
            //上下文加载,从web系统加载,默认配置文件路径及名称/WEB-INF/applicationContext.xml,web项目启动会自动加载
            //ApplicationContext ac = new XmlWebApplicationContext();
    
            //通过工厂获取,已弃用,不再多说
            //BeanFactory bf = new XmlBeanFactory((Resource) new ClassPathXmlApplicationContext("beans.xml"));
        }
    }

    2、bean的注入

      分为两种:设值注入、构造注入

    3、bean作用域

      spring的bean作用域分为5种

      singleton:单例,整个spring容器只存在一个实例

      prototype:原型,每次使用都会创建一个实例

      request:每次request请求都会创建一个实例

      session:每次会话创建一个实例

      global session:一个全局的HTTP Session中,一个bean定义对应一个实例

    测试例子

    /**
     * @五中scope
     * @ 1.singleton 整个spring容器只存在一个实例,此时bean生命周期由spring容器管理
     * @ 2.prototype 每次调用都会创建一个实例,此时bean创建后则不由spring容器管理
     * @ 3.request 每次request请求创建一个实例
     * @ 4.session 每次会话创建一个实例
     * @ 5.global session
     */
    public class Model {
        public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");
            User user1 = (User) ac.getBean("user");
            User user2 = (User) ac.getBean("user");
            System.out.println(user1 == user2);//当scope为singleton时为true,当scope为prototype时为false
        }
    }

    4、bean的生命周期

      基本步骤顺序

      1)实例化bean

      2)调用set方法设值属性

      3)如果实例实现了BeanNameAware接口,则调用setBeanName()方法(获取当前bean的引用)

      4)如果实例实现了BeanFactoryAware接口,则调用setBeanFactory()方法(获取当前工厂及容器中的bean引用信息)

      5)如果实例实现了ApplicationContextAware接口,则调用setApplicationContext()方法(获取上下文信息,包括容器创建时间等内容)

      6)如果实现了BeanPostProcessor接口,则调用postProcessBeforeInitialization()方法(进行预初始化处理)

      7)如果实例实现了InitializingBean接口,则调用afterPropertiesSet()方法(初始化后处理)

      8)调用自己的初始化方法(bean属性init-method="myInit"自定义的方法)

      9)如果实现了BeanPostProcessor接口,则调用postProcessAfterInitialization()(进行预初始化后处理)

      10)容器初始化完成,执行正常调用

      11)使用结束销毁容器

      12)调用DisposableBean的distroy()方法

      13)调用自己的destroy方法(bean属性destroy-method="myDestroy"自定义方法)

     Spring Bean的生命周期(非常详细)

    本文代码:https://github.com/shaoyesun/spring_ioc.git

  • 相关阅读:
    MobaXtern显示中文
    SD卡识别——记一次stm32识别BanqSD卡 V2.0识别失败的经历。
    《Java 底层原理》Jvm GC算法
    《Java 并发编程》ThreadLock详解
    《Java 底层原理》Jvm对象结构和指针压缩
    《Java 底层原理》Java内存模型
    《Java 底层原理》Java 字节码详解
    jinjia2中的变量使用
    jsonify和json的区别
    虚拟环境是什么?有什么用?怎么用?
  • 原文地址:https://www.cnblogs.com/sunjf/p/springbean.html
Copyright © 2020-2023  润新知