一、接上回分析
1、如果每次创建都需要使用第八节的创建方式。每次创建一个对象都要重新写一个方法,累赘。
package com.haoxiansheng.spring5.reflex;
import com.haoxiansheng.spring5.Book;
import com.haoxiansheng.spring5.Order;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @author haoxiansheng
* @date 2020-06-03
*/
public class BeanFactory {
private static Properties env = new Properties();
static {
try {
// 第一步获得IO 输入流
InputStream inputStream = BeanFactory.class.getResourceAsStream("/application.properties");
// 第二部文件内容封装到Properties 集合 key = book value = com.haoxiansheng.spring5.Book
env.load(inputStream);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// public static Book getBook() {
// Book book = null;
// try {
// // 硬编码 耦合
// //Class clazz = Class.forName(env.getProperty("com.haoxiansheng.spring5.Book"));
// // 利用配置文件加载的方式解决耦合
// Class clazz = Class.forName(env.getProperty("book"));
// book = (Book) clazz.newInstance();
// } catch (InstantiationException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (ClassNotFoundException e) {
// e.printStackTrace();
// }
// return book;
// }
//
// public static Order getOrder() {
// Order order = null;
// try {
// // 硬编码 耦合
// //Class clazz = Class.forName(env.getProperty("com.haoxiansheng.spring5.Book"));
// // 利用配置文件加载的方式解决耦合
// Class clazz = Class.forName(env.getProperty("order"));
// order = (Order) clazz.newInstance();
// } catch (InstantiationException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (ClassNotFoundException e) {
// e.printStackTrace();
// }
// return order;
// }
/***
*
* @param name 配置文件的key
* @param <T> 这我使用了泛型
* @return
*/
public static <T> T getObject(String name) {
T t = null;
try{
Class clazz = Class.forName(env.getProperty(name));
t = (T)clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
2、测试
application.properties
book=com.haoxiansheng.spring5.Book
userDAO=com.haoxiansheng.spring5.UserDAO
@Test
public void testFactory() {
Book book = BeanFactory.getObject("book");
System.out.println(book);
UserDAO userDAO = BeanFactory.getObject("userDAO");
System.out.println(userDAO);
}
3、md笔记总结
# 2、总结
## 2)通用工厂的设计
> 方法声明的五部分 修饰符、返回值、方法名、参数列表、可选异常
```java
public class BeanFactory{
private Properties env = new Properties();
public static <T> T getObject(String name) {
T t = null;
try{
Class clazz = Class.forName(env.getProperties(name));
t = (T)clazz.newInstance();
} catch (Exception e) {
}
return t;
}
}
```
## 3) 通用工厂的类型
> 1、定义类型(类)
2、通过配置文件告诉工厂(application.properties) [key = value]
3、通过工厂获得类的对象
Object object = BeanFactory.getBean("key"); 使用的时候需要类型转化
上面的方式就不需要转换了,因为我以及转换过了
> Spring本质:工厂ApplicationContext(ApplicationContext.xml)