[原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
全类名方式最简单,最普遍
1.通过调用静态工厂方法创建 Bean
1)调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节.
2)要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数.
StaticCarFactory
1 package com.jason.spring.beans.factory;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6
7 /**
8 *
9 * @ClassName:StaticCarFactory
10 * @Description:
11 * 静态工程方法:直接调用一个类的静态方法就可以放回bean 的实例
12 *
13 */
14 public class StaticCarFactory {
15
16 private static Map<String, Car> cars = new HashMap<String, Car>();
17
18 static{
19 cars.put("audi", new Car("audi", 300000));
20 cars.put("ford", new Car("ford", 400000));
21
22 }
23
24 //静态工场方法
25 public static Car getCar(String name){
26 return cars.get(name);
27 }
28
29 }
Car
1 package com.jason.spring.beans.factory;
2
3 public class Car {
4 private String brand;
5 private double price;
6
7 public String getBrand() {
8 return brand;
9 }
10
11 public void setBrand(String brand) {
12 this.brand = brand;
13 }
14
15 public double getPrice() {
16 return price;
17 }
18
19 public void setPrice(double price) {
20 this.price = price;
21 }
22
23 @Override
24 public String toString() {
25 return "Car [brand=" + brand + ", price=" + price + "]";
26 }
27
28 public Car(String brand, double price) {
29 super();
30 this.brand = brand;
31 this.price = price;
32 }
33
34 }
beans-factory.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6 <!-- 通过静态方法来配置bean ,不是配置静态工程方法实例,而是配置bean 实例 -->
7 <!--
8 class 属性:指向静态方法的全类名
9 factory-method:指向静态工厂方法的名字
10 constructor-arg:如果工场方法需要传入参数,则使用constructor-arg 指定参数
11 -->
12 <bean id="car1" class="com.jason.spring.beans.factory.StaticCarFactory" factory-method="getCar">
13 <constructor-arg value="audi"></constructor-arg>
14 </bean>
15
16 </beans>
2.实例工场方法
InstanceCarFactory
1 package com.jason.spring.beans.factory; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 /** 7 * 8 * @ClassName:InstanceCarFactory 9 * @Description: 10 * 11 * 实例工工厂方法:实例工厂的方法,即需要创建工场本身,再调用工场的方法返回bean的实例 12 */ 13 14 public class InstanceCarFactory { 15 16 private Map<String, Car> cars = null; 17 18 public InstanceCarFactory(){ 19 cars = new HashMap<String, Car>(); 20 cars.put("audi", new Car("audi", 300000)); 21 cars.put("ford", new Car("ford", 500000)); 22 23 } 24 25 public Car getCar(String brand){ 26 return cars.get(brand); 27 } 28 29 }
bean-factory.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6 <!-- 配置工厂的实例 -->
7 <bean id="instanceCarFactory" class="com.jason.spring.beans.factory.InstanceCarFactory" ></bean>
8
9 <!-- 通过实例工厂方法来配置bean -->
10 <!--
11 factory-bean 属性:指向实例工厂的方法的bean
12 factory-method:指向实例工厂方法的名字
13 constructor-arg:如果工场方法需要传入参数,则使用constructor-arg 指定参数
14 -->
15 <bean id="car2" factory-bean="instanceCarFactory" factory-method="getCar">
16 <constructor-arg value="ford"></constructor-arg>
17 </bean>
18
19 </beans>
3.FactoryBean
1)实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean
2)Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean.
3)工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象
CarFactoryBean
1 package com.jason.spring.beans.factory;
2
3 import org.springframework.beans.factory.FactoryBean;
4
5 public class CarFactoryBean implements FactoryBean<Car>{
6
7 //自定义的FactoryBean 需要实现 FactoryBean 接口
8
9 private String brand;
10
11 public void setBrand(String brand) {
12 this.brand = brand;
13 }
14
15 //返回bean 对 象
16 @Override
17 public Car getObject() throws Exception {
18 return new Car(brand, 50);
19 }
20
21 @Override
22 public Class<?> getObjectType() {
23
24 return Car.class;
25 }
26
27 @Override
28 public boolean isSingleton() {
29
30 return true;
31 }
32
33 }
1 <!-- 通过FactoryBean 类配置bean的实例
2 class: 指向FatoryBean 的全类名
3 property:配置FactoryBean 的属性
4
5 但实际返回的是:FatoryBean 的getObject() 方法返回的实例
6 -->
7
8 <bean id="car3" class="com.jason.spring.beans.factory.CarFactoryBean">
9 <property name="brand" value="audi"></property>
10 </bean>