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"); ......
我们想在哪里生成一个接口的实现类,只要你存在这个接口的实现,我们就可以定义在配置文件中,然后在你需要生成的地方调用即可!
后续我继续发布spring的源码级别的课程和一些基础知识,总之,一切都是为了解耦!