大佬勿喷,如果有什么地方理解错了欢迎吐槽

一 、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的更多相关文章

  1. Spring高级特性之四:FactoryBean和BeanFactory

    FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同.落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean--工厂bean,一个建工厂的bean?Be ...

  2. Spring中FactoryBean与BeanFactory的区别

    版本:spring-framework-4.1 一概述 BeanFactory 与 FactoryBean的区别, 两个名字很像,面试中也经常遇到,所以容易搞混,现从源码以及示例两方面来分析. 二.源 ...

  3. 7.FactoryBean 和BeanFactory去区别

    FactoryBean源码: /* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apach ...

  4. Spring FactoryBean和BeanFactory 区别

    1 BeanFactory 是ioc容器的底层实现接口,是ApplicationContext 顶级接口 spring不允许我们直接操作 BeanFactory  bean工厂,所以为我们提供了App ...

  5. 一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。

    前言 通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring ...

  6. Spring里的FactoryBean和BeanFactory有啥区别?

    分别看这俩文章就知道了 Spring的FactoryBean使用 Spring加载xml配置文件的方式 ApplicationContext

  7. [spring源码学习]六、IOC源码-BeanFactory和factory-bean

    一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean(beanName)的方法获取到一个bean的实例外,似乎还有这不少其他获取的方法,例如在第四 ...

  8. BeanFactory和FactoryBean

    BeanFactory和FactoryBean 1.BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是Spring I ...

  9. Spring之BeanFactory和FactoryBean接口的区别

    目录 一.BeanFactory接口 二.FactoryBean接口 1.简单实现 2.增强实现 3.FactoryBean的实际使用案例 三.总结 @   Spring框架中的BeanFactory ...

随机推荐

  1. 统计Shell脚本执行时间

    统计Shell脚本执行时间,帮助分析改进脚本执行 用 date 相减 #!/bin/bash startTime=`date +%Y%m%d-%H:%M:%S` startTime_s=`date + ...

  2. [WesternCTF2018]shrine

    0x00 知识点 SSTI模板注入: 模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程 服务端把用户输入的内容渲染成模板就可能造成SSTI(Server-Side Template In ...

  3. SpringCloud学习之手把手教你用IDEA搭建入门项目(三)

    本篇博客是承接上一篇<手把手教你用IDEA搭建SpringCloud入门项目(二)>,不清楚的请到我的博客空间查看后再看本篇博客,上面两篇博客成功创建了一个简单的SpringCloud项目 ...

  4. pytorch 数据操作

    数据操作 在深度学习中,我们通常会频繁地对数据进行操作.作为动手学深度学习的基础,本节将介绍如何对内存中的数据进行操作. 在PyTorch中,torch.Tensor是存储和变换数据的主要工具.如果你 ...

  5. Bugku web(1—35)

    1.web2 打开网页: 哈哈,其实按下F12你就会发现flag. 2.计算器 打开网页,只是让你输入计算结果,但是发现只能输入一个数字,这时按下F12,修改一下参数,使之可以输入多个数字,修改后输入 ...

  6. (4)关于Alpha通道问题

    其实,我还是不理解,我还是先把我目前懂得和觉得有用的东西先存下来 =================================================================== ...

  7. 【One by one系列】一步步学习TypeScript

    TypeScript Quick Start 1.TypeScript是什么? TypeScript是ES6的超集. TS>ES7>ES6>ES5 Vue3.0已经宣布要支持ts,至 ...

  8. python numpy和矩阵

    2.numpy数据选取 lst=[[1, 2, 3], [4, 5, 6]] np.array(lst)[:-1] Out[32]: array([[1, 2, 3]]) np.array(lst)[ ...

  9. MDK中在stm32下载出现error:flash download failed “cortex-m3”的问题

    主要原因,以前用的是J-LINK ,现在用的是ST-LINK .MDK默认是J-LINK .所以在改了下载器.

  10. 计算机网络(7): 传输层TCP和UDP以及TCP的工作方式

    UDP:无连接:不保证可靠:面向报文的: TCP:面向连接:提供可靠交付:面向字节流(把应用层的数据分包,每个包装一些字节:不关心应用层给的包多大,而是根据网络状况,窗口大小决定) TCP报文: 序号 ...