您的位置:首页 > 编程语言 > Java开发

Spring学习总结(二)---谈谈对Spring IOC的理解(二:代码实现实例)

2016-09-04 19:14 645 查看
日期: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服务了。

基本总结如上两点,假如有什么不对的地方希望各位博友批评指教,谢谢大家!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring ioc