zoukankan      html  css  js  c++  java
  • 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 li.yanlong@icjhd.com
     *
     * @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);
        }
    }
  • 相关阅读:
    Nginx 模块:--with-http_sub_status_module
    Nginx http请求&日志
    Nginx 目录和配置语法&DNS配置
    Nginx 全局配置
    Nginx 相关操作1
    Nginx入坑基础篇
    杂谈maven工程实践(3)
    杂谈maven工程类型(2)
    杂谈maven相关概念(1)
    Django
  • 原文地址:https://www.cnblogs.com/li-yan-long/p/15156609.html
Copyright © 2011-2022 走看看