zoukankan      html  css  js  c++  java
  • 静态工厂方法和实例工厂方法及普通的bean

    容纳你的bean
      bean工厂:最简单的容器,提供了基础的依赖注入支持。创建各种类型的Bean。
      应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务。
    bean工厂介绍
      工厂设计模式,创建分发各种bean。配置好它们之间的协作关系,参与bean的生命周期。
      BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
      bean工厂只把bean的定义信息加载进来,用到的时候才实例化。
      factory.getBean("mybean");就可得到一个bean

    静态工厂方法实例

    package com.test.srping.bean.factory;
    
    import java.util.HashMap;
    import java.util.Map;
    
    //静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例
    public class StaticCarFactory {
        private static Map<String,Car> cars = new HashMap<String,Car>();
        
        static{
            cars.put("baoma", new Car("BaoMa",3000000));
            cars.put("benci", new Car("BenCi",1000000));
        }
        
        public StaticCarFactory(){
            System.out.println("静态工厂方法构造函数被调用-StaticCarFactory");
        }
        //静态工厂方法,不需要创建staticCarFactory对象情况下,通过该方法就可以得到对应的实例
        public static Car getCar(String brand){
            return cars.get(brand);    
        }
    }

    实例工厂方法实例

    package com.test.srping.bean.factory;
    
    import java.util.HashMap;
    import java.util.Map;
    
    //实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 返回bean的实例 
    public class InstanceCarFactory {
        private Map<String,Car> cars = null;  
        
        public InstanceCarFactory(){  
            cars = new HashMap<String,Car>();  
            cars.put("audi", new Car("Audi",300000));  
            cars.put("ford", new Car("Ford",400000));  
            System.out.println("实例工厂方法构造函数被调用-InstanceCarFactory");
        }  
          
        public Car getCar(String brand){  
            return cars.get(brand);  
        }  
    }
    package com.test.srping.bean.factory;
    
    public class Car {
        private String brand;  
        private double price;  
      
        public String getBrand() {  
            return brand;  
        }  
      
        public void setBrand(String brand) {  
            this.brand = brand;  
        }  
      
        public double getPrice() {  
            return price;  
        }  
      
        public void setPrice(double price) {  
            this.price = price;  
        }
    
        @Override
        public String toString() {
            return "Car [brand=" + brand + ", price=" + price + "]";
        }
    
        public Car(String brand, double price) {
            super();
            this.brand = brand;
            this.price = price;
        }  
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        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,注意不是配置静态工厂方法实例,而是bean实例,
            且注意对应类是包含静态工厂方法的类
            class属性:指向静态工厂方法的全类名
            factory-method:指向静态工厂方法中的名字
            constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数
            -->
        <bean id="car1"
           class="com.test.srping.bean.factory.StaticCarFactory"
           factory-method="getCar">
           <constructor-arg value="baoma"></constructor-arg>
        </bean>
        
        <!-- 1.配置工厂的实例 -->
        <bean id="carFactory" 
              class="com.test.srping.bean.factory.InstanceCarFactory"></bean>
        <!-- 
            2.通过实例工厂来配置bean   
                class属性:指向实例工厂方法的全类名
                factory-method:指向实例工厂方法的名字
                constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
        --> 
         <bean id="car2" factory-bean="carFactory"
              factory-method="getCar">
              <constructor-arg value="ford"></constructor-arg>
         </bean>  
        
    </beans>
    package com.test.srping.bean.factory;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    
    /*
     * 1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)
    调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,
    而不关心创建对象的细节。
    要声明通过静态方法创建bean:
       1.需要在bean的class属性里指定拥有该方法的类,
       2.同时在factory-method属性里指定工厂方法的名称,
       3.最后,使用<constrctor-arg>元素为该方法传递方法参数。
     */
    //spring通过工厂方法配置Bean
    public class Mainfactory {
        public static void main(String[] args) {   
            ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");  
              
            //静态工厂方法测试:  
            Car car1 = (Car) ctx.getBean("car1");  
            System.out.println(car1);  
              
            //实例工厂方法测试:  
            Car car2 = (Car) ctx.getBean("car2");  
            System.out.println(car2);  
        }  
    }

    运行结果

    实例工厂方法构造函数被调用-InstanceCarFactory
    Car [brand=BaoMa, price=3000000.0]
    Car [brand=Ford, price=400000.0]

    实例工厂方法在加载过程中对象被创建,静态工厂方法没有被创建直接被调用

    --------------------------------------------------------------------------------------------

    通过实现FactoryBean接口来配置bean

    package com.test.spring.bean.factorybean;
    
    import org.springframework.beans.factory.FactoryBean;
    
    
    //自定义的Factory需要实现FactoryBean接口
    public class CarFactoryBean implements FactoryBean<Car>{
        private String brand;  
        
        public void setBrand(String brand) {  
            this.brand = brand;  
        }  
        //返回bean的对象
        public Car getObject() throws Exception {
            return new Car(brand,500000);
        }
        //返回的bean的类型
        public Class<?> getObjectType() {
            return Car.class;  
        }
        //是否是单例的
        public boolean isSingleton() {
            return true;  
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        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">    
    <!--     
                 通过FactoryBean来配置Bean的实例
        class:指向FactoryBean的全类名
        property:配置FactoryBean的属性 
        
        注意:实际返回的实例是FactoryBean的getObject()方法返回的实例
    -->
        <bean id="car1"
            class="com.test.spring.bean.factorybean.CarFactoryBean">
            <property name="brand" value="BMW"></property>
        </bean>
    </beans>
    package com.test.spring.bean.factorybean;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * 2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)
    实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
      1.先声明实例工厂类的bean
    声明通过实例工厂方法创建的bean:
      2.在bean的factory-bean属性里指定拥有该该工厂方法的bean
      3.在factory-method属性里指定该工厂方法的名称。
      4.使用constructor-arg元素为工厂方法传递方法参数。
     *
     */
    //通过FactoryBean来配置Bean
    public class MainFactoryBean {
        public static void main(String[] args) {  
            ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml");  
              
            Car car = (Car) ctx.getBean("car1");  
            System.out.println(car);            
        }  
    }
  • 相关阅读:
    终止线程的三种方法
    spring bean scope 的几种类型
    耦合(软件工程)
    标签防止重复提交
    Struts2中的ognl标签
    struts2
    SQL PRIMARY KEY 约束:使用方法及撤销办法解析
    SQL UNIQUE 约束:使用方法及撤销办法剖析
    SQL NOT NULL 约束:语法及案例剖析
    SQL 约束(Constraints):语法及实例剖析
  • 原文地址:https://www.cnblogs.com/mutong1228/p/9022138.html
Copyright © 2011-2022 走看看