认识AutowireCapableBeanFactory

AutowireCapableBeanFactory是在BeanFactory的基础上实现对已存在实例的管理。可以使用这个接口集成其他框架,捆绑并填充并不由Spring管理生命周期并已存在的实例。

ApplicationContext接口没有实现AutowireCapableBeanFactory接口,因为应用代码很少用到此功能,如果需要的话,可以调用ApplicationContextgetAutowireCapableBeanFactory方法,来获取此接口的实例。

AutowireCapableBeanFactory接口源码:

public interface AutowireCapableBeanFactory extends BeanFactory {

    /**
* 常量,用于标识外部自动装配功能是否可用。但是此标识不影响正常的(基于注解的等)自动装配功能的使用
*/
int AUTOWIRE_NO = 0; /**
* 标识按名装配的常量
*/
int AUTOWIRE_BY_NAME = 1; /**
* 标识按类型自动装配的常量
*/
int AUTOWIRE_BY_TYPE = 2; /**
* 标识按照贪婪策略匹配出的最符合的构造方法来自动装配的常量
*/
int AUTOWIRE_CONSTRUCTOR = 3; /**
* 标识自动识别一种装配策略来实现自动装配的常量
*/
@Deprecated
int AUTOWIRE_AUTODETECT = 4; /**
* 创建一个给定Class的实例。
* 执行此Bean所有的关于Bean生命周期的接口方法如BeanPostProcessor
* 此方法用于创建一个新实例,它会处理各种带有注解的域和方法,并且会调用所有Bean初始化时所需要调用的回调函数
* 此方法并不意味着by-name或者by-type方式的自动装配,如果需要使用这写功能,可以使用其重载方法
*/
<T> T createBean(Class<T> beanClass) throws BeansException; /**
* Populate the given bean instance through applying after-instantiation callbacks
* 通过调用给定Bean的after-instantiation及post-processing接口,对bean进行配置。
* 此方法主要是用于处理Bean中带有注解的域和方法。
* 此方法并不意味着by-name或者by-type方式的自动装配,如果需要使用这写功能,可以使用其重载方法autowireBeanProperties
*/
void autowireBean(Object existingBean) throws BeansException; /**
* Configure the given raw bean: autowiring bean properties, applying
* 配置参数中指定的bean,包括自动装配其域,对其应用如setBeanName功能的回调函数。
* 并且会调用其所有注册的post processor.
* 此方法提供的功能是initializeBean方法的超集,会应用所有注册在bean definenition中的操作。
* 不过需要BeanFactory 中有参数中指定名字的BeanDefinition。
*/
Object configureBean(Object existingBean, String beanName) throws BeansException; /**
* 创建一个指定class的实例,通过参数可以指定其自动装配模式(by-name or by-type).
* 会执行所有注册在此class上用以初始化bean的方法,如BeanPostProcessors等
*/
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; /**
* 通过指定的自动装配策略来初始化一个Bean。
* 此方法不会调用Bean上注册的诸如BeanPostProcessors的回调方法
*/
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; /**
* 通过指定的自动装配方式来对给定的Bean进行自动装配。
* 不过会调用指定Bean注册的BeanPostProcessors等回调函数来初始化Bean。
* 如果指定装配方式为AUTOWIRE_NO的话,不会自动装配属性,但是依然会调用BeanPiostProcesser等回调方法。
*/
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException; /**
* 将参数中指定了那么的Bean,注入给定实例当中
* 此方法不会自动注入Bean的属性,它仅仅会应用在显式定义的属性之上。如果需要自动注入Bean属性,使用
* autowireBeanProperties方法。
* 此方法需要BeanFactory中存在指定名字的Bean。除了InstantiationAwareBeanPostProcessor的回调方法外,
* 此方法不会在Bean上应用其它的例如BeanPostProcessors
* 等回调方法。不过可以调用其他诸如initializeBean等方法来达到目的。
*/
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; /**
* 初始化参数中指定的Bean,调用任何其注册的回调函数如setBeanName、setBeanFactory等。
* 另外还会调用此Bean上的所有postProcessors 方法
*/
Object initializeBean(Object existingBean, String beanName) throws BeansException; /**
* 调用参数中指定Bean的postProcessBeforeInitialization方法
*/
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException; /**
* 调用参数中指定Bean的postProcessAfterInitialization方法
*/
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException; /**
* 销毁参数中指定的Bean,同时调用此Bean上的DisposableBean和DestructionAwareBeanPostProcessors方法
* 在销毁途中,任何的异常情况都只应该被直接捕获和记录,而不应该向外抛出。
*/
void destroyBean(Object existingBean); /**
* 查找唯一符合指定类的实例,如果有,则返回实例的名字和实例本身
* 和BeanFactory中的getBean(Class)方法类似,只不过多加了一个bean的名字
*/
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException; /**
* 解析出在Factory中与指定Bean有指定依赖关系的Bean
* 参数建下一个方法
*/
Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) throws BeansException; /**
* 解析指定Bean在Factory中的依赖关系
* @param descriptor 依赖描述 (field/method/constructor)
* @param requestingBeanName 依赖描述所属的Bean
* @param autowiredBeanNames 与指定Bean有依赖关系的Bean
* @param typeConverter 用以转换数组和连表的转换器
* @return the 解析结果,可能为null
*/
Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName,
Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
}

测试

参考:

Spring—容器外的Bean使用依赖注入的更多相关文章

  1. 在Spring容器外调用bean

    这个东西源于这种需求:一个应用丢到服务其后,不管用户有没有访问项目,这个后台线程都必须给我跑,而且这个线程还调用了Spring注入的bean,这样自然就会想到去监听Servlet的状态,当Servle ...

  2. Spring 04: IOC控制反转 + DI依赖注入

    Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...

  3. 7 -- Spring的基本用法 -- 5... Spring容器中的Bean;容器中Bean的作用域;配置依赖;

    7.5 Spring容器中的Bean 7.5.1 Bean的基本定义和Bean别名 <beans.../>元素是Spring配置文件的根元素,该元素可以指定如下属性: default-la ...

  4. 给力啊!这篇Spring Bean的依赖注入方式笔记总结真的到位,没见过写的这么细的

    1. Bean的依赖注入概念 依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现.在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是 ...

  5. 采用Spring管理Bean和依赖注入

    1. 实例化spring容器和从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext ctx ...

  6. 详解 Spring 3.0 基于 Annotation 的依赖注入实现(转)

    使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的 ...

  7. 详解 Spring 3.0 基于 Annotation 的依赖注入实现--转载

    使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的 ...

  8. 详解 Spring 3.0 基于 Annotation 的依赖注入实现

    Spring 的依赖配置方式与 Spring 框架的内核自身是松耦合设计的.然而,直到 Spring 3.0 以前,使用 XML 进行依赖配置几乎是唯一的选择.Spring 3.0 的出现改变了这一状 ...

  9. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

随机推荐

  1. websocket ddos检测脚本

    from websocket import create_connection while(1): ws = create_connection('wss://ha-cmim.cmcc-cs.cn:1 ...

  2. ZooKeeper未授权漏洞

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终, ...

  3. 使用Mac的Remote Desktop Manager连接ubuntu16.04 & Win10的远程桌面

    疫情严重,公司实行远程办公.自己只有mac电脑,苦于3个系统间跨平台建立远程桌面. 今天,终于尝试成功!特来记录,以防别人踩坑! Mac远程软件安装 Remote Desktop Manager软件非 ...

  4. Java实现蓝桥杯VIP 算法训练 sign函数

    问题描述 给定实数x,输出sign(x)的值. sign(x)是符号函数,如果x>0,则返回1:如果x=0,则返回0:如果x<0,则返回-1. 输入格式 一行一个实数x. 输出格式 一行一 ...

  5. Java实现 蓝桥杯 算法训练 谁干的好事?

    试题 算法训练 谁干的好事? 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 ABCDE中num个人做了好事,truth个人说真话. A说:"我和X中有且只有一个做了好事& ...

  6. Java实现 蓝桥杯 算法提高 成绩排序2

    试题 算法提高 成绩排序2 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出n个学生的成绩,将这些学生按成绩排序,排序规则:总分高的在前:总分相同,数学成绩高的在前:总分与数学相 ...

  7. Java实现第十届蓝桥杯不同子串

    试题 C: 不同子串 本题总分:10 分 [问题描述] 一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串.例如,字符串aaab 有非空子串a, b, aa, ab, aaa, ...

  8. Fiddler工具学习使用总结

    1.初识fiddler: 作用:截获http/HTTPS请求,查看截获的请求内容,伪造客户端请求和服务器响应,测试网站性能,解密https的web会话,提供插件. 工作环境:支持素有操作系统和所有浏览 ...

  9. 记一次Docker中Redis连接暴增的问题排查

    周六生产服务器出现redis服务器不可用状态,错误信息为: 状态不可用,等待后台检查程序恢复方可使用.Unexpected end of stream; expected type 'Status' ...

  10. 提高编译速度! 第一次运行需要注释掉,不然会报错,因为需要编译SO库文件 !

    // 提高编译速度! 第一次运行需要注释掉,不然会报错,因为需要编译SO库文件 ! tasks.whenTaskAdded { task -> if (task.name.contains(&q ...