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

原文地址:https://www.cnblogs.com/sunjf/p/springbean.html