开始spring

来源:互联网 发布:游族网络大皇帝 编辑:程序博客网 时间:2024/05/20 09:08

spring的核心是ioc和aop,了解这两个概念有助于学习spring。

1. IOC示控制反转,表示我们把类(bean)都交给spring容器(类似一个map)来管理,每个bean有名字和对应的类型。当需要某个bean时只需要从spring容器中取就可以了(通过调研getBean(beanName)),容器会帮我们创建管理我们需要的bean。

在IOC的基础上还要了解一个概念叫DI依赖注入,是说:由于spring是bean的容器,spring可以帮我们给bean的属性或者直接给bean注入值。例如spring中有一个类叫UserService类和一个UserDao类,UserService里有个属性UserDao dao,当我们使用UserService这个bean时,spring会自动把UserDao的对象注入到UserService对象中的dao属性上。

2. AOP表示面向切面编程。上面讲到所有的bean都交给spring容器来管理了,我们要使用某个bean也是从spring容器中获得,那么在获取bean时,spring容器给我们的bean不是我们预想的原始的bean,而是这个bean的子类型,那么就有产生AOP的功能的条件了。

CGLIB和反射都可以动态创建一个类的子类型,spring也用使用了这个技术。也就是说spring的aop的实现就是使用代理对象的技术,使用代理对象的好处是什么呢?可以插入代码(也就是所谓的切面代码)。

下面写伪代码模拟,比如Write的代理对象(子类)是WriteProxy,那么在代理对象中的任何方法中可以插入代码,从下面可以看到,调用WriteProxy中的w方法时可以,在方法里除了调用父类原始的方法外,很多地方可以插入代码,如果这些代码中包含判断逻辑甚至可以改变或中断原来父类方法的执行,改变方法的原意。spring中的aop原理和下面的相差无几。

[java] view plaincopyprint?
  1. class Write{  
  2.   
  3.     Object w(){  
  4.   
  5.          ...  
  6.   
  7.         return obj;  
  8.   
  9.     }  
  10.   
  11. }  
  12.   
  13.   
  14.   
  15. class WriteProxy extends Write{  
  16.   
  17.    Object w(){  
  18.   
  19.          aop code...~~  
  20.   
  21.          obj=null;  
  22.   
  23.          try{  
  24.   
  25.              obj=super.w();  
  26.   
  27.              aop code...~~  
  28.   
  29.         }catch(e){  
  30.   
  31.               aop code...~~  
  32.   
  33.         }finally{  
  34.   
  35.               aop code...~~  
  36.   
  37.        }  
  38.   
  39.         return obj;  
  40.   
  41.       }  
  42.   
  43. }  

关于动态代理的内容,参考另篇博客 java分类中的《java动态代理》