FactoryBean 和 BeanFactory
大佬勿喷,如果有什么地方理解错了欢迎吐槽
一 、BeanFacory
首先来看看下边的代码
package com.lhf.beanfactory;
public class SingleBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
>>>>>>>>>>>>>>>>>>>>
package com.lhf.beanfactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
@Bean("singleBean")
public SingleBean singleBean(){
SingleBean bean = new SingleBean();
bean.setName("liu hui fa");
return bean;
}
}
>>>>>>>>>>>>>>>>>>>>>
package com.lhf.beanfactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
SingleBean bean = (SingleBean)beanFactory.getBean("singleBean");
System.out.println(bean.getName());
}
}
再来大概的看看ConfigurableListableBeanFactory类
上图可以看到ConfigurableListableBeanFactory是BeanFactory的一个子接口。从上边的代码可以看到,ApplicationContext是可以获取到BeanFactory,但是上边的结构图中又发现ApplicationContext也只是BeanFactory的一个子接口而已,这不难看出BeanFactory是Spring用管理bean对象的。
也就是不用ApplicationContext直接使用BeanFactor也同样可以获得bean对象。因为前者的getBean方法就是从后者的继承过去的。(有兴趣的同志可以试一下,我就懒得写了)
二、FactoryBean
在手动整合SSM框架的时候SqlSessionFactory应该是经常出现的。简单来说他也是一个bean对象。
package com.lhf.factory; import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean; import java.security.MessageDigest; public class MessageDigestFactoryBean implements FactoryBean<MessageDigest>, InitializingBean {
private String algorithmName = "MD5";
private MessageDigest messageDigest = null; @Override
public MessageDigest getObject() throws Exception {
return messageDigest;
} @Override
public Class<?> getObjectType() {
return MessageDigest.class;
} @Override
public boolean isSingleton() {
return true;
} public String getAlgorithmName() {
return algorithmName;
} public void setAlgorithmName(String algorithmName) {
this.algorithmName = algorithmName;
} @Override
public void afterPropertiesSet() throws Exception {
messageDigest = MessageDigest.getInstance(algorithmName);
}
}
上边代码是手动创建的一个FactoryBean,借助spring钩子创建了一个MessageDigest对象,algorithmName是加密的方法,默认是MD5。
package com.lhf.factory;
import java.security.MessageDigest;
public class MessageDisgester {
private MessageDigest messageDigest1;
private MessageDigest messageDigest2;
public MessageDigest getMessageDigest1() {
return messageDigest1;
}
public void setMessageDigest1(MessageDigest messageDigest1) {
this.messageDigest1 = messageDigest1;
}
public MessageDigest getMessageDigest2() {
return messageDigest2;
}
public void setMessageDigest2(MessageDigest messageDigest2) {
this.messageDigest2 = messageDigest2;
}
private void disget(String mes,MessageDigest messageDigest){
System.out.println("使用的加密算法是:"+messageDigest.getAlgorithm());
messageDigest.reset();
byte[] bytes = mes.getBytes();
byte[] digest = messageDigest.digest(bytes);
System.out.println(digest);
}
public void disest(String mes){
System.out.println("使用1");
disget(mes,messageDigest1);
System.out.println("使用2");
disget(mes,messageDigest2);
}
}
MessageDisgester依赖于两个MessageDigest
package com.lhf.factory; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class Config { @Bean("messageDigest1")
public MessageDigestFactoryBean messDigestFactoryBean1(){
MessageDigestFactoryBean bean = new MessageDigestFactoryBean();
bean.setAlgorithmName("SHA1");
return bean;
}
@Bean("messageDigest2")
public MessageDigestFactoryBean messDigestFactoryBean2(){
MessageDigestFactoryBean bean = new MessageDigestFactoryBean();
return bean;
}
@Bean
public MessageDisgester messageDisgester() throws Exception {
MessageDisgester disgester = new MessageDisgester();
disgester.setMessageDigest1(messDigestFactoryBean1().getObject());
disgester.setMessageDigest2(messDigestFactoryBean2().getObject());
return disgester;
}
}
这个配置分别声明了三个bean,两个工厂bean,和MessageDisgester的bean。
package com.lhf.factory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
MessageDisgester bean = context.getBean(MessageDisgester.class);
bean.disest("呵呵");
System.out.println("直接访问factorybean");
MessageDigestFactoryBean bean1 = (MessageDigestFactoryBean)context.getBean("&messageDigest1");
byte[] digest = bean1.getObject().digest("呵呵呵".getBytes());
System.out.println(digest);
context.close();
}
}
看出了什么?像不像设计模式中的工厂模式?看看这个名字就知道了,FactoryBean就是一个bean工厂而已,他会根据不同需求创建出你需要的不同的bean对象。
总结: BeanFactory管理bean对象,通过BeanFactory可以获取到ioc容器中的bean对象,我对他的理解是管理已注册的bean,因为他功能不仅仅这样,bean之间的依赖关系等也是由他管理。而FactoryBean就可以理解成23种设计模式中的工厂模式,根据不同需要,创建出相对应的实例
FactoryBean 和 BeanFactory的更多相关文章
- Spring高级特性之四:FactoryBean和BeanFactory
FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同.落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean--工厂bean,一个建工厂的bean?Be ...
- Spring中FactoryBean与BeanFactory的区别
版本:spring-framework-4.1 一概述 BeanFactory 与 FactoryBean的区别, 两个名字很像,面试中也经常遇到,所以容易搞混,现从源码以及示例两方面来分析. 二.源 ...
- 7.FactoryBean 和BeanFactory去区别
FactoryBean源码: /* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apach ...
- Spring FactoryBean和BeanFactory 区别
1 BeanFactory 是ioc容器的底层实现接口,是ApplicationContext 顶级接口 spring不允许我们直接操作 BeanFactory bean工厂,所以为我们提供了App ...
- 一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。
前言 通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring ...
- Spring里的FactoryBean和BeanFactory有啥区别?
分别看这俩文章就知道了 Spring的FactoryBean使用 Spring加载xml配置文件的方式 ApplicationContext
- [spring源码学习]六、IOC源码-BeanFactory和factory-bean
一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean(beanName)的方法获取到一个bean的实例外,似乎还有这不少其他获取的方法,例如在第四 ...
- BeanFactory和FactoryBean
BeanFactory和FactoryBean 1.BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是Spring I ...
- Spring之BeanFactory和FactoryBean接口的区别
目录 一.BeanFactory接口 二.FactoryBean接口 1.简单实现 2.增强实现 3.FactoryBean的实际使用案例 三.总结 @ Spring框架中的BeanFactory ...
随机推荐
- PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]
题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...
- redhat8 不支持ansible批量管理解决方案
redhat8默认不安装python,因此无法通过python去管理,直接上解决方案. dnf install python3 -y alternatives --set python /usr/bi ...
- 201771010123汪慧和《面向对象程序设计Java》第十三周实验总结
一.理论部分 1.GUI为用户提供交互式的图形化操作界面. (1)提供了程序的外观和感觉.(2)程序利用图形用户界面接受用户的输入,向用户输出程序运行的结果. 2.Java有专门的类库生成各种标准图 ...
- 恒生UFX交易接口基本介绍
https://zhidao.baidu.com/question/203296047903136445.html 1.恒生UFT和UFX有什么区别? UFT是一个极速交易系统,UFX是一个统一接入系 ...
- Mybatis核心类生命周期和管理
Mybatis核心类生命周期和管理 原文链接:https://blog.csdn.net/qq1134550437/article/details/51960480 1.SqlSessionFacto ...
- java线程——线程局部变量
一,线程局部变量ThreadLocal的作用 用于实现线程内部的数据共享,既对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,在另一个线程访问的时候,访问的由是另一份数据. 每个线程调用 ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL LIKE 子句
在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录. WHERE 子句中可以使用等号 = 来设定获取数据的条件, ...
- c语言:函数的递归调用
c语言可以将代码模块化,这是其很重要的一个特性. 说道代码模块化,我们很自然的就会联想到函数.而函数中,比较难的一个知识点就是函数的递归调用. 值得注意的是,函数的递归调用在现实工作并不是很常用,但是 ...
- 插曲 强大的神器 vmware
电脑到了 这连天给电脑配环境变量 真的想死 发现用 虚拟机 直接跑别人配置好的镜像文件 多快好省超级开心 比较毒瘤的 clion 不仅要配置c++ 环境 还要走cmake 等一堆东西 ...
- C语言程序设计|05
问题 回答 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/9772 我在 ...
