【学习笔记】Spring IOC为何重要?

张开发
2026/4/16 19:16:18 15 分钟阅读

分享文章

【学习笔记】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.propertiesuserDao…….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 {private static final MapString, Object beanMap new ConcurrentHashMap();private static final Properties properties;static {// properties初始化}public static Object getBean(String beanName) {if (!beanMap.containsKey(beanName)) {synchronized (BeanFactory.class) {if (!beanMap.containsKey(beanName)) {try {Object bean Class.forName(properties.getProperty(beanName)).newInstance();beanMap.put(beanName, bean);return bean;} catch (Exception e) {//}}}}return beanMap.get(beanName);}}Spring IOC思路跟以上是类似的该思路可以帮助我们快速理解Spring IOC演进过程。

更多文章