Bean的生命周期

Bean的生命周期包括Bean的创建,Bean的使用,Bean的销毁三大过程。

一、Bean的创建

  1. Bean的实例化,就是为Bean开辟一块内存空间
  2. Bean对象的注入和装配
    • 这个类中有属性也为被注入的Bean对象,此时就是要注入这个Bean对象。
    • 这个类中有@Bean方法注解修饰的方法,此时就要创建这个返回值的Bean对象。
  3. 初始化
    1. 各种通知

      • 这些通知时系统初始化完成的工作,表现出来的就是各种通知,一个初始化完了就是一个通知,通知是一个一个的接口,bean类需要继承了这些接口才能自己重写对应的通知方法(aware),重写对应的方法的参数就是系统初始化的值,可以再重写的方法中感知到系统初始化的值,接口如:ApplicationContextAware、BeanNameAware

        @Component
        public class User implements BeanNameAware {
            @Override
            public void setBeanName(String s) {
                System.out.println(s);
            }
        }
        
        

        上面的类实现了BeanNameAware接口,重写的setBean方法就可以在Bean的名称被初始化好之后调用,参数String s就是Bean的name。

    2. 初始化前置方法

    3. 初始化方法(有XML格式和注释两种设置方法)

      • XML格式
        Spring原生API的配置文件中的Bean标签可以设置一个init-method属性,这个属性的值就是初始化方法的名称。
        Bean的生命周期_第1张图片
        Bean的生命周期_第2张图片

      • 使用@PostConstruct注解,这个注解下方的方法就是初始化方法
        Bean的生命周期_第3张图片

    4. 初始化后置方法
      初始化前置和后置方法都是一个接口实现的,这个接口就是BeanPostProcessor,它的两个方法postProcessBeforeInitialization,postProcessAfterInitialization就是Bean的初始化前置方法和后置方法,但是在默认的单例作用域下,这两个方法不会被显示的调用,需要将作用域改成prototype,才能在注入这个Bean的时候看到显示的调用,启动spring的时候读不会显示的调用。

      @Controller
      @Scope("prototype")
      public class User implements BeanPostProcessor {
          @Override
          public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
              System.out.println("初始化前置方法被调用");
              return bean;
          }
      
          @Override
          public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
              System.out.println("初始化后置方法被调用");
              return bean;
          }
      
          @PostConstruct
          public void test(){
              System.out.println("User的注解初始化方法");
          }
      }
      
      

      Bean的生命周期_第4张图片

二、Bean的使用

也就是Bean的注入,三种方式,属性注入,setter注入,构造方法注入。
都需要使用到@Autowired注解,这个注解只能在被五大类注解修饰了的类里面使用。
详情请看@Autowired注入和@Resource注入

三、Bean的销毁

知道有这个流程就行。

你可能感兴趣的:(spring)