zoukankan      html  css  js  c++  java
  • [置顶] 深入浅出Spring(四) Spring实例分析

           上次的博文中 深入浅出Spring(二) IoC详解 和 深入浅出Spring(三) AOP详解中,我们分别介绍了一下Spring框架的两个核心一个是IoC,一个是AOP。接下来我们来做一个Spring的实例。

           为了更好的讲解Spring的相关内容,这次的博文会针对一个【添加用户】的实例,进行逐步的解剖和优化,再此过程中,细节内容大家不需要考虑,只需要加深对Spring的理解即可。

     1、实例一

           首先,我们来看一个没有使用任何Spring框架内容,比较单纯的添加用户的实例。先看一下相关的类图和实现代码,具体如下:

    	public class User {	
    		private String username;
    		private String password;
    		
    		public String getUsername() {
    			return username;
    		}
    		public void setUsername(String username) {
    			this.username = username;
    		}
    		public String getPassword() {
    			return password;
    		}
    		public void setPassword(String password) {
    			this.password = password;
    		}
    	}
    
    	public interface UserDao {
    
    		public void addUser(User user);
    	}
    
    	public class UserDao4OracleImpl implements UserDao {
    
    		@Override
    		public void addUser(User user) {		
    			System.out.println("UserDao4OracleImpl.addUser() , username="+user.getUsername());
    		}	
    	}
    
    	public class UserDao4MySqlImpl implements UserDao {
    
    		@Override
    		public void addUser(User user) {		
    			System.out.println("UserDao4MySqlImpl.addUser()  , username="+user.getUsername());
    		}	
    	}
    
    	public interface UserManager {	
    		public void addUser(User user);
    	}
    
    	public class UserManagerImpl implements UserManager {
    		@Override
    		public void addUser(User user) {		
    			UserDao userDao = new UserDao4MySqlImpl();		
    			userDao.addUser(user);		
    		}
    	}
    	public class Client {
    		public static void main(String[] args) {
    			
    			User user = new User();		
    			user.setUsername("张三");
    			user.setPassword("123456");	
    			
    			UserManager userManager = new UserManagerImpl();			
    			userManager.addUser(user);
    			
    		}
    	}	

            分析上面的类图和代码中,我们可以很明显的看出: 在UserManagerImpl类的方法addUser中,UserManagerImpl调用了UserDao及其具体的实现类UserDao4MySqlImpl,这就不符合IoC模式中,将接口的具体实现类的控制权从调用类中分离转交给第三方决定的相关思想 ,所以我们需要在这里进行修改。(参考我们之间的IoC文章)。

    2、实例二

           针对实例一中不符合IoC思想的部分,我们进行相关修改,具体修改之后的相关类图和代码如下:


    	public class UserManagerImpl implements UserManager {
    		private UserDao userDao; 
    		public UserManagerImpl (UserDao userDao){
    			this.UserDao = userDao;
    		}
    		
    		@Override
    		public void addUser(User user) {				
    			this.userDao.addUser(user);		
    		}
    	}
    	
    	public class Client {
    		public static void main(String[] args) {
    			
    			User user = new User();		
    			user.setUsername("张三");
    			user.setPassword("123456");	
    			
    			UserDao userDao =  new UserDao4MySqlImpl();	
    			
    			UserManager userManager = new UserManagerImpl(userDao);			
    			userManager.addUser(user);
    			
    		}	
    	}

           分析上面修改之后的类图和代码,我们发现,虽然我们将UserDao的控制权交给了Client,但在Client中却存在对UserDao及其相关实现类的依赖,这样对于Client来讲,Client类与UserDao类之间的耦合性反而不如我们之前写的代码低。如何优化呢?我们这里就不做太多的思考,直接使用Spring的相关内容即可。


    3、实例三

           对于实例二的问题,先来看一下我们使用Spring框架修改之后的相关类图,具体如下:


           看完上面类图之后,我们对比于第一张类图,可以看出:这张图中类与类之间的相互依赖更少,耦合性更低。这正是我们使用Spring的好处,但这张类图的代码究竟是如何实现的呢?这就是接下来,我们需要重点看一下的Client类,具体的相关代码如下:

    	public class Client {	
    
    		public static void main(String[] args) {
    			
    			User user = new User();		
    			user.setUsername("张三");
    			user.setPassword("123456");
    			
    			BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
    			UserManager userManager = (UserManager)factory.getBean("userManager");				
    			userManager.addUser(user);		
    		}
    	}

           通过对比上面的代码和我们在第二个实例中关于Client类的代码可以看出,上面的代码仅仅用到了一个BeanFactory类和一个XML文件,而这也正是Spring框架使用的核心类和类与类之间耦合性降低的关键。了解了两者的区别,我们再看一下XML文件中都写了什么,具体如下:

    	<?xml version="1.0" encoding="UTF-8"?>
    	<beans xmlns="http://www.springframework.org/schema/beans"
    			 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    			 xmlns:aop="http://www.springframework.org/schema/aop"
    			 xmlns:tx="http://www.springframework.org/schema/tx"
    			 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    			   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    			   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    			 
    		<bean id="userDao4MySqlImpl" class="com.zs.spring.dao.UserDao4MySqlImpl"/>
    	  
    		<bean id="userManager" class="com.zs.spring.manager.UserManagerImpl">
    			<property name="userDao" ref="userDao4MySqlImpl"/>
    		</bean>	  
    	</beans>

           关于这个XML文件,我会在接下来的文章中重点进行讲解,这里只告诉大家,它就 即相当于下面的两句代码:

    	UserManager userManager = new UserManagerImpl(userDao);
    	UserDao userDao =  new UserDao4MySqlImpl();


    4、总结

           对比上面的三张类图,我们可以看到,使用Spring框架, 将对象之间的依赖关系交由Spring容器进行控制,通过使用XML文件将对象之间的调用关系从代码中分离,避免硬编码所造成的过度程序耦合,这正是Spring框架实现解耦的核心思想  


          到此为止,关于Spring的实例就讲解完毕了,讲解的不是很细,大家只需要对Spring框架有一个初步的认识即可。至于Spring运行过程中的具体实现,我会在下次的博文中继续讲解,以便加深大家对Spring的理解。

          给大家提供一个博文配套的参考实例代码下载地址:

    spring_01.zip

  • 相关阅读:
    一组网页边栏过渡动画,创意无限!【附源码下载】
    sql查询比较两表不同数据与相同数据
    Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解
    防盗链基本原理(web安全测试实例二)
    篡改请求数据 或响应数据(web安全测试 实例三)
    【转】思维导图编写测试用例的两种格式
    【转】流媒体与直播技术
    Jmeter接口测试 不同的content-type传入参数方式(一)
    md5算法的java实现
    sql server 2008导出数据至Excel或者wps
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3285556.html
Copyright © 2011-2022 走看看