zoukankan      html  css  js  c++  java
  • [原创]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>
  • 相关阅读:
    写excel文件-xlsxwriter包的使用
    python代码规范
    mac系统的插件
    bash字符串处理
    ssh到ubuntu没颜色
    linux mysql 端口号修改
    Centos7 编译安装 PHP7.1,以及msgpack扩展
    Xmanager4注册码
    Python 的 pyinotify 模块 监控文件夹和文件的变动
    Python的50个模块,满足你各种需要
  • 原文地址:https://www.cnblogs.com/jasonHome/p/5967892.html
Copyright © 2011-2022 走看看