【学习笔记】Spring IOC为何重要?
一、如果不使用Sping,如何进行开发?
需要程序员直接new对象:
UserDao userDao = new UserDaoImpl();
其中UserDaoImpl访问MySQL数据库,使用MySQL方式。
问题:如果需要切换SQL Server方式,就需要将UserDaoImpl中MySQL方式改为SQL Server方式,大规模工程时效率极低
二、引入工厂类
提前把MySQL和SQL Server的Dao层写好,然后通过工厂来创建dao:
UserDao userDao = BeanFactory.getUserDao();
public class BeanFactory { public static UserDao getUserDao() { return new UserMySQLDaoImpl(); } } |
这样需要修改数据库,只需要修改BeanFactory中返回值即可
问题:工厂类强依赖Dao实现类,Dao实现类删除直接影响代码编译
三、反射(一般项目不这么做,要避免随意删除类)
Class .forName("…….dao .impl.UserMySQLDaoImpl") .newInstance();
问题:文件路径硬编码,如果切换数据库,还是要修改代码
四、通过配置进行实例注入
新增配置文件factory.properties
userDao=…….dao .impl.UserMySQLDaoImpl
然后通过反射获取dao:
UserDao userDao =Class .forName(properties.getProperty("userDao")) .newInstance();
问题:其他Dao如ManagerDao也需要创建类似的方法如getManagerDao(),代码重复
五、统一使用getBean方法代替,使用传参区分类型
public static Object getBean(String beanName) { try { return Class.forName(properties.getProperty(beanName)).newInstance(); } catch (Exception e) {// } } |
UserDao userDao = BeanFactory.getBean("userDao");
问题:每次调用getBean方法都会生成一个新的对象,造成资源浪费
六、单例模式避免对象重复创建(双检索+容器式单例)
public class BeanFactory {
} |
Spring IOC思路跟以上是类似的,该思路可以帮助我们快速理解Spring IOC演进过程。
