spring ioc 2

spring bean流程圖,一個bean實例的加載全過程。示意圖

 

 

代碼演示:

package com.mr.li.test;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.mr.li.config.AppConfig;
import com.mr.li.service.Person;
import com.mr.li.service.impl.Man;

import lombok.extern.slf4j.Slf4j;


@Slf4j
public class Test {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        Person person = ctx.getBean(Man.class);
        person.behavior();
        ctx.close();
        
    }
}

 

bean的加載過程

package com.mr.li.service.impl;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import com.mr.li.service.Animal;
import com.mr.li.service.Person;

/**
 * 
 * @describe 實現的這些springframework包下的類可重寫他們的方法去自定義自己的一些實現,使用的IOC必須是實現了ApplicationContext接口的IOC否則不會調用這些方法。
 *
 * @author [email protected]
 *
 * @date 2021-8-18 14:46:10
 */
@Component
public class Man implements Person, BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean{

    @Qualifier("cat")
    @Autowired
    private Animal animal;
    
    @Override
    public void behavior() {
        animal.behavior();
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean.destroy bean銷燬方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean.afterPropertiesSet bean初始化方法。在設置了所有bean屬性並滿足了BeanFactoryAware、ApplicationContextAware等之後,由包含的BeanFactory調用。");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("ApplicationContextAware.applicationContext 回調設置ioc對象,不過通常拿到此對象會用此對象初始化一些數據,並不會對此對象本身改變什麼");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("BeanFactoryAware.setBeanFactory bean工廠對當前對象的回調,提供了beanFactory對象,可利用beanFactory做一些處理 ");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("BeanNameAware.setBeanName 在創建當前對象的時候設置當前對象的bean名稱,設置好的名稱是: " + name);
    }
}

前置處理器,和後置處理器回調方法

package com.mr.li.service.impl;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class BeanPostProcessorExample implements BeanPostProcessor {
    
    /**
     * 可通過處理器過濾做些事情,如通過beanName可在加載類的時候過濾出某個類然後對其操作
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("前置處理器,在加載每個bean之前調用: " + bean.getClass().getSimpleName() + "    beanName: " + beanName);
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }
    
    //注意,這個Bean後置處理器將對所有的Bean有效
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("後置處理器,在加載每個bean之後調用: " + bean.getClass().getSimpleName() + "    beanName: " + beanName);
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章