Spring自动注入AutowireCapableBeanFactory

2024-03-11 23:32

本文主要是介绍Spring自动注入AutowireCapableBeanFactory,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spring提供了属性自动注入的特性,可以在xml中配置进行自动注入,也可以使用注解的方式进行属性自动注入。在xml中使用自动装配的方式类似下面:

<beans default-autowire="byName"> // 全局自动装配方式<bean id="test1" class="com.wang.Test1" autowire-candidate="false" /> // 排除自动装配<bean id="test2" class="com.wang.Test2" autowire="byName" /> // 特别指定装配方式<bean id="test3" class="com.wang.Test3" autowire="byType" /> // 特别指定装配方式
</beans>

使用注解自动装配的方式如下:

@Autowired(required=true) // 装配不上报错,只能byType
@Qualifier(value="aaa") // 指定byName
private Test t1;@Resource(name = "aaa") // 指定ByName
private Test t1;

知道了使用方式,研究的对象就具体化了,利于我们下手也利于我们记忆其中的原理。还有使用AutowireCapableBeanFactory的场景是我们需要注意的,常见的是在web.xml中配置的Servlet或者Filter是独立于Spring的IOC容器的,也就是不受Spring管理,所以有时需要将Servlet或Filter加入到Spring管理范畴内,这时就使用到了AutowireCapableBeanFactory:

public void init(ServletConfig servletConfig) throws ServletException {ServletContext servletContext = servletConfig.getServletContext();WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext.getAutowireCapableBeanFactory();autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
}

这样就将Servlet注入到Spring管理的范畴内了,当然手动注入到Spring IOC容器的方式还有其他的,这里没有列举出来。下面我们再来看看org.springframework.beans.factory.config.AutowireCapableBeanFactory这个接口的规范和实现情况,下面是这个接口的完整定义:

public interface AutowireCapableBeanFactory extends BeanFactory {int AUTOWIRE_NO = 0;int AUTOWIRE_BY_NAME = 1;int AUTOWIRE_BY_TYPE = 2;int AUTOWIRE_CONSTRUCTOR = 3;@Deprecatedint AUTOWIRE_AUTODETECT = 4;//-------------------------------------------------------------------------// Typical methods for creating and populating external bean instances//-------------------------------------------------------------------------<T> T createBean(Class<T> beanClass) throws BeansException;void autowireBean(Object existingBean) throws BeansException;Object configureBean(Object existingBean, String beanName) throws BeansException;//-------------------------------------------------------------------------// Specialized methods for fine-grained control over the bean lifecycle//-------------------------------------------------------------------------Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException;void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;Object initializeBean(Object existingBean, String beanName) throws BeansException;Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;void destroyBean(Object existingBean);//-------------------------------------------------------------------------// Delegate methods for resolving injection points//-------------------------------------------------------------------------// DefaultListableBeanFactory实现<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;@NullableObject resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;// DefaultListableBeanFactory实现@NullableObject resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName, @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;
}

通过阅读源码可以知道AutowireCapableBeanFactory接口的实现分别由org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory和org.springframework.beans.factory.support.DefaultListableBeanFactory,具体由哪个实现上面有注释。
从宏观上看,AutowireCapableBeanFactory提供了如下能力:
1、为已经实例化的对象装配属性,这些属性对象都是Spring管理的;
2、实例化一个类型,并自动装配,这些属性对象都是Spring管理的,实例话的类不被Spring管理。所以这个接口提供功能就是自动装配bean相关的,具体实现方式来看源代码。

这篇关于Spring自动注入AutowireCapableBeanFactory的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/799434

相关文章

Java 中的跨域问题解决方法

《Java中的跨域问题解决方法》跨域问题本质上是浏览器的一种安全机制,与Java本身无关,但Java后端开发者需要理解其来源以便正确解决,下面给大家介绍Java中的跨域问题解决方法,感兴趣的朋友一起... 目录1、Java 中跨域问题的来源1.1. 浏览器同源策略(Same-Origin Policy)1.

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

javascript fetch 用法讲解

《javascriptfetch用法讲解》fetch是一个现代化的JavaScriptAPI,用于发送网络请求并获取资源,它是浏览器提供的全局方法,可以替代传统的XMLHttpRequest,这篇... 目录1. 基本语法1.1 语法1.2 示例:简单 GET 请求2. Response 对象3. 配置请求

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

Logback在SpringBoot中的详细配置教程

《Logback在SpringBoot中的详细配置教程》SpringBoot默认会加载classpath下的logback-spring.xml(推荐)或logback.xml作为Logback的配置... 目录1. Logback 配置文件2. 基础配置示例3. 关键配置项说明Appender(日志输出器

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht