zoukankan      html  css  js  c++  java
  • Spring配置bean的方法(工厂方法和Factorybean)

    通过工厂方法配置bean

      

      通过调用静态工厂方法创建bean
        通过静态工厂方法创建bean是将对象创建的过程封装到静态方法中。当客户端需要对象时,只需要简单地调用静态方法,而不关心创建对象的细节。
        要声明通过静态方法创建的bean,需要在bean的class属性里指定拥有该工厂的方法的类,通知在factory-method属性里指定工厂方法的名称,

        最后,使用<constructor-arg>元素为该方法传递方法参数
      通过调用实例工厂方法创建bean
        实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需关心对象的创建细节。
        要声明通过实例工厂方法创建的bean:
          -在bean的factory-bean属性里指定拥有该工厂方法的bean
          -在factory-method属性里指定该工厂方法的名称
          -使用constructor-arg元素为工厂方法传递方法参数

    静态工厂类:

     

     1 package com.yl.factory;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 
     6 /**
     7  * 静态工厂方法:直接调用某一个类的静态方法就可与返回bean的实例
     8  * @author yul
     9  *
    10  */
    11 public class StaticCarFactory {
    12     
    13     private static Map<String, Car> cars = new HashMap<String, Car>();
    14     
    15     static {
    16         cars.put("audi", new Car("audi", 300000));
    17         cars.put("ford", new Car("ford", 300000));
    18     }
    19     /**
    20      * 静态工厂方法
    21      * @param name
    22      * @return
    23      */
    24     public static Car getCar(String name) {
    25         
    26         return cars.get(name);
    27     }
    28 }

    实例工厂类:

     1 package com.yl.factory;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 /***
     6  * 实例工厂方法:实例工厂的方法,即现需要创建工厂本身,在调用工厂的实例方法来返回bean的实例
     7  * @author yul
     8  *
     9  */
    10 public class InstanceCarFactory {
    11     
    12     private Map<String, Car> cars = new HashMap<String, Car>();
    13     
    14     public InstanceCarFactory() {
    15         cars = new HashMap<String, Car>();
    16         cars.put("audi", new Car("audi", 300000));
    17         cars.put("ford", new Car("ford", 400000));
    18     }
    19     
    20     public Car getCar(String brand) {
    21         return cars.get(brand);
    22     }
    23 }

    工厂方法的配置文件:

     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" 
    13         class="com.yl.factory.StaticCarFactory"
    14         factory-method="getCar">
    15         <constructor-arg value="audi"></constructor-arg>
    16     </bean>
    17     
    18     <!-- 配置工厂的实例 -->
    19     <bean id="carFactory" class="com.yl.factory.InstanceCarFactory"></bean>
    20     
    21     <!-- 
    22         factory-bean:指向实例工厂方法的bean
    23         factory-method:指向实例工厂方法的名字
    24         constructor-arg:如果实例工厂方法需要传入参数,则使用constructor-arg来配置参数
    25      -->
    26     <!-- 通过实例工厂方法来配置bean -->
    27     <bean id="car2" factory-bean="carFactory" factory-method="getCar">
    28         <constructor-arg value="ford"></constructor-arg>
    29     </bean>
    30 </beans>

    通过Factorybean配置bean

     继承Factorybean的实现类:

     1 package com.yl.factorybean;
     2 
     3 import org.springframework.beans.factory.FactoryBean;
     4 //自定义的Factorybean需要实现FactoryBean接口
     5 public class CarFactoryBean implements FactoryBean<Car> {
     6     
     7     private String brand;
     8     
     9     public void setBrand(String brand) {
    10         this.brand = brand;
    11     }
    12     
    13     /**
    14      * 返回bean的对象
    15      */
    16     @Override
    17     public Car getObject() throws Exception {
    18         // TODO Auto-generated method stub
    19         return new Car("BMW", 600000);
    20     }
    21     /**
    22      * 返回bean的类型
    23      */
    24     @Override
    25     public Class<?> getObjectType() {
    26         // TODO Auto-generated method stub
    27         return Car.class;
    28     }
    29     
    30     @Override
    31     public boolean isSingleton() {
    32         // TODO Auto-generated method stub
    33         return true;
    34     }
    35     
    36 }

    配置文件:

     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         通过Factorybean来配置bean的实例
     7         class:指向Factorybean的全类名
     8         property:配置Factorybean的属性
     9         
    10         但实际返回的实例却是Factorybean的getObject()方法返回的实例
    11      -->
    12     <bean id="car" class="com.yl.factorybean.CarFactoryBean">
    13         <property name="brand" value="BMW"></property>
    14     </bean>
    15 </beans>
  • 相关阅读:
    界面控件DevExpress WPF入门 表达式编辑器功能
    Telerik UI for WPF全新版本——拥有Office2019高对比度主题
    DevExpress报表控件v21.2 全新的Visual Studio报表设计器
    报告生成器FastReport .NET入门指南 在Linux中启动应用程序
    文档控件DevExpress Office File API v21.2 自定义字体加载引擎
    UI组件库Kendo UI for Angular入门 如何开始使用图表功能
    WPF界面工具Telerik UI for WPF入门级教程 设置一个主题(二)
    DevExtreme初级入门教程(React篇) TypeScript支持
    报表开发利器FastReport .NET v2022.1 添加关键对象和属性
    python项目打包(一) setup.py、Python源代码项目结构
  • 原文地址:https://www.cnblogs.com/dreamfree/p/4088431.html
Copyright © 2011-2022 走看看