• springbean的生命周期


    目录

    • 1. 生命周期简图
    • 2. 扩展接口介绍
      • 2.1 Aware接口
      • 2.2 BeanPostProcessor接口
      • 2.3 InitializingBean
      • 2.4 DisposableBean
      • 2.5 BeanFactoryPostProcessor接口
      • Bean的配置和值注入
      • AOP的示例

    1. 生命周期简图

    在这里插入图片描述

    2. 扩展接口介绍

    2.1 Aware接口

    在spring中Aware接口表示的是感知接口,表示spring框架在Bean实例化过程中以回调的方式将特定在资源注入到Bean中去(如:ApplicationContext, BeanName,BeanFactory等等)。Aware接口本事没有声明任何方法,是一个标记接口,其下有多个子接口,如:BeanNameAware,ApplicationContextAware,BeanFactoryAware等。
    每个特定的子接口都会固定一个特定的方法,并注入特定的资源,如BeanFactoryAware接口,定义了setBeanFactory(BeanFactory beanFactory),在spring框架实例化Bean过程中,将回调该接口,并注入BeanFactory对象。再例如:ApplicationContextAware接口,定义了setApplicationContext(ApplicationContext applicationContext) 方法,在spring完成Bean实例化,将回调该接口,并注入ApplicationContext对象(该对象即spring的上下文)。

    Aware接口示例(ApplicationContextAware 是 Aware 接口的子接口):

    public class ApplicationContextAwareTest implements ApplicationContextAware {
    
        private static ApplicationContext ctx;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            ctx = applicationContext;
            System.out.println("---- ApplicationContextAware 示例 -----------");
        }
    
        public static  <T> T getBean(String beanName) {
            return (T) ctx.getBean(beanName);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    配置文件:

    
    
    
    • 1
    • 2

    2.2 BeanPostProcessor接口

    Bean在初始化之前会调用该接口的postProcessBeforeInitialization方法,在初始化完成之后会调用
    postProcessAfterInitialization方法。

    除了我们自己定义的BeanPostProcessor实现外,spring容器也会自动加入几个,如ApplicationContextAwareProcessor、ApplicationListenerDetector,这些都是BeanPostProcessor的实现类。

    BeanPostProcessor接口的定义:

    public interface BeanPostProcessor {
        Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
        Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
    }
    
    • 1
    • 2
    • 3
    • 4

    方法的第一个参数为bean实例,第二个参数为beanName,且返回值类型为Object,所以这给功能扩展留下了很大的空间,比如:我们可以返回bean实例的代理对象。

    开发示例:

    public class BeanPostProcessorTest implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println(beanName + " postProcessBeforeInitialization");
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println(beanName + " postProcessAfterInitialization");
            return bean;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    配置文件:

    
    
    • 1
    • 2

    2.3 InitializingBean

    该接口是Bean初始化过程中提供的扩展接口,接口中只定义了一个afterPropertiesSet方法。如果一个bean实现了InitializingBean接口,则当BeanFactory设置完成所有的Bean属性后,会回调afterPropertiesSet方法,可以在该接口中执行自定义的初始化,或者检查是否设置了所有强制属性等。

    也可以通过在配置init-method方法执行自定义的Bean初始化过程。

    示例:

    public class InitializingBeanTest implements InitializingBean {
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("InitializingBean.afterPropertiesSet() ......");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    配置文件:

    
    
    
    • 1
    • 2

    2.4 DisposableBean

    实现了DisposableBean接口的Bean,在该Bean消亡时Spring会调用这个接口中定义的destroy方法。

    public class TestService implements DisposableBean {
    
        public void hello() {
            System.out.println("hello work ... ");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("TestService destroy ..... ");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在Spring的应用上下文关闭时,spring会回调destroy方法, 如果Bean需要自定义清理工作,则可以实现该接口。

    除了实现DisposableBean接口外,还可以配置destroy-method方法来实现自定义的清理工作。

    2.5 BeanFactoryPostProcessor接口

    该接口并没有在上面的流程图上体现出来,因为该接口是在Bean实例化之前调用的(但BeanFactoryPostProcessor接口也是spring容器提供的扩展接口,所以在此处一同列出),如果有实现了BeanFactoryPostProcessor接口,则容器初始化后,并在Bean实例化之前Spring会回调该接口的postProcessorBeanFactory方法,可以在这个方法中获取Bean的定义信息,并执行一些自定义的操作,如属性检查等。

    Bean的配置和值注入

    1. 创建并注册一个Bean
    @Component("stu")
    public class Student {
    	
    	//@Value("#{configProp['stu.name']}")
    	@Value("${stu.name}")
    	private String name;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public String toString() {
    		return "Student [name=" + name + "]";
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    通过容器获取Bean

    		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
    		Student stu = (Student)ctx.getBean("stu");
    		//stu.setName("zs");
    		System.out.println(stu);
    
    • 1
    • 2
    • 3
    • 4

    AOP的示例

    1. 创建一个切面,记录程序运行时间
    @Component
    @Aspect
    @EnableAspectJAutoProxy
    public class ProcessAop {
    	//execution(* com.cybx..*.*(..))
    	/*@Pointcut("@annotation(com.zking.mavendemo.config.MyAnnotation)")
    	public void logPointcut() {
    	}*/
    	
    	@Around("execution(* com.zking.mavendemo.service..*.hello*(..))")
    	public Object around(ProceedingJoinPoint  joinPoint) throws Throwable {
    		
    		Class<? extends Signature> signatureClass = joinPoint.getSignature().getClass();
    		System.out.println("AOP signatureClass = " + signatureClass);
    		
    		Object target = joinPoint.getTarget();
    		Class<? extends Object> targetClass = target.getClass();
    		System.out.println("AOP targetClass = " + targetClass);
    		
    		Object returnValue = joinPoint.proceed(joinPoint.getArgs());
    		
    		System.out.println("AOP After ... ");
    		
    		return returnValue;
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    1. 创建一个service接口和实现类演示AOP且面
      接口:
    public interface ITestService {	
    	void helloAop(String msg);
    }
    
    • 1
    • 2
    • 3

    实现类:

    @Service("testService")
    public class TestService implements ITestService {
    
    	@Override
    	public void helloAop(String msg) {
    		System.out.println("target obj method: " + msg);
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    测试:

    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
    		ITestService bean = (ITestService)ctx.getBean("testService");
    		bean.helloAop("fdfdfdfdfdfdfdf");
    
    • 1
    • 2
    • 3

    springIOC容器:
    在这里插入图片描述

  • 相关阅读:
    C++模板使用
    华为数通方向HCIP-DataCom H12-831题库(单选题:161-180)
    六氟化硫SF6断路器的运行维护、泄漏处理及气体在线监测
    《ClickHouse原理解析与应用实践》读书笔记(2)
    基于PyQt5GUI的人脸识别系统设计与实现
    华为9.20笔试 复现
    Redis 缓存过期淘汰策略
    [量化投资-学习笔记002]Python+TDengine从零开始搭建量化分析平台-MA均线的多种实现方式
    需要SMB签名的漏洞解决方案
    【Unity3D赛车游戏制作】开始界面场景搭建
  • 原文地址:https://blog.csdn.net/weixin_63719049/article/details/126381519