public class BookFactory {
public Book buyBook(){
Book book = new Book();
book.setName("Think in Java");
return book;
}
}
配置文件编写:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
<!-- 配置对象 -->
<bean></bean>
<bean factory-bean="bookFactory" factory-method="buyBook"></bean>
</beans>
由于bookFactory的工厂方法不是静态的,因此需要先定义一个工厂类的bean,然后通过factory-bean属性来引用工厂bean实例。再通过属性factory-method来指定对应的工厂方法。
【静态工厂方法】
很多工厂类方法都是静态的,这意味着无需创建工厂类实例的情况下就可以调用工厂类方法。因此静态工程方法比非静态工厂方法的调用更加方便简洁。下面通过一个实例来演示静态工厂方法。
编写factory类:
package com.Kevin.factorybean;
/**
* 编写工厂类测试静态工厂方法注入
* @author Kevin
*
*/
public class CarFactory {
public static Car createCar(){
Car car = new Car();
car.setBrand("Lamborghini");
return car;
}
}
编写配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
<!-- 配置对象 -->
<bean factory-method="createCar"></bean>
</beans>
总结
Spring提供了三种可供选择的注入方式,但在实际应用中,我们究竟该选择哪种注入方式,并没有统一的标准,如下是一些可以参考的理由:
构造函数注入理由:
构造函数保证重要属性预先设置;
无需提供每个属性的setter方法,减少类的方法个数;
可以更好地封装类变量,避免外部错误调用。
属性注入理由:
属性过多时,构造函数变的臃肿;
构造函数注入灵活性不强,有时需要为属性注入null值;
多个构造函数时,配置上产生歧义,复杂度升高;
构造函数不利于类的继承和扩展;
构造函数注入会引起循环依赖的问题。
其实Spring为我们注入参数提供了这么多方法,那么这些方法必然有他们存在的道理,每个方法在某一问题上会有独特的优势,我们只需要按照我们具体的使用需求选择适合的方法来使用就好了,但一般不太推荐工厂方法注入。