以前是通过框架底层工厂创建对象的,自己也可以创建工厂来创建bean对象
1、静态工厂
//定义静态工厂
public class MyStaticFactory {
private static Map<Integer,Book> map ;
static {
map = new HashMap<Integer,Book>();
map.put(100, new Book(100,"Title000","Author00",100.0));
map.put(101, new Book(101,"Title001","Author01",200.0));
map.put(102, new Book(102,"Title002","Author02",300.0));
}
public static Book getBookFromStaticFactory(Integer key){
return map.get(key);
}
}
<!-- 配置通过静态工厂方法创建的bean -->
<bean id="getBookFromStaticFactory" class="com.atguigu.spring.ioc.factory.MyStaticFactory" factory-method="getBookFromStaticFactory">
<constructor-arg value="101"/>
</bean>
//获取通过静态工厂方法创建的bean
Book book = (Book)ioc.getBean("getBookFromStaticFactory");
System.out.println(book);
2、实例工厂(动态工厂)
//定义实例工厂
public class MyInstanceFactory {
private Map<Integer,Book> map ;
//动态代码块:在每一次调用构造方法前都需要执行一次。
{
map = new HashMap<Integer,Book>();
map.put(100, new Book(100,"Title000","Author00",100.0));
map.put(101, new Book(101,"Title001","Author01",200.0));
map.put(102, new Book(102,"Title002","Author02",300.0));
}
public Book getBookFromInstanceFactory(Integer key){
return map.get(key);
}
}
<!-- 配置通过实例工厂方法创建的bean -->
<bean id="myInstanceFactory" class="com.atguigu.spring.ioc.factory.MyInstanceFactory"></bean>
<bean id="getBookFromInstanceFactory" factory-bean="myInstanceFactory" factory-method="getBookFromInstanceFactory">
<constructor-arg value="102"></constructor-arg>
</bean>
//获取通过实例工厂方法创建的bean
Book book2 = (Book)ioc.getBean("getBookFromInstanceFactory");
System.out.println(book2)
3、factoryBean★(事物的配置就是通过此方法实现的)
//Bean的工厂,用于对Bean对象的创建 必须实现FactoryBean接口,传入泛型
public class MyFactoryBean implements FactoryBean<Book> {
@Override
public Book getObject() throws Exception {
System.out.println("getObject()...."); //如果是单例只调用一次
return new Book(200,"BooName01","Author01",108.0);
}
/*@Override 事物的factoryBean 的代码类似下面
public SessionFactory getObject() throws Exception {
SessionFactory sessionFactory ;
return sessionFactory;
}*/
@Override
public Class<?> getObjectType() {
return Book.class;
}
@Override
public boolean isSingleton() {
return true; //true表示单例,false表示多例。
}
}
<!-- 配置FactoryBean★ -->
<bean id="getBookFromFactoryBean" class="com.atguigu.spring.ioc.factory.MyFactoryBean"></bean>
//获取FactoryBean创建的对象★
Book book3 = (Book)ioc.getBean("getBookFromFactoryBean");
System.out.println(book3);