zoukankan      html  css  js  c++  java
  • BeanFactory和FactoryBean的区别简介

      BeanFactory

      BeanFactory是一个接口也是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,比如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等具体的容器都是对BeanFactory接口的实现,再在其基础之上附加其它的功能。

      FactoryBean

      FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String beanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&beanNme),在BeanName之前加上&。

      隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利.

      和设计模式中的工厂模式和修饰器模式相似.

      getBean(beanName)方法获取的是getObject()返回的对象。

      getBean(&beanName)方法获取的才是实现FactoryBean的对象。

      getObject()里面可以返回如何对象,所以FactoryBean为Bean提供了更加灵活的实现方式。

      FactoryBean的案例

      1.创建FactoryBean的实现类

      getBean(beanName)方法获取的是getObject()返回的对象。

      getBean(&beanName)方法获取的才是实现FactoryBean的对象。

      getObject()方法确实可以实现隐藏实现的细节的功能。

      getObject()里面可以返回如何对象,所以FactoryBean为Bean提供了更加灵活的实现方式。

      package factorybean;

      import org.springframework.beans.factory.FactoryBean;

      public class FactoryBeanPojo implements FactoryBean {

      private String type;

      /**

      * getBean获取的是getObject()方法返回的对象

      * @return

      * @throws Exception

      */

      @Override

      public Object getObject() throws Exception {

      if("student".equals(type)){

      Student student = new Student();

      student.setName("学生");

      return student;

      }else{

      Teacher teacher = new Teacher();

      teacher.setName("老司机");

      return teacher;

      }

      }

      @Override

      public boolean isSingleton() {

      return true;

      }

      @Override

      public Class getObjectType() {

      return Teacher.class;

      }

      public String getType() {

      return type;

      }

      public void setType(String type) {

      this.type = type;

      }

      }郑州人流价格 http://www.zzzykdfk.com/

      2.创建两个普通的Bean

      package factorybean;

      public class Student {

      private String name;

      public Student(){

      }

      public String getName() {

      return name;

      }

      public void setName(String name) {

      this.name = name;

      }

      }

      package factorybean;

      public class Teacher {

      private String name;

      public Teacher(){

      }

      public String getName() {

      return name;

      }

      public void setName(String name) {

      this.name = name;

      }

      }

      3.测试代码

      package factorybean;

      import org.springframework.context.ApplicationContext;

      import org.springframework.context.support.ClassPathXmlApplicationContext;

      public class FactoryBeanTest {

      public static void main(String[] args) {

      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

      Object student = applicationContext.getBean("factoryBeanPojo");

      System.out.println("student:"+student);

      Object factoryBeanPojo = applicationContext.getBean("&factoryBeanPojo");

      System.out.println("factoryBeanPojo:"+factoryBeanPojo);

      }

      }

      4.spring配置文件

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

      5.代码执行结果

      1.getBean(beanName)由于spring配置的是student所以getObject()返回的是Student对象。

      2.getBean(&beanName)返回的是实现FactoryBean接口对象本身在这里也验证了。

      BeanFactory

      BeanFactory是一个接口也是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,比如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等具体的容器都是对BeanFactory接口的实现,再在其基础之上附加其它的功能。

      FactoryBean

      FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String beanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&beanNme),在BeanName之前加上&。

      隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利.

      和设计模式中的工厂模式和修饰器模式相似.

      getBean(beanName)方法获取的是getObject()返回的对象。

      getBean(&beanName)方法获取的才是实现FactoryBean的对象。

      getObject()里面可以返回如何对象,所以FactoryBean为Bean提供了更加灵活的实现方式。

      FactoryBean的案例

      1.创建FactoryBean的实现类

      getBean(beanName)方法获取的是getObject()返回的对象。

      getBean(&beanName)方法获取的才是实现FactoryBean的对象。

      getObject()方法确实可以实现隐藏实现的细节的功能。

      getObject()里面可以返回如何对象,所以FactoryBean为Bean提供了更加灵活的实现方式。

      package factorybean;

      import org.springframework.beans.factory.FactoryBean;

      public class FactoryBeanPojo implements FactoryBean {

      private String type;

      /**

      * getBean获取的是getObject()方法返回的对象

      * @return

      * @throws Exception

      */

      @Override

      public Object getObject() throws Exception {

      if("student".equals(type)){

      Student student = new Student();

      student.setName("学生");

      return student;

      }else{

      Teacher teacher = new Teacher();

      teacher.setName("老司机");

      return teacher;

      }

      }

      @Override

      public boolean isSingleton() {

      return true;

      }

      @Override

      public Class getObjectType() {

      return Teacher.class;

      }

      public String getType() {

      return type;

      }

      public void setType(String type) {

      this.type = type;

      }

      }

      2.创建两个普通的Bean

      package factorybean;

      public class Student {

      private String name;

      public Student(){

      }

      public String getName() {

      return name;

      }

      public void setName(String name) {

      this.name = name;

      }

      }

      package factorybean;

      public class Teacher {

      private String name;

      public Teacher(){

      }

      public String getName() {

      return name;

      }

      public void setName(String name) {

      this.name = name;

      }

      }

      3.测试代码

      package factorybean;

      import org.springframework.context.ApplicationContext;

      import org.springframework.context.support.ClassPathXmlApplicationContext;

      public class FactoryBeanTest {

      public static void main(String[] args) {

      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

      Object student = applicationContext.getBean("factoryBeanPojo");

      System.out.println("student:"+student);

      Object factoryBeanPojo = applicationContext.getBean("&factoryBeanPojo");

      System.out.println("factoryBeanPojo:"+factoryBeanPojo);

      }

      }

      4.spring配置文件

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

      5.代码执行结果

      1.getBean(beanName)由于spring配置的是student所以getObject()返回的是Student对象。

      2.getBean(&beanName)返回的是实现FactoryBean接口对象本身在这里也验证了。

  • 相关阅读:
    线程池的优雅关闭实践
    InheritableThreadLocal原理解析
    线程池踩坑
    两个线程通讯(生产-卖面包问题)
    谈谈redis的热key问题如何解决
    中国软件杯选题A1数据智能分析报告系统
    《程序员的思维修炼》读后感
    《算法导论》读后感
    《重构》读后感
    《代码整洁之道》读后感
  • 原文地址:https://www.cnblogs.com/djw12333/p/12101770.html
Copyright © 2011-2022 走看看