Spring FactoryBean

spring編碼方式實例化beanjava

通常狀況下,Spring經過反射機制利用<bean>的class屬性指定的實現類實例化bean,也能夠經過java類或註解的方式實例化bean。spring

Spring還也提供了編碼方式實例化bean。Spring爲此提供了一個org.springframework.beans.factory.FactoryBean工廠類接口,能夠經過實現該接口來實例化bean。org.springframework.beans.factory.FactoryBean接口對於Spring框架來講佔有重要的地位,Spring自身就提供了70多個FactoryBean的實現類。框架

提示:在Spring中BeanFactory和FactoryBean是兩個不一樣的接口ide

Demothis

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
相關文章
相關標籤/搜索