bean的创建默认就是框架利用反射new出来的bean实例


工厂模式

工厂帮我们创建对象,有一个专门帮我们创建对象的类,这个类就是工厂

  • 静态工厂:工厂本身不用创建对象
    • 通过静态方法调用,对象 = 工厂类.工厂方法名();     Person person = PersonFactory.getPerson(String username);
  • 实例工厂:工厂本身需要创建对象
    • 工厂类 工厂对象 = new 工厂类()
    • 工厂对象.getPerson(String username);


静态工厂

package cn.javaex.factory;

import cn.javaex.bean.Person;

/**
* 静态工厂
*
* @author 陈霓清
*/
public class PersonStaticFactory {

/**
* PersonStaticFactory.getPerson();
*/
public static Person getPerson(String username) {
System.out.println("静态工厂......正在执行");

Person person = new Person();
person.setUsername(username);
person.setAge(20);

return person;
}
}


配置写法

<!-- 静态工厂(不需要创建工厂本身)
class:指定静态工厂全类名
factory-method="getPerson":指定哪个方法是工厂方法
-->
<bean id="person01" class="cn.javaex.factory.PersonStaticFactory" factory-method="getPerson">
<!-- 可以为方法指定参数 -->
<constructor-arg value="刘备"></constructor-arg>
</bean>



实例工厂

package cn.javaex.factory;

import cn.javaex.bean.Person;

/**
* 实例工厂
*
* @author 陈霓清
*/
public class PersonInstanceFactory {

/**
* new PersonInstanceFactory().getPerson();
* @param username
* @return
*/
public Person getPerson(String username) {
System.out.println("实例工厂......正在执行");

Person person = new Person();
person.setUsername(username);
person.setAge(20);

return person;
}
}


配置写法

<!-- 实例工厂
class:指定实例工厂全类名
-->
<bean id="personFactory" class="cn.javaex.factory.PersonInstanceFactory"></bean>

<!--
factory-bean:指定当前对象创建使用哪个工厂
factory-method="getPerson":指定哪个方法是工厂方法
-->

<bean id="person02" class="cn.javaex.bean.Person"
factory-bean="personFactory"
factory-method="getPerson">
<constructor-arg value="关羽"></constructor-arg>
</bean>



FactoryBean

package cn.javaex.factory;

import org.springframework.beans.factory.FactoryBean;

import cn.javaex.bean.Person;

/**
* FactoryBean:是spring规定的一个接口,只要是这个接口的实现类,spring都认为是一个工厂
*
* @author 陈霓清
*/
public class MyFactoryBean implements FactoryBean<Person> {

/**
* 工厂方法,返回创建的对象
*/
@Override
public Person getObject() throws Exception {
Person person = new Person();
person.setUsername("张飞");
person.setAge(30);

return person;
}

/**
* 返回创建的对象的类型
* spring会自动调用这个方法来确认创建的对象是什么类型
*/
@Override
public Class<?> getObjectType() {
return Person.class;
}

/**
* 是否单例
*/
@Override
public boolean isSingleton() {
return false;
}

}


配置

<!-- FactoryBean:是spring规定的一个接口,只要是这个接口的实现类,spring都认为是一个工厂
ioc容器启动的时候不会创建实例,获取的时候才创建对象
-->
<bean id="myFactoryBean" class="cn.javaex.factory.MyFactoryBean"></bean>



测试

/**
* 测试工厂方法
*/
@Test
public void test03() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("application3.xml");

// 静态工厂
Person bean1 = (Person) ioc.getBean("person01");
System.out.println(bean1);

// 实例工厂
Person bean2 = (Person) ioc.getBean("person02");
System.out.println(bean2);

// FactoryBean
Person bean3 = (Person) ioc.getBean("myFactoryBean");
System.out.println(bean3);
}


输出结果

静态工厂......正在执行
实例工厂......正在执行
Person [username=刘备, age=20, sex=null, email=null, car=null, bookList=null, map=null, properties=null]
Person [username=关羽, age=20, sex=null, email=null, car=null, bookList=null, map=null, properties=null]
Person [username=张飞, age=30, sex=null, email=null, car=null, bookList=null, map=null, properties=null]



回到顶部