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

一 、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. 利用IIS6提权获得管理员权限

    IIS6也是一个比较古老的提权EXP了,是通过利用WMI的权限来执行命令. 目标机:漏洞巨多的Win2003 下面说一下通过IIS6在已用菜刀连接上的服务器上运用IIS6获得管理员权限的过程. 1.将 ...

  2. meta标签小结

    1.手机页面所需: <meta name="viewport" content="width=device-width,initial-scale=1.0,mini ...

  3. kuangbin专题——简单搜索

    A - 棋盘问题 POJ - 1321 题意 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大 ...

  4. tensorflow笔记2(北大网课实战)

    1.正则化缓解过拟合 正则化在损失函数中引入模型复杂度指标,利用给w加权值,弱化了训练数据的噪声 一般不会正则化b. 2.matplotlib.pyplot 3.搭建模块化的神经网络八股: 前向传播就 ...

  5. Java算法练习——两数相加

    题目链接 题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新 ...

  6. Java 跨系统开发隐患(一)

    换行符 主流系统换行符如下: Windows : \r\n Linux : \n Unix : \r 为了保证代码可以跨系统开发或使用,建议使用换行符时用下列语句获取: System.getPrope ...

  7. 18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询

    -- 数据的准备 -- 创建一个数据库 create database python_test charset=utf8; -- 使用一个数据库 use python_test; -- 显示使用的当前 ...

  8. List、Set和Map详解及其区别和他们分别适用的场景

    Java中的集合包括三大类 它们是Set(集).List(列表)和Map(映射),它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类.Set的实现类主要有HashS ...

  9. junit中@Before和@BeforeClass区别

    @before 在每个测试方法之前都执行一次, 方法需要声明为public @beforeclass 只在类中执行一次, 必须声明为public static

  10. [CF百场计划]#3 Educational Codeforces Round 82 (Rated for Div. 2)

    A. Erasing Zeroes Description You are given a string \(s\). Each character is either 0 or 1. You wan ...