日期:2016-9-4
内容:实战演练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服务了。
基本总结如上两点,假如有什么不对的地方希望各位博友批评指教,谢谢大家!