1、回顾(一)
上节我已经基本说明了耦合,以及在一些业务上是怎么发生的,实际上我们要理解一个思想,传统的EJB开发模式,因为受到了很多很多的框架硬性约束,web容器的约束
导致了代码的可读性,可移植和可扩展性变得不好,所以有这些解耦的思想,我们才会在03年spring的广泛流行!
回顾上节末尾:我们是不是遗留了一个问题,如果我们在工厂中,每次有一个新的对象,我们就需要手动的加一个对应的getBean方法,可重用性大大降低,所以我们称下面的代码,叫做
---------------------------简单工厂------------------------------------
/**
* 定义一个bean工厂,专门生产普通对象
*/
public class BeanFactory {
private static Properties properties = new Properties();
//1.加载配置文件
static {
InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
try {
properties.load(resourceAsStream);
resourceAsStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static UserDao getBean(String key){
// 2.使用key获得value
String className = properties.getProperty(key);
// 3.使用value利用反射技术创建对象
try{
return (UserDao) Class.forName(className).newInstance();
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
那么为了避免多个不同的对象在实际生产业务中,代码的繁重,我们将这个简单工厂,改造成通用工厂
/**
* 定义一个bean工厂,专门生产普通对象
*/
public class BeanFactory {
private static Properties properties = new Properties();
//1.加载配置文件
static {
InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
try {
properties.load(resourceAsStream);
resourceAsStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 来个对象就要在工厂创建一个
// public static UserDao getMysqlBean() {
// return new UserDaoMysqlImpl();
// }
//
// public static UserDao getOracleBean() {
// return new UserDaoOracleImpl();
// }
// 来个对象就要在工厂创建一个,冗余代码太多
// public static UserDao getBean(String key){
// // 2.使用key获得value
// String className = properties.getProperty(key);
// // 3.使用value利用反射技术创建对象
// try{
// return (UserDao) Class.forName(className).newInstance();
// }catch(Exception e){
// e.printStackTrace();
// return null;
// }
// }
/**
* 通用工厂方法,不必要一个新来对象就要创建一个getBean
* @param key
* @return
*/
public static Object getBean(String key){
Object ret = null;
String className = properties.getProperty(key);
// 3.使用value利用反射技术创建对象
try{
ret = Class.forName(className).newInstance();
}catch(Exception e){
e.printStackTrace();
}
return ret;
}
}
这样的话,是不是我们只需要在配置文件中这么写:
userDao=com.chenxin.gmall.user.demo.dao.UserDaoSqlServerImpl
userService=com.chenxin.gmall.user.demo.service.UserServiceImpl
在需要创建对象的地方,我们只需要强制转换下:
UserDao userDao = (UserDao) BeanFactory.getBean("userDao");
......
我们想在哪里生成一个接口的实现类,只要你存在这个接口的实现,我们就可以定义在配置文件中,然后在你需要生成的地方调用即可!