Spring学习心得(9)-- IOC和DI的意义
来源:互联网 发布:今日头条数据图 编辑:程序博客网 时间:2024/06/03 21:00
引入
现在我这里有一个文档接口,里面有读和写的方法。现在有3个类实现了这个接口,分别是word,excel,pdf。然后有一个文档管理类,在文档管理类里面调用文档的读和写的方法。代码实现如下:
public interface Document { public void read(); public void write();}public class ExcelDocument implements Document { @Override public void read() { System.out.println("excelRead"); } @Override public void write() { System.out.println("excelWrite"); }}public class PDFDocument implements Document { @Override public void read() { System.out.println("pdfRead"); } @Override public void write() { System.out.println("pdfWrite"); }}public class WordDocument implements Document { @Override public void read() { System.out.println("wordRead"); } @Override public void write() { System.out.println("wordWrite"); }}管理类:public class DocumentManager { //创建document的引用 private Document document; //使用该管理类的时候,把对应的document传进来 public DocumentManager(Document document) { this.document = document; } //调用接口的方法 public void read(){ document.read(); } public void write(){ document.write(); }}原始的测试方法public class testDocumentOriginal { @Test public void testOriginalWay(){ //首先,我们得自己创建document的实现类。要具体到用哪个类来实现document接口 Document document=new WordDocument(); //然后再新建管理类documentManager的实例 DocumentManager documentManager=new DocumentManager(document); //然后调用其中的方法 documentManager.read(); documentManager.write(); }}在这里,我们需要考虑到要用哪个类来实现,然后再调用相应类的相应方法
下面来看看利用springIOC和DI对程序进行重写
其中document和word、pdf、excel这四个类的代码不用修改,我们把相应的类配置到applicationContext.xml中
<bean class="cn.ansel.document.WordDocument" id="wordDocument"></bean> <bean class="cn.ansel.document.PDFDocument" id="pdfDocument"></bean> <bean class="cn.ansel.document.ExcelDocument" id="excelDocument"></bean> <!-- 在这里给document赋值它的实现类,然后再客户端就可以直接调用了 --> <bean class="cn.ansel.document.DocumentManager" id="documentManager"> <constructor-arg index="0" ref="wordDocument"></constructor-arg> </bean>修改之后的测试类:
public class testDoucment { @Test public void testDOucment(){ ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); //在这里直接得到管理类即可 DocumentManager documentManager=(DocumentManager) applicationContext.getBean("documentManager"); documentManager.read(); documentManager.write(); }}
spring在Mvc中的应用
在action中调用的是service层,在service层调用的是Dao层。代码如下:
public class StudentAction { //调用service层 private StudentServiceDAO service=new StudentServiceImpl(); public void saveStudent(){ service.saveStudent(); }}public class StudentServiceImpl implements StudentServiceDAO { private StudentDAO dao=new StudentDAOImpl(); @Override public void saveStudent() { dao.saveStudent(); }}public class StudentDAOImpl implements StudentDAO { @Override public void saveStudent() { System.out.println("save student dao"); }}每一层调用下一层的时候,都要创建一个新的实力,但是我们使用springIOC和Di的时候,把它们配置的spring容器中,然后只需要给它们的赋值(两种方法),然后直接就可以调用接口来完成调用:
配置文件: <!-- 在上层的调用下层的,这时候,如果Dao出错,全部出错 --> <bean class="cn.ansel.MVC.StudentAction" id="studentAction"> <property name="service" ref="studentServiceImpl"></property> </bean> <bean class="cn.ansel.MVC.StudentServiceImpl" id="studentServiceImpl"> <property name="dao" ref="studentDAOImpl"></property> </bean> <bean class="cn.ansel.MVC.StudentDAOImpl" id="studentDAOImpl"></bean></beans>public class StudentAction { //调用service层 private StudentServiceDAO service; public StudentServiceDAO getService() { return service; } public void setService(StudentServiceDAO service) { this.service = service; } public void saveStudent(){ service.saveStudent(); }}public class StudentServiceImpl implements StudentServiceDAO { //调用dao private StudentDAO dao; public StudentDAO getDao() { return dao; } public void setDao(StudentDAO dao) { this.dao = dao; } @Override public void saveStudent() { dao.saveStudent(); }}//操作数据库public class StudentDAOImpl implements StudentDAO { @Override public void saveStudent() { System.out.println("save student dao"); }}测试类:public class testMVC { @Test public void testMVC(){ ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); StudentAction action=(StudentAction) applicationContext.getBean("studentAction"); action.saveStudent(); }}
运行结果:
总结:
由上面两个例子可以看到,都是在调用接口来完成操作。
springIOC和DI实现了完全的面向接口编程,我们只需要从客户端拿到实现类,并且调用接口的方法,就可以使用,而不用担心它怎样实现
0 0
- Spring学习心得(9)-- IOC和DI的意义
- spring IOC 和 DI的意义
- Spring(9)IOC和DI的区别
- Spring的DI和IoC
- Spring的IOC和DI
- Spring的IOC和DI
- spring的IOC和DI
- spring的IoC和DI
- spring的ioc和di
- Spring的IOC和DI
- Spring的IOC和DI
- spring 的Ioc和DI
- Spring的Ioc和Di
- Spring--IoC和DI
- spring--IoC和DI
- spring IOC和DI
- Spring IOC和DI
- spring IOC 和DI
- vue在iis服务器上部署时出现找不到json文件错误
- 学习记录
- NTP时间服务器
- ADMM
- Java 正则表达式
- Spring学习心得(9)-- IOC和DI的意义
- Android lint相关
- 单词小助手的代码
- 你应该要掌握的7种回归分析方法
- 递归
- swift3.0 post &Json解析
- leetcode解题之155# Min Stack Java版 (包含min函数的栈)
- (五)串的模式匹配——BF算法和KMP算法
- dubbo和zookeeper的整合使用