Spring Boot中@Value和BeanPostProcessor详细讲解-刘宇

作者:刘宇
CSDN博客地址:https://blog.csdn.net/liuyu973971883
有部分资料参考,如有侵权,请联系删除。如有不正确的地方,烦请指正,谢谢。

一、@Value

1.1、简单介绍

该注解用于给指定元素设置指定的默认值表达式,主要作用于字段、方法/构造函数参数、注解等上面。值得注意的是,@Value注释的实际处理是由BeanPostProcessor执行的,这意味着我们是不能在BeanPostProcessor或BeanFactoryPostProcessor类型中使用@Value的。

1.2、注入类别

  • 注入普通字符串:
@Value("brycen")
private String name; 
  • 注入操作系统属性:
    其中systemProperties为java系统的变量
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName; 
  • 注入表达式结果:
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private String systemPropertiesName; 
  • 注入其他Bean的属性:
    其中user为我自己定义的一个类,name为user类中的一个字段属性
@Value("#{user.name}")
private String userName; 
  • 读取配置文件内容:
@Value("${person.name}")
private String personName;
yml配置如下
person:
  name: brycen
  • 注入文件资源:
@Value("classpath:com/brycen/demo/config/config.txt")
private Resource configFile;
  • 注入URL资源:
@Value("http://www.baidu.com")
private Resource url;

二、BeanPostProcessor

2.1、简单介绍

  • 它是一个接口,又称后置处理器。它是个工厂钩子,类似于回调,允许对新的bean实例进行自定义的修改。它的作用就在于当Bean对象在实例化和依赖注入完成之后,在显示调用初始化方法的前后执行我们自己的业务逻辑。简而言之,BeanPostProcessor是针对已经实例化好的对象做处理的。
  • Applicationcontext可以在bean定义中自动检测BeanPostProcessor Bean实例,并将它们注册到容器里面,在稍后的处理流程中将它们应用于随后创建的任何bean。
  • 普通的BeanFactory允许以编程方式注册后处理器,并将它们应用于通过bean工厂创建的所有bean。
  • 在ApplicationContext中自动检测到的BeanPostProcessor将根据org.springframework.core. PriorityOrdered和org.springframework.core.Ordered语义进行排序。反之,通过编程方式向BeanFactory注册的BeanPostProcessor将按照注册的顺序应用。对于编程方式注册的,我们可以通过实现Order接口来对BeanPostProcessor实例进行排序,在BeanPostProcessor实例上我们是不考虑使用@Order注解的。

2.2、BeanPostProcessor 中方法讲解

看方法名称分别是在初始化之前和之后,但是这个初始化并非对象的实例化,是分别在InitializingBean的afterPropertiesSet方法以及自定义了init-method方法的前后被回调

package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;
import org.springframework.lang.Nullable;

public interface BeanPostProcessor {
	
	//对实例化后的bean的afterPropertiesSet方法以及init-method方法进行前置处理
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
	//对实例化后的bean的afterPropertiesSet方法以及init-method方法进行后置处理
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
}

三、BeanFactoryPostProcessor

3.1、简单介绍

  • 它是一个Bean工厂的后置处理器,能够让我们开发者对ApplicationContext的bean进行自定义的修改,ApplicationContext能够在bean定义中自动的检测到BeanFactoryPostProcessor,然后在其他任何的bean创建之前,将它应用。
  • BeanFactoryPostProcessor能够将我们提供的配置信息覆盖掉应用上下文中已存在的配置。
  • BeanFactoryPostProcessor它能够与bean的定义进行交互也可以修改bean的定义,但是它不会与bean的实例进行交互以及修改,如果我们需要与bean实例进行交互的话就需要实现BeanPostProcessor
  • BeanFactoryPostProcessor也可以通过编程方式注册到ConfigurableApplicationContext中。
  • 在ApplicationContext中自动检测到的BeanFactoryPostProcessor将根据org.springframework.core. PriorityOrdered和org.springframework.core.Ordered语义进行排序。反之,通过编程方式向ConfigurableApplicationContext注册的BeanFactoryPostProcessor将按照注册的顺序应用。对于编程方式注册的,我们可以通过实现Order接口来对BeanFactoryPostProcessor实例进行排序,在BeanFactoryPostProcessor实例上我们是不考虑使用@Order注解的。

3.2、BeanFactoryPostProcessor方法介绍

主要是用于在应用程序上下文的标准初始化之后修改其内部bean工厂,此刻所有bean的定义(无论是@Bean还是配置文件定义的Bean)都已经被加载进内存了,但是还没有bean被实例化。此时,就可以对这些bean的属性进行覆盖或添加,包括非延迟的bean。

package org.springframework.beans.factory.config;
import org.springframework.beans.BeansException;

@FunctionalInterface
public interface BeanFactoryPostProcessor {

	//这个方法就是在所有bean定义被加载后并且在所有bean实例化前执行
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

四、AutowiredAnnotationBeanPostProcessor

  • 它是BeanPostProcessor的实现,所以它面向的是Bean的实例,而不是Bean的定义。
  • 它会自动的装配被注解的Field、setter方法以及任意配置好的方法,默认情况下他们是通过Java5的@Value和@Autowired注解被检测到的。
  • 对于任意一个bean的类最多只能有一个构造方法可以将@Autowired注解的required申明为true。如果有多个非必选的构造方法都申明了这个注解,他们将被视为自动装配的候选方案,其中拥有最多数量依赖的构造方法将会被选择出来,如果没有候选的构造方法得到满足,那么将使用主/默认构造函数(如果存在)。
  • 成员变量的注入是在一个bean的构建之后立即就会执行的,但是又是在任何的配置方法被调用之前。
  • 配置方法可以是任意的名称和任意多的参数,这些参数会从Spring容器中匹配一个bean来对其进行自动装配

其实AutowiredAnnotationBeanPostProcessor是通过其源码内部的AutowiredFieldElement和AutowiredMethodElement内部类去解析@Value和@Autowired注解的,感兴趣的话可以自行debug一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值