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

一 、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. SQL审核平台-Yearning安装部署实践

    相关文档: https://guide.yearning.io/ yearning简介 http://python.yearning.io/install/  yearning安装 Yearning ...

  2. vnpy交易接口学习

    1.按照github中环境准备要求,配置好环境要求. https://github.com/vnpy/vnpy mongdb安装在D:\Program Files\MongoDB\Server\3.4 ...

  3. Servlet详细教程

    Servlet简介 servlet是Server Applet的简称,翻译过来就是服务程序.好吧,这么说你可能还是不太懂,简单的讲,这个servlet是运行在服务器上的一个小程序,用来处理服务器请求的 ...

  4. Springboot前后端分离中,后端拦截器拦截后,前端没有对应的返回码可以判断

    项目登录流程如下 用户进入前端登录界面,输入账号密码等,输入完成之后前端发送请求到后端(拦截器不会拦截登录请求),后端验证账号密码等成功之后生成Token并存储到数据库,数据库中包含该Token过期时 ...

  5. JNI传递修改自定义Java Class数组数据

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 结合前面讲的2篇关于JNI的文章,这里直接把代码贴上,主要是要知道如果传递自定义Class Array的时 ...

  6. 汪慧和201771010123《面向对象程序设计(Java)》第三周学习总结

    1.实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟悉PTA平台线上测试环境: (3)掌握Java语言构造基本程序语法知识(ch1-ch3): (4)利 ...

  7. Halcon函数总结(一)

    Halcon函数总结: read_image( :Image :FileName : )  //读入图像 crop_part(Image : ImagePart :Row,Column,Width,H ...

  8. vue安装openlayers,jquery,bootstrap,阿里iconfont,

    安装 安装openlayers安装指定包安装openlayersVUE中的地图import ol from "openlayers";import "openlayers ...

  9. 业内首发 | 区块链数据服务 - BDS

    区块链数据服务(Blockchain Data Service,BDS)是京东云区块链产品部发推出的,其将区块链的链式.非结构化数据通过技术手段进行结构化存储,实时同步到高性能数据仓库中. 用户可以通 ...

  10. Object中有哪些公共方法及作用

    大家在学习java的时候,一定遇到过Object类,因为在java单一继承体系中Object类是根类,所有的类都会继承它,并拥有Object的公共方法,意味着在java的面向对象的世界中,所有对象都拥 ...