美文网首页Java
Java Spring-通过工厂方法配置Bean

Java Spring-通过工厂方法配置Bean

作者: 一亩三分甜 | 来源:发表于2020-01-15 10:13 被阅读0次

    阻碍我们飞翔的力量,是来自我们内心的恐惧。

    通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例

    <!-- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例 -->
        <!--
           class属性:指向静态工厂方法的全类名
           factory-method:指向静态工厂方法的名字
           constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
        -->
    <bean id="car1"
          class="com.cloud.spring.beans.factory.StaticCarFactory"
          factory-method="getCar">
        <constructor-arg value="audi"></constructor-arg>
        </bean>
    </beans>
    
    public class Main {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("beans-factory.xml");
            Car car1 = (Car) context.getBean("car1");
            System.out.println(car1);
        }
    }
    //输出
    Car{brand='audi', price=300000.0}
    

    通过调用实例工厂方法创建Bean:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。

    要声明通过实例工厂方法创建的Bean

    在bean的factory-bean属性里指定拥有该工厂方法的Bean

    在factory-method属性里指定该工厂方法的名称

    使用constructor-arg元素为工厂方法传递方法参数

        <!-- 配置工厂的实例 -->
        <bean id="carFactory" class="com.cloud.spring.beans.factory.InstanceCarFactory"></bean>
        <!-- 通过实例工厂方法来配置bean -->
        <!--
          class属性:指向静态工厂方法的bean
          factory-method:指向静态工厂方法的名字
          constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
        -->
        <bean id="car2" factory-bean="carFactory" factory-method="getCar">
            <constructor-arg value="ford"></constructor-arg>
        </bean>
                Car car2 = (Car) context.getBean("car2");
            System.out.println(car2);
    //输出
    Car{brand='ford', price=400000.0}
    

    通过FactoryBean来配置Bean

    //自定义的FactoryBean 需要实现FactoryBean接口
    public class CarFactoryBean implements FactoryBean<Car> {
    
        private String brand;
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        //返回bean的对象
        @Override
        public Car getObject() throws Exception {
            return new Car(brand,500000);
        }
    
        //返回bean的类
        @Override
        public Class<?> getObjectType() {
            return Car.class;
        }
    
        //是否是单例
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    
        <!--
        通过 FactoryBean 来配置Bean 的实例
        class:指向FactoryBean的全类名
        property:配置FactoryBean的属性
        但实际返回的却是FactoryBean的getObject()方法返回的实例
        -->
        <bean id="car" class="com.cloud.spring.beans.factorybean.CarFactoryBean">
            <property name="brand" value="BMW"></property>
        </bean>
        
        public class Main {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("beans-beanfactory.xml");
            Car car = (Car) context.getBean("car");
            System.out.println(car);
        }
    }
    //输出
    Car{brand='BMW', price=500000.0}
    

    相关文章

      网友评论

        本文标题:Java Spring-通过工厂方法配置Bean

        本文链接:https://www.haomeiwen.com/subject/yrttzctx.html