【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 实例。

浙公网安备 33010602011771号