java框架—spring

来源:互联网 发布:vmware 配置网络 编辑:程序博客网 时间:2024/06/09 16:14

1.什么是spring框架

springJ2EE应用程序框架,是轻量级的IoCAOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

2,架构概述

 

 

  1IoC(Inversion of Control)控制反转,对象创建责任的反转,在springBeanFacotoryIoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。

spring中有三种注入方式,一种是set注入,一种是接口注入,另一种是构造方法注入。

 

    2AOP面向切面编程

   aop就是纵向的编程,如下图所示,业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码。

 spring中面向切面变成的实现有两种方式,一种是动态代理,一种是CGLIB,动态代理必须要提供接口,而CGLIB实现是有继承。

 

3,为什么使用spring框架

  在不使用spring框架之前,我们的service层中要使用dao层的对象,不得不在service层中new一个对象。如下:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. //dao层对象  
  2. public class UserDao{  
  3.    publicvoid insert(User user){}  
  4. }  
  5.    
  6. //service层对象  
  7. public classUserService{  
  8.    publicvoid insert(User user){  
  9.        UserDaouserdao = new UserDao();  
  10.        userdao.insert(user);  
  11.    }  
  12. }  


存在的问题:层与层之间的依赖。

使用框架后:


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. //dao层对象  
  2. public class UserDao{  
  3.     publicvoid insert(User user){}  
  4. }  
  5.    
  6. //service层对象  
  7. public classUserService{  
  8.    privateUserDao userdao;  
  9.    
  10.    publicUserDao getUserdao() {  
  11.       returnuserdao;  
  12.    }  
  13.    publicvoid setUserdao(UserDao userdao) {  
  14.       this.userdao= userdao;  
  15.    }  
  16.    
  17.    publicvoid insert(User user){  
  18.       userdao.insert(user);  
  19.    }  
  20.    
  21. }  

service层要用dao层对象需要配置到xml配置文件中,至于对象是怎么创建的,关系是怎么组合的都交给了spring框架去实现。


4,框架优点

轻量级的容器框架没有侵入性

使用IoC容器更加容易组合对象直接间关系,面向接口编程,降低耦合

Aop可以更加容易的进行功能扩展,遵循ocp开发原则

创建对象默认是单例的,不需要再使用单例模式进行处理

 

5,缺点:业务功能依赖spring特有的功能,依赖与spring环境。


单元测试不是头一次听说了,但只是听说从来没有用过。一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的。学到spring框架这才知道单元测试原来是这么回事儿。


 下面以上一篇文章中set注入的第一个实例为测试对象。进行单元测试。


1,拷贝jar包

 junit-3.8.2.jar(4.x主要增加注解应用)


2,写业务类

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class User{  
  2.     privateString username;  
  3.    
  4.     publicString getUsername() {  
  5.        returnusername;  
  6.     }  
  7.     publicvoid setUsername(String username) {  
  8.        this.username= username;  
  9.     }  
  10.    
  11.     //添加方法  
  12.     publicString login() throws Exception{  
  13.        if("admin".equals(username){  
  14.           return"success";  
  15.        }else{  
  16.           return"error";  
  17.        }  
  18.     }  
  19. }  

3,定义测试类

  测试类最好单独建立项目,或者单独定义文件夹存储,需要继承junit.framework.TestCase

 

4,增加测试方法

  测试方法必须是public,不应该有返回值,方法名必须以test开头,无参数

 测试方法是有执行先后顺序,按照方法的定义先后顺序

 多个测试方法对同一个业务方法进行测试,一般每个逻辑分支结构都有测试到。

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class TestUserextends TestCase{   
  2.     publicvoid testUser_Success() throws Exception{   
  3.        //准备数据  
  4.        Useraction = new User();  
  5.        action.setUsername("admin");  
  6.   
  7.        //调用被测试方法  
  8.        Stringresult = action.login();  
  9.    
  10.        //判断测试是否通过  
  11.        assertEquals("success",result);   
  12.     }  
  13. }  

 

  运行程序,如果测试成功会出现如下图所示的结果


 如果运行失败,有方法没有通过测试,那么就会显示出在哪个方法出错了。上图中绿色的条会变成红色的。

 

5,测试类的生命周期方法

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.    
  2. //用来进行初始化操作  
  3. @Override  
  4. protectedvoid setUp() throws Exception {  
  5.    System.out.println("setUp...");  
  6. }  
  7.    
  8. //用来做销毁操作  
  9. @Override  
  10. protectedvoid tearDown() throws Exception {  
  11.    System.out.println("tearDown...");  
  12. }  


setUp方法会在每一个测试方法前执行一次。tearDown方法会在每一个测试方法后执行一次



AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象。

 

 AOP的引入

 在OOP面向对象的使用中,无可避免的会出现代码重复,而且使用面向对象的编程方式,这种重复无法避免,比如用户权限判断中,根据相应的权限执行相应的方法;在servlet中设置编码格式时,同样相同的代码出现很多次,而且还根业务无关,很容易忘记写,结果运行的时候就出现乱码拉。这种重复代码不仅使编码麻烦,而且还不容易维护。而AOP则将这些代码整理起来,将解决某个切面问题的代码单独的放在某个模块中,然后再织入到程序中。

AOP中的术语




  Aspect:横切面的功能抽象出类,或接口, AOP编程重要的就是识别出横切面功能。

       方面,类似于字符编码功能) 

 Advice: 横切面功能的具体实现,需要根据实际的情况分析,如果在目标对象操作之前是 before在操作之后,就是 after advice。

       增强,类似于字符编码过滤器

 Pointcut:切入点,描述横切面功能应用的限制,不是所有的流程都需要,那些可以使用的地方就是切入点

       类似于过滤器的匹配规则 /*

 Joinpoint: 连接点,或指组件加入流程的时机,比如设置属性,调用方法,等,Spring只支持方法调用的连接点,而其他的一些框架支持属性的连接点如:AspectJ

       类似于过滤器的过滤规则 REQUESTFORWARD

 Weave: 缝合,将组件应用到业务流程中的这个过程,叫缝合或织入。

       类似于将过滤器配置到web.xml文件的过程

 Proxy,代理,在实现上,SpringAOP其实就是使用JDK的动态代理(使用接口的方式完成代理操作),也可以使用CGLIB(使用继承的方式完成代理操作)。

 Target目标,业务操作的实际对象

 

 

实例:设置字符编码格式看作是一个Aspect方面,而拦截器就是一个Advice增强。

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;"><!-- 字符编码过滤器-->  
  2. <filter>  
  3. <filter-name>characterFilter</filter-name>  
  4. <filter-class>com.bjpowernode.egov.filter.CharacterEncodingFilter</filter-class>  
  5. </filter>  
  6. <filter-mapping>  
  7. <filter-name>characterFilter</filter-name>  
  8. <url-pattern>/servlet/*</url-pattern>  
  9. </filter-mapping>  
  10.  </span>  

过滤器

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">public class CharacterEncodingFilter implements Filter {  
  2.    
  3.    @Override  
  4.    public void destroy() {}  
  5.    
  6.    @Override  
  7.    public void doFilter(ServletRequest request, ServletResponse response,  
  8.       FilterChainchain) throws IOException, ServletException {  
  9.            request.setCharacterEncoding("GB18030");  
  10.            chain.doFilter(request,response);  
  11.    }  
  12.    
  13.    @Override  
  14.    publicvoid init(FilterConfig filterConfig) throws ServletException {}  
  15. }</span>  


这样就不用在每个servlet中设置编码拉。。

 

spring框架中AOP的使用

1,拷贝jar



 

2spring配置文件中增加命名空间和约束文件

启用aop功能:就把标签添加进来就可以拉。

 


 

3,写被代理的类和扩展类

 


 


4,由配置文件声明

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;"><!--声明目标类-->  
  2. <bean id="targetclass" class="com.spring.aop.TargetClass"></bean>  
  3.   
  4. <!--声明扩展类-->  
  5. <bean id="extendsclass" class="com.spring.aop.extendsClass"></bean>  
  6.   
  7.   
  8. <!--织入扩展类,并声明在哪个方法上执行扩展类-->  
  9. <aop:config>  
  10.     <aop:aspect id="extendAspect" ref="">  
  11.         <aop:pointcut expression="execution(public ** (..))" id="extendsPoincat">  
  12.         <!--在目标方法执行前执行的方法-->  
  13.         <aop:before method="beforemethod" pointcut-ref="extendsPoincat" />  
  14.         <!--在目标方法执行后执行的方法-->  
  15.         <aop:after method="aftermethod" pointcut-ref="extendsPoincat" />  
  16.     </aop:aspect>  
  17. </aop:config></span>  



 

5,测试

 成功的话,执行目标类中的目标方法targetmethod()时,会先执行扩展类中的beforemethod()方法,再执行目标方法,最后再执行aftermethod()方法。
 也就是我们只需要手动调用targetmethod方法,扩展类中的两个方法框架会在执行的时候通过读取配置文件,获取相应信息,自动给我们添加上扩展的方法。。
 测试肯定成功,不相信的话,可以自己试试。

 

Spring框架中使用AOP的优点

   AopspringIOC容器整合,增强,切入点都是javabean,可以在同一文件中配置

 和spring的其他部分一样,可以在不同应用服务器之间任意移植

   spring实现Aop的拦截接口,使得用户不必绑定在特定的拦截器接口上

 

 aop面向切面的编程思想,打破面向对象的思维方式,我们要学习的不仅是aop的使用,更要学习面向切面的这种思想。



0 0
原创粉丝点击