Spring工作原理
内部最核心的就是IOC了, 
动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射 
反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml  Spring的配置 
文件来动态的创建对象,和调用对象里的方法的 。 
     Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 
在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过 
配置类达到的。 
   Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明 
管理的(Spring根据这些配置 内部通过反射去动态的组装对象) 
   要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。 
Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式) 
  Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了 也就基本上掌握了Spring.Spring AOP与IOC
一、 IoC(Inversion of control): 控制反转 
1、IoC: 
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 
核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean 
二、AOP(Aspect-Oriented Programming): 面向方面编程 
1、 代理的两种方式: 
静态代理: 
 针对每个具体类分别编写代理类; 
 针对一个接口编写一个代理类; 
动态代理: 
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
Spring 优缺点它是一个开源的项目,而且目前非常活跃;它基于IoC(Inversion of Control,反向控制)和AOP的构架多层j2ee系统的框架,但它不强迫你必须在每一层 中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的MVC,对不同的数据访问技术提供了统一的 接口,采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现Transcation Managment,等等
优点 
a. Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。 
b. Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。 
c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性。Inversion of Control的使用(在下面讨论)帮助完成了这种简化。 
d. 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。 
e. Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。 
f. 使用Spring构建的应用程序易于单元测试。 
g. Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。 
h. Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。 
i. Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品(如Hibernate)。 
Spring确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。缺点:jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器

解决方案 »

  1.   

    其实关于spring  AOP 这块讲的有点出入spring是支持纯POJO 的aop的
      

  2.   

    恩,挺好的。其实关于struts1,2的源理和流程问题,如果没看过源码的,又几个懂,都是在网上找资料背。所以,很多面试这些题还是有一定的局限性
      

  3.   

    其实先背下来,然后再敲代码的时候 顺着背的概念敲也下去,达到一定的量之后,慢慢就理解了struts的流程,当然我没看过代码,但是说从页面到action请求,在返回到页面的整个过程(struts.xml),还是懂的,换句话说,出现什么Exception  大概也知道是哪里出了问题。先理解流程,以后有时间,有能力看源码,在加深理解!PS:叫你叔叔,只是感觉你和头像上的人有些像(当然,我没见过你,想象而已)!
      

  4.   

    刚好在学Spring,来补充下。
    在IOC初始化的时候会自动创建lazy-init对象的实例,放在容器中,其实也就是个Map。
    通过IOC获取实例的时候,如果不是lazy-init的单例对象且该对象第一次获取,那么就在这时候创建一个实例,放在容器中。
    所以不是不用new对象了,而是一个对象只需要new一次。
    好像prototype的对象是每次都要new的。这个记不太清楚了,只能说好像。
    AOP我还不是很懂,不过楼主说的也语焉不详吧。
      

  5.   

    本人.NET方向 还是学下有好处
      

  6.   


    Great ,楼主加油,我要去面试叻,求更多面试题
      

  7.   

    可否弱弱的请教下 “缺点:jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器” 这个是为什么呢
      

  8.   

    其实s s h三个框架自己写代码跑一下就都明白了
    然后再整合一下如果想弄的更明白点,那就要看你如何再设计了
    毕竟反应的都是设计者的思想,不要太拘谨了
      

  9.   

    马克一下,自学中,还没学到spring 留着先 顶之