【Spring IOC】Spring IOC 简介及容器源码解析文章导读

1  前言

Spring老生常谈,JavaWeb程序员的必备,程序员不看源码不懂源码,路走不长,所以耐心看,边看操作。

本文是 Spring IOC源码分析系列文章的导读文章,将会着重介绍 Spring 的一些使用方法和特性,为后续的源码分析文章做铺垫。

另外需要特别说明一下,本系列的源码分析文章是基于Spring 5.2.12.RELEASE版本编写的。

2  Spring简介

Spring其中最主要的就是:IOC和AOP。

Spring的版本发展

3  Spring几个特性

3.1  lookup-method

当注入的对象,需要每次都要得到一个新的对象的时候。

第一种方式是让 类实现 ApplicationContextAware 接口(实现 BeanFactoryAware 接口也是可以的),每次调用getCat 方法时,都会获取一个新的实例,返回给调用者。

public class DemoBean implements BeanFactoryAware {

    private BeanFactory beanFactory;

    public Cat getCat() {
        return beanFactory.getBean("cat", Cat.class);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

}

第二种方式就是这里的 lookup-method 了,Spring 会在运行时对 DemoBean进行增强,使其 getCat 可以每次都返回一个新的实例。

public class DemoBean {

    @Lookup
    public Cat getCat() {
        return null;
    }

}

 

3.2  depends-on

 当一个 bean 直接依赖另一个 bean,可以使用 <ref/> 标签进行配置。不过如某个 bean 并不直接依赖于 其他 bean,但又需要其他 bean 先实例化好,这个时候就需要使用 depends-on 特性了。

<bean id="demoBean" class="com.virtuous.demo.spring.DemoBean" depends-on="cat"/>

3.3  后置处理器BeanPostProcessor

BeanPostProcessor 是 bean 实例化时的后置处理器,包含两个方法,其源码如下:

 BeanPostProcessor 是 Spring 框架的一个扩展点,通过实现 BeanPostProcessor 接口,我们就可插手 bean 实例化的过程。比如大家熟悉的 AOP 就是在 bean 实例后期间将切面逻辑织入 bean 实例中的,AOP 也正是通过 BeanPostProcessor 和 IOC 容器建立起了联系。这里我来演示一下 BeanPostProcessor 的使用方式,如下:

/**
 * @author: xjx
 * @description
 * 初始化前后打印信息
 */
public class LoggerBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Before " + beanName + " Initialization");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("After " + beanName + " Initialization");
        return bean;
    }
}
//配置
<bean class="com.virtuous.demo.spring.LoggerBeanPostProcessor"/>

效果如下:

3.3  各种Aware

Spring 中定义了一些列的 Aware 接口,比如这里的 BeanFactoryAware,ApplicationContextAware以及 BeanNameAware 和 BeanClassLoaderAware等。通过实现这些 Aware 接口,我们可以在运行时获取一些配置信息或者其他一些信息。比如实现 BeanNameAware 接口,我们可以获取 bean 的配置名称(beanName)。通过实现 BeanFactoryAware 接口,我们可以在运行时获取 BeanFactory 实例。

posted @ 2023-02-14 06:53  酷酷-  阅读(24)  评论(0)    收藏  举报