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; } }
<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>
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); } }
<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>