zoukankan      html  css  js  c++  java
  • FactoryBean简介

    网上看了很多关于FactoryBean和BeanFactory的介绍,总感觉说的不够简单、直白,今天用自己的语言来描述下,如果有不对的地方,还请大家指正。

    1. FactoryBean和BeanFactory的区别

    这点其实是大家最关心或者说最困惑的地方,其实从最简单的字面上来看,BeanFactory是个用来创建Bean的Factory(BeanFactory是bean工厂的顶层接口),它的作用是用来创建Bean的,总之一句话,它是个Factory,一个用来创建Bean的Factory。

    而FactoryBean是个Bean,就是一个普普通通简简单单的Bean,只是Spring中所有的Bean都实现了这个Bean或者间接实现了这个Bean。也是一句话,FactoryBean就是一个Bean。

    BeanFactory创建出来的每个Bean都是FactoryBean!!!!!!最最简单经典的解释。

    2. FactoryBean的由来和背景在Spring中创建Bean的首选方法就是在配置文件中配置bean的信息,让IOC容器创建一个Bean,然后DI。Bean的创建、Bean之间的依赖统统地交给IOC来管,老子懒得管。但是在有些情况下配置也会很复杂,还是自己手写一个Bean最简单,那么怎么手写一个Bean呢?好了,这个时候只要implements FactoryBean就行了,例子如下。

    这里要注意一点:getBean()方法返回的是FactoryBean的getObject()方法,返回的是一个Object!!!!!!,不是FactoryBean!!!!!!!

    要获得FactoryBean得要用getBean(&name)方法;

    Car car = (Car) factory.getBean("car");
    FactoryBean fb = (FactoryBean) factory.getBean("&car");
    try {
    Car car2 = (Car)fb.getObject();
    car2.getCarInfos();
    } catch (Exception e) {
    e.printStackTrace();
    }
    package springtest.factorybean;
    
    import org.springframework.beans.factory.FactoryBean;
    
    public class CarFactoryBean implements FactoryBean<Car> {
        private String carInfo;
    
        @Override
        public Car getObject() throws Exception {
            Car car = new Car();
            String[] infos = carInfo.split(",");
            car.setBrand(infos[0]);
            car.setMaxSpeed(Integer.valueOf(infos[1]));
            car.setPrice(Double.parseDouble(infos[2]));
    
            return car;
        }
    
        @Override
        public Class<?> getObjectType() {
            return Car.class;
        }
    
        @Override
        public boolean isSingleton() {
            return false;
        }
    
        public String getCarInfo() {
            return this.carInfo;
        }
    
        public void setCarInfo(String carInfo) {
            this.carInfo = carInfo;
        }
    }

    <bean name = "car" class="springtest.factorybean.CarFactoryBean">
    <property name="carInfo" value="超级跑车,400,2000000" />
    </bean>

    public class FactoryBeanTest {
    public static void main(String[] args) {
    BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
    Car car = (Car) factory.getBean("car");
    car.getCarInfos();
    }
    }
  • 相关阅读:
    list转map,set,使用stream进行转化
    使用thymeleaf模板实现博客评论的异步刷新
    python 字典元组集合字符串
    python列表解析补充:
    python列表解析
    springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据
    配置github——每次提交后使contributions有记录(有小绿格子)
    github浏览器无法访问,并且idea无法push项目
    互联网协议入门
    http协议入门---转载
  • 原文地址:https://www.cnblogs.com/panning/p/9739894.html
Copyright © 2011-2022 走看看