开发为什么需要使用spring框架?
- Spring旨在解决业务逻辑层和其他各层的松耦合问题
-
什么是IOC?
- 它不是一种技术,而是一种设计思想
- 目的:是借助Spring中的IOC容器(对象工厂)实现具有依赖关系的对象之间的解耦
- 通俗的解释:控制反转,把对象创建和对象之间的调用过程,交给Spring去管理
-
涉及到的原理
- xml文件解析
- 工厂模式
- 反射
-
package com.sj.spring5.version1; public class UserService { public void execute(){ UserDao userDao = new UserDao(); userDao.add(); } } ---------------------------------------------------------------------------------------------------------------------- package com.sj.spring5.version1; public class UserService2 { public void execute(){ UserDao userDao = new UserDao(); userDao.add(); } }
package com.sj.spring5.version1; public class UserDao { public void add(){ } }
这种写法有个致命的问题:耦合度太高了,他们之间的关联过于紧密了,UserDao变了,UserService也需要随之改变
比如:把UserDao从无参构造变成有参构造
package com.sj.spring5.version1; public class UserDao { private String name; public UserDao(String name) { this.name = name; } public void add(){ } }
可以看到new UserDao()处爆红了,需要修改
package com.sj.spring5.version1; public class UserService { public void execute(){ UserDao userDao = new UserDao("sj"); userDao.add(); } } ---------------------------------------------------------------------------------------------------------------------- package com.sj.spring5.version1; public class UserService2 { public void execute(){ UserDao userDao = new UserDao("sj"); userDao.add(); } }
所以我们需要降低这种耦合度太高的情况,这时可以用到一种设计思想:简单工厂模式
-
package com.sj.spring5.version1; public class UserDao { private String name; public UserDao(String name) { this.name = name; } public void add(){ } }
package com.sj.spring5.version1; import com.sj.spring5.version2.UserFactory; public class UserService { public void execute(){ UserDao dao = UserFactory.getDao();//借助工厂创建对象,可以看到UserService中不用做任何修改还是可以直接使用对象 dao.add(); } } ------------------------------------------------------------------------------------------------------------------ package com.sj.spring5.version1; import com.sj.spring5.version2.UserFactory; public class UserService2 { public void execute(){ UserDao dao = UserFactory.getDao();//借助工厂创建对象,可以看到UserService2中不用做任何修改还是可以直接使用对象 dao.add(); } }
package com.sj.spring5.version2; import com.sj.spring5.version1.UserDao; public class UserFactory { public static UserDao getDao(){ return new UserDao("sj"); } }
目的:将耦合度降低到最低限度,不是消除耦合度
-
可以从图中看出,UserService、UserDao又和UserFactory之间的耦合度比较高了,为了进一步降低耦合度就需要用到IOC的思想
-
XML文件解析、反射、工厂模式相结合
-
反射: .java文件会编译成.class文件,通过得到类的字节码文件,可以 *** 作类中所有内容,比如创建对象的 *** 作。(因为主要是理解IOC设计思想,我们只需要知道java提供了一些反射机制的API,通过另外一种方法创建对象,而不是直接new)
-
XML文件解析:获取XML文件中标签中属性对应值的数据信息
-
比较抽象简略的写法:
-
这种方式虽然也是存在工厂和xml文件耦合,但是把耦合度进一步降低了,不用依赖很多个其他类,比如
-
//这是我们手动写的工厂类 package com.sj.spring5.version2; import com.sj.spring5.version1.UserDao; import com.sj.spring5.version1.UserDao2; import com.sj.spring5.version1.UserDao3; import com.sj.spring5.version1.UserDao4; import com.sj.spring5.version1.UserDao5; import com.sj.spring5.version1.UserDao6; public class UserFactory { public static UserDao getDao(){ return new UserDao("sj"); } public static UserDao2 getDao(){ return new UserDao2("sj2"); } public static UserDao3 getDao(){ return new UserDao3("sj3"); } public static UserDao4 getDao(){ return new UserDao4("sj4"); } public static UserDao5 getDao(){ return new UserDao5("sj5"); } public static UserDao6 getDao(){ return new UserDao6("sj6"); } } //如果工厂要管理很多对象的话,就需要依赖很多其他的类,只要有一个类发生了变化,那么工厂类就可能报错,导致工厂类失效。
-
//使用spring封装好的类的写法 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); //获取配置创建的对象 UserDao dao = context.getBean("userDao", UserDao.class); //这两行代码《Spring源码深度解析》这本书中就分析了80多页,spring中封装了其他很多功能,这里我们只介绍了一小部分。
当某个类发生变化的时候,不影响其他类的使用,然后只需要在xml文件中修改。
这里的xml文件可和其他类没有什么耦合度,它只是描述了一些其他类的信息。
所以这种反射、xml文件解析、工厂模式三种结合,将所有对象交给了spring进行管理,降低了程序的耦合度,使得开发人员可以把更多时间花了业务逻辑代码中。
-
-
-
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)