zoukankan      html  css  js  c++  java
  • Spring FactoryBean

    spring编码方式实例化bean

    一般情况下,Spring通过反射机制利用<bean>的class属性指定的实现类实例化bean,也可以通过java类或注解的方式实例化bean。

    Spring还也提供了编码方式实例化bean。Spring为此提供了一个org.springframework.beans.factory.FactoryBean工厂类接口,可以通过实现该接口来实例化bean。org.springframework.beans.factory.FactoryBean接口对于Spring框架来说占有重要的地位,Spring自身就提供了70多个FactoryBean的实现类。

    提示:在Spring中BeanFactory和FactoryBean是两个不同的接口

    Demo

    import org.springframework.beans.factory.FactoryBean;
    
    public class CarFactoryBean implements FactoryBean<Car> {
        private String carInfo;
    
        public String getCarInfo() {
            return carInfo;
        }
    
        public void setCarInfo(String carInfo) {
            this.carInfo = carInfo;
        }
    
        /**
         * 将来调用getBean()方法返回的不是FactoryBean本身,而是getObject返回的Car
         * 也就是说下面这个getObjext方法会被getBean方法代理
         */
        public Car getObject() {
            Car car = new Car();
            String[] infos = carInfo.split(",");
            car.setBrand(infos[0]);
            car.setMaxSpeed(Integer.parseInt(infos[1]));
            car.setPrice(Double.parseDouble(infos[2]));
            return car;
        }
    
        @Override
        public Class<?> getObjectType() {
            return Car.class;
        }
    
        @Override
        public boolean isSingleton() {
            return false;
        }
    }
    
    class Car {
        private String brand;
        private int maxSpeed;
        private double price;
    
        public String getBrand() {
            return brand;
        }
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        public int getMaxSpeed() {
            return maxSpeed;
        }
    
        public void setMaxSpeed(int maxSpeed) {
            this.maxSpeed = maxSpeed;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    }
    View Code
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:p="http://www.springframework.org/schema/p"
           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">
    
        <bean id="car" class="CarFactoryBean" p:carInfo="吉利博越,200,10000.50"/>
    
    </beans>
    View Code
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Driver {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("my.xml");
    
            /**
             *  当调用getBean("car")时,Spring通过反射机制发现CarFactoryBean实现了FactoryBean的接口,
             *  Spring容器就调用CarFactoryBean的getObject返回Car对象
             */
            Car car = context.getBean("car", Car.class);
            System.out.println(car.getBrand());
            /**
             * 如果希望获得CarFactoryBean的实例,需要在加前缀 &
             */
            CarFactoryBean carFactoryBean = context.getBean("&car", CarFactoryBean.class);
            System.out.println(carFactoryBean);
        }
    }
    View Code
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.16.RELEASE</version>
          </dependency>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.16.RELEASE</version>
          </dependency>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.16.RELEASE</version>
          </dependency>
    View Code
  • 相关阅读:
    No module named 'pydispatch'
    python 安装 vrml
    python3.7 安装pyopengl,环境搭建
    机智人 激光雷达 配置
    ubuntu server 16.04(amd 64) 配置网桥,多网卡使用激活
    ubuntu server 多网卡
    ubuntu16.04中开启和关闭防火墙
    c++ 判断给定区间是否是一个heap. O(N) (is_heap)
    c++ 判断容器A是否是容器B的子集,如果是,返回true(includes)
    c++ 容器元素填充指定数量的元素(generate_n)
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/10271955.html
Copyright © 2011-2022 走看看