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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值