Spring学习总结(二)---谈谈对Spring IOC的理解(二:代码实现实例)
2016-09-04 19:14
645 查看
日期:2016-9-4
内容:实战演练Spring的Ioc和DI
使用这种编程方式看上去很简单明了,但是隐藏的一个弊端就是增加了开发中的代码的耦合性,而且也降低了系统的性能(当系统很庞大的时候表现很明显)。
在使用Spring的IOC的情况下同样完成了与传统的编程思想同样的功能。
①、在使用传统的编程方式的时候当我们需要外部资源(可以理解为某一个类或者接口)为我们效力的时候,是我们应用程序主动去new一个类,得到这个类之后我们就可以让它为我们干活了。
这样做的弊端在上文已经阐述过了,在这里就不再赘述。
②、相对于传统的编程方式最大的区别,我们的Spring为我们提供了一个强大的容器---IOC容器,在我们编程的过程中,可以将我们的类注册到IOC容器中,在我们的应用程序需要使用这个类的实例的时候,可以直接去我们的容器中申请使用。关于如何实例化的我们的应用程序无需去管这方面的问题。我们只需要去使用就行了。
如上图所示:我们使用A的方式将这个类在IOC容器中注册,使用B的方式将UserDao这个类实例注入到我们的UserService中,这样UserService就可以免费使用UserDao为我们的UserService服务了。
基本总结如上两点,假如有什么不对的地方希望各位博友批评指教,谢谢大家!
内容:实战演练Spring的Ioc和DI
一、传统的编程思想:
这里的传统编程方式也是面向接口的编程。1、UserDao.java:
package com.formal.dao; /** * @author Administrator: * @version 创建时间:2016-9-4 下午7:42:08 * 类说明 */ public interface UserDao { //模拟保存数据 public void save(String data); }
2、UserDaoImpl.java:
package com.formal.dao.Impl; import com.formal.dao.UserDao; /** * @author Administrator: * @version 创建时间:2016-9-4 下午7:43:21 * 类说明 */ public class UserDaoImpl implements UserDao { @Override public void save(String data) { System.out.println("保存的数据:"+data); } }
3、UserService.java:
package com.formal.service; /** * @author Administrator: * @version 创建时间:2016-9-4 下午7:47:13 * 类说明 */ public interface UserService { //业务类:模拟数据保存 public void save(String data); }
4、UserServiceImpl.java:
package com.formal.service.Impl; import com.formal.dao.UserDao; import com.formal.dao.Impl.UserDaoImpl; import com.formal.service.UserService; /** * @author Administrator: * @version 创建时间:2016-9-4 下午7:47:40 * 类说明 */ public class UserServiceImpl implements UserService { //调用Dao里的userDao:但是这里的先获得相应dao的实例(传统的编程是通过new关键字获得实例的) private UserDao userDao; @Override public void save(String data) { //获得对象实例 userDao = new UserDaoImpl(); //调用UserDao的save方法保存数据 userDao.save(data); } }
5、单体测试:TestFormal.java:
package com.formal.test; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.formal.service.UserService; import com.formal.service.Impl.UserServiceImpl; /** * @author Administrator: * @version 创建时间:2016-9-4 下午7:52:50 * 类说明 */ public class TestFormal { //实例化一个Service类 private UserService userService; @Before public void before() { userService = new UserServiceImpl(); System.out.println("初始化完成......"); } @After public void after() { System.out.println("程序执行完成......"); } @Test public void test() { String data = "这是模拟保存的数据..."; //调用save方法保存数据 userService.save(data); } }
6、单体测试结果:
7、解析:传统开发中的弊端
在传统的编程思想中,当应用程序需要去使用一个类的实例的时候就要自己主动去new一个对象然后才可以使用。如下:使用这种编程方式看上去很简单明了,但是隐藏的一个弊端就是增加了开发中的代码的耦合性,而且也降低了系统的性能(当系统很庞大的时候表现很明显)。
二、使用Spring的IOC和DI的编程思想:
这个例子使用Spring的注解的方式完成,当然使用配置文件的形式也是可以完成的。这个看个人习惯。1、UserDao.java:
package com.spring.dao; /** * @author Administrator: * @version 创建时间:2016-9-4 下午7:42:08 * 类说明 */ public interface UserDao { //模拟保存数据 public void save(String data); }
2、UserDaoImpl.java:
package com.spring.dao.Impl; import org.springframework.stereotype.Repository; import com.spring.dao.UserDao; /** * @author Administrator: * @version 创建时间:2016-9-4 下午9:06:01 * 类说明 */ @Repository("userDao") public class UserDaoImpl implements UserDao { @Override public void save(String data) { System.out.println("使用Spring保存的数据:"+data); } }
3、UserService.java:
package com.spring.service; /** * @author Administrator: * @version 创建时间:2016-9-4 下午9:07:10 * 类说明 */ public interface UserService { //业务类:模拟数据保存 public void save(String data); }
4、UserServiceImpl.java:
package com.spring.service.Impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.spring.dao.UserDao; import com.spring.service.UserService; /** * @author Administrator: * @version 创建时间:2016-9-4 下午9:08:27 * 类说明 */ @Service("userService") public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public void save(String data) { //调用UserDao的save方法保存数据 userDao.save(data); } }
5、applicationContext.xml配置文件:
<context:component-scan base-package="com.spring"></context:component-scan>
6、测试文件TestSpring.java:
package com.spring.test; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; //import com.formal.service.Impl.UserServiceImpl; import com.spring.service.UserService; import com.spring.service.Impl.UserServiceImpl; /** * @author Administrator: * @version 创建时间:2016-9-4 下午9:16:19 * 类说明 */ public class TestSpring { <span style="white-space:pre"> </span>//初始化业务类 <span style="white-space:pre"> </span>private UserService userService; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>@Before <span style="white-space:pre"> </span>public void before() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//加载Spring配置文件 <span style="white-space:pre"> </span>ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"}); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>//从Spring容器中获得实例 <span style="white-space:pre"> </span>userService = (UserService)ac.getBean("userService"); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>System.out.println("系统初始化完成......"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>@Test <span style="white-space:pre"> </span>public void test() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>//调用业务类保存数据 <span style="white-space:pre"> </span>String data = "测试spring的IOC原理"; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>//保存数据 <span style="white-space:pre"> </span>userService.save(data); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>@After <span style="white-space:pre"> </span>public void after() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>System.out.println("执行完成......"); <span style="white-space:pre"> </span>} }
7、解析:
在使用Spring的IOC的情况下同样完成了与传统的编程思想同样的功能。
三、总结:
在尝试使用了两种方式完成了相同功能的情况下,总结如下:①、在使用传统的编程方式的时候当我们需要外部资源(可以理解为某一个类或者接口)为我们效力的时候,是我们应用程序主动去new一个类,得到这个类之后我们就可以让它为我们干活了。
这样做的弊端在上文已经阐述过了,在这里就不再赘述。
②、相对于传统的编程方式最大的区别,我们的Spring为我们提供了一个强大的容器---IOC容器,在我们编程的过程中,可以将我们的类注册到IOC容器中,在我们的应用程序需要使用这个类的实例的时候,可以直接去我们的容器中申请使用。关于如何实例化的我们的应用程序无需去管这方面的问题。我们只需要去使用就行了。
如上图所示:我们使用A的方式将这个类在IOC容器中注册,使用B的方式将UserDao这个类实例注入到我们的UserService中,这样UserService就可以免费使用UserDao为我们的UserService服务了。
基本总结如上两点,假如有什么不对的地方希望各位博友批评指教,谢谢大家!
相关文章推荐
- 谈谈对Spring IOC的理解
- java计划任务调度框架quartz结合spring实现调度的配置实例代码
- 谈谈对Spring IOC的理解
- 谈谈对Spring IOC的理解【转】
- 转:谈谈对Spring IOC的理解 http://www.cnblogs.com/xdp-gacl/p/4249939.html
- Spring笔记之三:Spring Ioc实例演示(完整代码)
- 谈谈对Spring IOC的理解
- 1000行代码读懂Spring- 实现一个基本的IoC容器
- 谈谈对Spring IOC的理解
- 谈谈对Spring IOC的理解
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- Spring3步实现定时任务,超简单,附代码实例
- Jersey1.8在spring环境下的实现 包括实例代码
- 谈谈对Spring IOC的理解
- 谈谈对C#委托的理解,附代码实例
- java计划任务调度框架quartz结合spring实现调度的配置实例代码分享
- 通过代码实例来理解反转控制IOC
- 谈谈对Spring IOC的理解
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- 谈谈对Spring IOC的理解