前言
对于通过类名在配置文件中配置Bean是再普通不过的配置了,Spring的实例工厂方法和静态工厂方法都可以用来实例化bean,接下来我们就来看看相关实例
1. bean的创建模式就是框架利用反射new出来的bean实例
2. 工厂模式:替代了我们自己去new的过程,有一个专门替我们创建对象的类
3 .静态工厂:工厂本身不用创建对象,通过静态方法调用,对象类=工厂类.工厂方法名
4. 实例工厂:工厂本身需要创建对象 工厂类
工厂类 工厂实例=new 工厂类();
工厂实例.工厂方法名;
###静态工厂
直接调用静态方法可以返回Bean的实例
#####1.实体类
package com.xiamu.bean;
public class Book {
private String name;
private String author;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override public String toString() {
return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + '}';
}
}
2.静态工厂类
package com.xiamu.factory;
import com.xiamu.bean.Book;
import java.util.HashMap;
import java.util.Map;
public class BookStaticFactor {
private static Map<String, Book> books = new HashMap();
static {
books.put("book1", new Book("朝花夕拾", "鲁迅"));
books.put("book2", new Book("平凡的世界", "路遥"));
}
public static Book getBook(String author) {
System.out.println("获取book实例");
return books.get(author);
}
}
3.application.xml
<!-- 1.静态工厂(不需要创建工厂本身)factory 2.factory-method 指定哪个方法是工厂方法
3.class:指定静态工厂全类名-->
<bean id="book1" class="com.xiamu.factory.BookStaticFactor" factory-method="getBook">
<!-- 为方法指定参数-->
<constructor-arg value="book1"></constructor-arg>
</bean>
4.测试类
public class SpringTest {
ApplicationContext ioc = new ClassPathXmlApplicationContext("application.xml");
@Test public void getBook() {
Book book = (Book)ioc.getBean("book1");
System.out.println(book);
}
}
输出结果:
获取book实例
Book{name='朝花夕拾', author='鲁迅'}
实例工厂
1.实例工厂类
package com.xiamu.factory;
import com.xiamu.bean.Book;
import java.util.HashMap;
import java.util.Map;
public class BookInstanceFactory {
private Map<String, Book> books = new HashMap();
public BookInstanceFactory() {
books.put("book1", new Book("朝花夕拾", "鲁迅"));
books.put("book2", new Book("平凡的世界", "路遥"));
}
public Book getBook(String author) {
System.out.println("获取book实例");
return books.get(author);
}
}
2.application.xml
<!--先配置出实例工厂对象-->
<bean id="bookFactory" class="com.xiamu.factory.BookInstanceFactory"></bean>
<!--通过实例方法配置bean
factory-bean:指定使用哪个工厂(实例工厂)
factory-method 指定哪个方法是工厂方法
-->
<bean id="book2" factory-bean="bookFactory" factory-method="getBook">
<constructor-arg value="book2"></constructor-arg>
</bean>
3.测试
@Test public void getBook() {
Book book = (Book)ioc.getBean("book2");
System.out.println(book);
}
}
输出结果:
获取book实例
Book{name='平凡的世界', author='路遥'}
实现FactoryBean接口
1.实现FactoryBean接口
package com.xiamu.factory;
import com.xiamu.bean.Book;
import org.springframework.beans.factory.FactoryBean;
/**
* 实现了FactoryBean接口的类是Spring都可以认识的工厂类;
* Spring会自动调用工厂方法创建实例
* <p>
* 1.编写实现类
* 2.配置文件中注册
*/
public class BookFactoryBeanImpl implements FactoryBean<Book> {
/**
* 工厂方法 spring自动调用 返回创建的对象
*/
public Book getObject() throws Exception {
System.out.println("bookFactoryBeanImpl 帮你创建对象...");
Book book = new Book("斗破苍穹", "天蚕土豆");
return book;
}
/**
* 返回创建的对象类型
* Spring会自动调用这个方法创建对象是什么类型
*/
public Class<?> getObjectType() {
return Book.class;
}
/**
* 是单例吗?
* true 是
* false 不是
*/
public boolean isSingleton() {
return true;
}
}
2.application.xml
<!-- FactoryBean *(是Spring规定的一个接口);
只要是这个接口的实现类,Spring都认为是一个工厂
ioc容器启动不会创建实例
FactoryBean:获取的时候才会创建对象-->
<bean id="bookFactoryBeanImpl" class="com.xiamu.factory.BookFactoryBeanImpl"></bean>
3.输出结果
bookFactoryBeanImpl 帮你创建对象...
Book{name='斗破苍穹', author='天蚕土豆'}
实现FactoryBean接口
1.ioc容器启动不会创建实例
2.FactoryBean:获取的时候才会创建对象
以上就是本文关于Spring的实例工厂和静态工厂全部内容,希望对大家有所帮助,如有不足之处,欢迎留言指出