2 实现单例的bean 以上的情况,都可以通过工厂方法factory-method来创建bean。 这样再加载bean.xml时,不会直接实例化bean,而是当调用factory-method所指的方法时,才开始真正的实例化。 通过spring的factory-method来创建单例的bean 首先通过静态内部类创建一个单例对象 package com.spring.test.factorymethod; public spring-beans-3.0.xsd"> <bean id="theStage" class="com.spring.test.factorymethod.Stage" factory-method
是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单地调用静态方法,而不同关心创建对象的细节 要声明通过静态方法创建Bean,需要在Bean的class属性里指定拥有该工厂的方法的类,同时在factory-method -- factory-method:指向静态工厂方法的名字 --> <! :如果工厂方法需要传入参数,则使用constructor-arg来配置参数 --> <bean id="car" class="com.sangyu.test04.StaticCarFactory" factory-method carFactory" class="com.sangyu.test04.InstanceCarFactory"></bean> <bean id="car" factory-bean="carFactory" factory-method
com.flydean.services.PetStoreService"> <constructor-arg ref="accountDao"/> </bean> 静态工厂方法 静态工厂方法通过class属性指定包含静态工厂方法的类,使用名为factory-method method --> <bean id="clientService" class="com.flydean.services.ClientService" factory-method 这样在factory-bean定义工厂bean实例,在factory-method中定义需要创建bean的方法: <! com.flydean.services.DefaultServiceLocator"> </bean> <bean id="serviceA" factory-bean="serviceLocator" factory-method createServiceAInstance"/> <bean id="serviceB" factory-bean="serviceLocator" factory-method
com.flydean.services.PetStoreService"> <constructor-arg ref="accountDao"/> </bean> 静态工厂方法 静态工厂方法通过class属性指定包含静态工厂方法的类,使用名为factory-method method --> <bean id="clientService" class="com.flydean.services.ClientService" factory-method 这样在factory-bean定义工厂bean实例,在factory-method中定义需要创建bean的方法: <! com.flydean.services.DefaultServiceLocator"> </bean> <bean id="serviceA" factory-bean="serviceLocator" factory-method createServiceAInstance"/> <bean id="serviceB" factory-bean="serviceLocator" factory-method
></constructor-arg>标签的name属性和value属性指定了:构造方法赋值 2、调用静态工厂方法创建Bean对象 静态工厂方法创建bean对象的核心是: class + factory-method -- 调用静态工厂方法创建bean对象 --> <bean id="user" class="com.beans.factory.UserFactory" factory-method="createPerson constructor-arg> </bean> 使用静态工厂方法创建Bean实例需要为<bean />元素指定出id外如下属性: class:指定静态工厂的实现类( 即包名.类名 )【相当于指定工厂的地址】 factory-method -- 再引用工厂Bean来配置 其他Bean --> <bean id="user" factory-bean="userFactory" factory-method="createPerson value="Leorizon"></constructor-arg> </bean> 调用实例化工厂需要为<bean />指以下两个属性 factory-bean :该属性指定工厂Bean的id factory-method
-- 通过静态工厂方法创建对象 id : 自定义的名称 class: 类的全路径 factory-method : 静态工厂方法 --> <bean id="calendar" class="java.util.Calendar" factory-method="getInstance"></bean> 测试 @Test public public Phone getPhone() { return new Phone("小米6"); } } spring配置文件 factory-bean : 是工厂类的id factory-method -- 配置Phone类的对象 factory-bean : 是工厂类的id factory-method : 工厂类获取Phone对象的非静态的方法 --> <bean id="phone" class="cn.tedu.spring.beans.Phone" factory-bean="phoneFactory" factory-method="getPhone
=”getRuntimeService” /> <bean id=”formService” factory-bean=”processEngineFactory” factory-method =”getFormService” /> <bean id=”identityService” factory-bean=”processEngineFactory” factory-method =”getIdentityService” /> <bean id=”taskService” factory-bean=”processEngineFactory” factory-method =”getTaskService” /> <bean id=”historyService” factory-bean=”processEngineFactory” factory-method =”getHistoryService” /> <bean id=”managementService” factory-bean=”processEngineFactory” factory-method
语法 <bean id="bean名称" name="" class="静态工厂完整类名" factory-method="静态工厂的方法"> <constructor-arg index="0 <constructor-arg index="n" value="bean的值" ref="引用的bean名称" /> </bean> class:指定静态工厂完整的类名 factory-method "createBeanByStaticFactoryMethod1" class="com.javacode2018.lesson001.demo3.UserStaticFactory" factory-method "createBeanByStaticFactoryMethod2" class="com.javacode2018.lesson001.demo3.UserStaticFactory" factory-method 语法 <bean id="bean名称" factory-bean="需要调用的实例对象bean名称" factory-method="bean对象中的方法"> <constructor-arg
,Bean 会优先实现类,如果按照类型装配时,如果存在一个接口对应多个实现类,多个实现类中被 Primary 为 true 的类会优先当做接口的实现类进行装配还可以通过 Factory-bean 和 Factory-method class StudentFactory { public static Student getStudent() { return new Student(); }}使用静态工厂创建实例(factory-method ):图片<bean id="student" class="top.it6666.factory.StudentFactory" factory-method="getStudent" ="top.it6666.factory.StudentFactory"/><bean id="studentThree" factory-bean="studentFactory" factory-method
id="user" class="cn.dmsd.ioc.User"/> 2.使用静态工厂创建 <bean id="bean1" class="cn.dmsd.bean.Bean1Factory" factory-method id="bean2Factory" class="cn.dmsd.bean.Bean2Factory"/> <bean id="bean2" factory-bean="bean2Factory" factory-method
对象(现有)工厂方法 所以ioc中在aplicationContext.xml中也对应了三种创建对象的途径 <bean id="" class="">① <bean id="" class="" factory-method ="">② <bean id="" factory-bean="" factory-method="">③ id可以自定义 Class需要自己在工程中创建 接下来写一个简单的demo ① applicationContext.xml www.springframework.org/schema/util/spring-util-2.0.xsd"> <bean id="service" class="dynamicFactory.ServiceFactory" factory-method --普通工厂bean,factory-bean填的是上面的serviceFactory--> <bean id="service" factory-bean="serviceFactory" factory-method
.*.DaoFactory" factory-method="(这里面写的就是你需要声名的bean 即静态方法getDao)" /> 注意:使用静态工厂所创建的bean只有factory-method这个中的 <bean id="Dao" factory-method="依旧写的是方法getDao" factory-bean="指定工厂的bean" 这个写法太麻烦了,还需要创建一个单独的BeanDaoFactory
return okHttpClient; } } 然后在 Spring 配置文件中进行注入: <bean class="org.javaboy.bean.OkHttpStaticFactory" factory-method ="getOkHttpClient" id="httpClient"/> 静态工厂的特点是静态方法可以直接调用,并不必要获取到工厂类的实例,所以上面配置的时候只需要指定 factory-method org.javaboy.bean.OkHttpInstanceFactory" id="httpInstanceFactory"/> <bean factory-bean="httpInstanceFactory" factory-method 特别是前两种,其实我们用的比较少,前两种有一个缺陷,就是我们配置的的 factory-method 都是通过反射来调用的,通过反射调用的话,多多少少性能受点影响。 这种 factory-method 在 Spring 中处理的源码执行时序图如下: 所以最终反射是在 SimpleInstantiationStrategy#instantiate 方法中执行的,就是大家非常熟悉的反射代码了
password); } } 但是配置文件不一样: <bean id="userDao4MySql" class="com.danny.spring.dao.UserDaoFactory" factory-method ="getUserDao4MySqlImpl"/> <bean id="userDao4Oracle" class="com.danny.spring.dao.UserDaoFactory" factory-method userDao,ref是userDao4MySql或userDao4Oracle,userDao4MySql和userDao4Oracle,他们的的class不再指向自己,而是指向生产他们的静态工厂,factory-method
| ref=""></property></bean> 实例化方式: 默认构造 静态工厂:<bean id="" class="工厂类全限定类名" factory-method 实例工厂:<bean id="工厂的id" class="工厂类"></bean> <bean id="" factory-bean="工厂的id" factory-method
<bean id="connFactory" class="com.xxx.FactoryBean" /> <bean id="conn" factory-bean="connFactory" factory-method ="getConnection" /> 复制代码 通过factory-bean去指定刚才的这个类,通过factory-method去指定获取对象的方法,这样我们就可以通过conn来获取这个对象了。 也就是这里的factory-method就相当于之前的getObject()方法。我们通过spring工厂获取conn就能得到Connection对象了。这就是所谓的实例工厂。 DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","123456"); return conn; } } 复制代码 静态工厂直接指定factory-method <bean id="conn" class="com.xxx.StaticFactoryBean" factory-method="getConnection" /> 复制代码 五.
-- id:bean对象的id,factory-bean:工厂对象的id,factory-method:工厂方法 --> <bean id="studentDao" factory-bean="studentDaoFactory " factory-method="getStudentDao"></bean>测试方法: @Test public void t2(){ // 创建spring容器 -- id:bean的id class:工厂全类名 factory-method:工厂静态方法 --> <bean id="studentDao" class="com.example.dao.StudentDaoFactory2 " factory-method="getStudentDao2"/>添加描述 都是可以成功运行的。
return new UserDaoImpl(); } } <bean id="userDao" class="com.zjq.factory.StaticFactoryBean" factory-method factoryBean" class="com.zjq.factory.DynamicFactoryBean"/> <bean id="userDao" factory-bean="factoryBean" factory-method
BeanDefinitionRegistryPostProcessor 对 Bean 的定义、还有 FactoryBean 面试官:好,那今天再和你聊聊,alias、autowire、depends-on、factory-method 1.3 factory-method 测试类 public class StaticFactoryBean { static public UserDao getUserDaoByStatic (); } } xml配置 <bean id="staticFactory-method" class="org.itstack.interview.StaticFactoryBean" factory-method org.itstack.interview.StaticFactoryBean"/> <bean id="staticFactory-bean" factory-bean="staticFactory" factory-method 需要配合使用,factory-method="getUserDao" 调用的是对应的费静态方法返回实例化结果。
以上两种简单工厂在Spring中都有其配置方式,静态工厂xml配置如下: <bean id=“apple" class="...FruitFactory" factory-method="get"> < 配置如下: <bean id=“fruitFactory" class="...FruitFactory”/> <bean id=“apple”factory-bean="...fruitFactory" factory-method 不需要factory-method,factory-bean这类标签。