1. 一、    IoC(Inversion of control): 控制反转 
  2.  
  3. 1、IoC: 
  4.  
  5. 概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 
  6.  
  7. 核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean 
  8.  
  9. 2、bean工厂创建bean的三种方式: 
  10.  
  11. u      通过构造方法直接创建: 
  12.  
  13. <bean id=”” class=”bean class name”> 
  14.  
  15. u      通过静态工厂方法创建: 
  16.  
  17. <bean id=”” class=”factory class name” factory-method=””> 
  18.  
  19. u      通过非静态工厂方法创建: 
  20.  
  21. <bean id=”factory” class=”factory class name”> 
  22.  
  23. <bean id=”” factory-bean=” factory” factory-method=””> 
  24.  
  25. 3、Spring中实现IoC的方式:依赖注入(Dependency Injection) 
  26.  
  27. Spring中依赖注入的两种方式: 
  28.  
  29. u      通过setter方法注入: 
  30.  
  31. <property name=””></property> 
  32.  
  33. 其中,name属性的取值依setter方法名而定 
  34.  
  35. u      通过构造方法注入: 
  36.  
  37. <constructor-arg index=””></ constructor-arg> 
  38.  
  39. 其中,index表示构造方法中的参数索引(第一个参数索引为0) 
  40.  
  41. 4、设置属性时可选的标签: 
  42.  
  43. n        value:基本类型(封装类型)或String类型 
  44.  
  45. n        ref:引用工厂中其它的bean 
  46.  
  47. n        list:List或数组类型 
  48.  
  49. n        set:Set类型 
  50.  
  51. n        map:Map类型 
  52.  
  53. n        props:Properties类型 
  54.  
  55. 5、自动装配:自动将某个bean 注入到另一个bean的属性当中 
  56.  
  57. (bean标签的autowire属性) 
  58.  
  59. 6、依赖检查:检查bean的属性是否完成依赖关系的注入 
  60.  
  61. (bean标签的dependency-check属性) 
  62.  
  63. 7、生命周期方法: 
  64.  
  65.               init-method(也可实现接口org.springframework.beans.factory.InitializingBean) 
  66.  
  67. destroy-method(也可实现接口DisposableBean) 
  68.  
  69.        8、单例bean:默认情况下,从bean工厂所取得的实例为Singleton 
  70.  
  71.                                    (bean的singleton属性) 
  72.  
  73.        9、Aware相关接口:可以通过实现Aware接口来获得Spring所提供的资源 
  74.  
  75. l        org.springframework.beans.factory.BeanNameAware 
  76.  
  77. l        org.springframework.beans.factory.BeanFactoryAware 
  78.  
  79. l        org.springframework.context.ApplicationContextAware 
  80.  
  81. 10、ApplicationContext的功能扩展: 
  82.  
  83. 1)BeanPostProcessor:若想在Spring对bean完成依赖注入之后,再补充一些后续操作,则可以定义一个bean类来实现接口:org.springframework.beans.factory.config.BeanPostProcessor,然后在配置文件中定义该bean类;从而Spring容器会在每一个bean被初始化之前、之后分别执行实现了该接口的bean类的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法; 
  84.  
  85.               2)BeanFactoryPostProcessor: 
  86.  
  87. l        CustomEditorConfigurer:可借助实现了接口java.beans.PropertyEditor的类,并依据当中的实现,将字符串类型转换为指定类型的对象; 
  88.  
  89. l        PropertyPlaceholderConfigurer:可将配置文件中属性值用“${key}”形式表示,则会将其值替换成指定的属性文件中key所对应的value; 
  90.  
  91. l        PropertyOverrideConfigurer:可借助该类在指定的属性文件中设定一些优先的属性(将忽略配置文件中对应属性的设定值); 
  92.  
  93. (注意:属性文件中设定属性值的格式为:beanName.propertyName=value) 
  94.  
  95. 3) 国际化消息的支持:可通过ApplicationContext的getMessage()方法获得指定资源文件中的消息;配置如下: 
  96.  
  97. <bean 
  98.  
  99. id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
  100.  
  101.     <property name="basename"> 
  102.  
  103.       <value>first/msg</value> 
  104.  
  105.     </property > 
  106.  
  107.   </bean> 
  108.  
  109. 4) 事件的支持: 
  110.  
  111.        可发布的事件:ApplicationEvent 
  112.  
  113.        发布事件的方法:publishEvent(ApplicationEvent) 
  114.  
  115.        事件监听接口:ApplicationListener 
  116.  
  117.        11、ApplicationContext管理bean的执行阶段: 
  118.  
  119. l        创建bean; 
  120.  
  121. l        属性注入(依赖关系的注入); 
  122.  
  123. l        BeanNameAware接口实现类的setBeanName()方法; 
  124.  
  125. l        BeanFactoryAware接口实现类的setBeanFactory()方法; 
  126.  
  127. l        ApplicationContextAware接口实现类的setApplicationContext()方法; 
  128.  
  129. l        BeanPostProcessor接口实现类中的postProcessBeforeInitialization()方法; 
  130.  
  131. l        InitializingBean接口实现类的afterPropertiesSet()方法; 
  132.  
  133. l        Bean定义文件中init-method属性所指定的方法; 
  134.  
  135. l        BeanPostProcessor接口实现类中的postProcessAfterInitialization()方法; 
  136.  
  137.        12、FactoryBean:用来创建bean 
  138.  
  139.         <bean id="myObject"  
  140.  
  141.               class="org.springframework.beans.factory.config. 
  142.  
  143.                MethodInvokingFactoryBean"> 
  144.  
  145.           <property name="staticMethod"> 
  146.  
  147.             <value>com.whatever.MyClassFactory.getInstance</value> 
  148.  
  149.           </property> 
  150.  
  151. </bean> 
  152.  
  153. (注意:通过bean工厂的getBean(“myObject”)得到的是FactoryBean所生产的产品;getBean(“&myObject”)得到的是FactoryBean实例本身) 
  154.  
  155. 二、AOP(Aspect-Oriented Programming): 面向方面编程 
  156.  
  157. 1、代理的两种方式: 
  158.  
  159. 静态代理: 
  160.  
  161. l        针对每个具体类分别编写代理类; 
  162.  
  163. l        针对一个接口编写一个代理类; 
  164.  
  165. 动态代理: 
  166.  
  167. 针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类 
  168.  
  169. 2、AOP的主要原理:动态代理 
  170.  
  171. 3、AOP中的术语: 
  172.  
  173. l        Aspect:方面,层面 
  174.  
  175. l        Joinpoint:结合点、联结点;加入业务流程的点或时机 
  176.  
  177. l        Pointcut:切入点、作用点;指定某个方面在哪些联结点织入到应用程序中 
  178.  
  179. l        Advice:通知、行为;某个方面的具体实现 
  180.  
  181. l        Advisor:由Pointcut和Advice共同构成 
  182.  
  183. 4、Pointcut:Spring根据类名称及方法名称定义Pointcut,表示Advice织入至应用程序的时机; 
  184.  
  185. org.springframework.aop.Pointcut 
  186.  
  187. 5、ProxyFactoryBean:用来创建代理对象 
  188.  
  189. <bean id="proxy" 
  190.  
  191. class="org.springframework.aop.framework.ProxyFactoryBean"> 
  192.  
  193.     <property name="target"> 
  194.  
  195.          <ref bean="target bean"/> 
  196.  
  197.     </property> 
  198.  
  199.     <property name="proxyInterfaces"> 
  200.  
  201.          <list> 
  202.  
  203. <value>interfaces of target bean implemented</value> 
  204.  
  205. </list> 
  206.  
  207.     </property> 
  208.  
  209.     <property name="interceptorNames"> 
  210.  
  211.            <list> 
  212.  
  213.               <value>Advice/Advisor bean</value> 
  214.  
  215.          </list> 
  216.  
  217.     </property> 
  218.  
  219. </bean> 
  220.  
  221. 创建代理对象需指定的三要素: 
  222.  
  223. l        target:设定目标对象(只能是一个); 
  224.  
  225. l         proxyInterfaces:设定代理接口(目标对象所实现的接口); 
  226.  
  227. l        interceptorNames:设定拦截器的名字(各个advice或advisor bean的列表) 
  228.  
  229. 6、Advice:五种(根据织入的时机不同而划分) 
  230.  
  231. l        Before Advice:在目标对象的方法执行之前加入行为; 
  232.  
  233. 要实现的接口:org.springframework.aop.MethodBeforeAdvice 
  234.  
  235. l        After Advice:在目标对象的方法执行之后加入行为; 
  236.  
  237. 要实现的接口:org.springframework.aop.AfterReturningAdvice 
  238.  
  239. l        Throw Advice:在目标对象的方法发生异常时加入行为 
  240.  
  241. 要实现的接口:org.springframework.aop.ThrowsAdvice 
  242.  
  243. l        Around Advice:在目标对象的方法执行前后加入行为 
  244.  
  245. 要实现的接口:org.aopalliance.intercept.MethodInterceptor 
  246.  
  247. l        Introduction Advice:引入的行为(增加了可操作的方法) 
  248.  
  249. 1.        声明要添加的功能接口; 
  250.  
  251. 2.        创建引入Advice; 
  252.  
  253. (继承org.springframework.aop.support.DelegatingIntroductionInterceptor,并实现添加的功能接口) 
  254.  
  255. 3.        在配置文件中定义一个DefaultIntroductionAdvisor的bean 
  256.  
  257. (需要两个构造方法的参数:Advice和添加的功能接口) 
  258.  
  259. 7、PointcutAdvisor:Pointcut定义了Advice的应用时机;在Spring中,使用PointcutAdvisor将Pointcut和Advice结合为一个对象 
  260.  
  261. l         NameMatchMethodPointcutAdvisor:可用来指定Advice所要应用的目标对象上的方法名称 
  262.  
  263. <bean id="nameAdvisor" 
  264.  
  265. class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> 
  266.  
  267.     <property name="mappedName"> 
  268.  
  269.       <value>do*</value> 
  270.  
  271.     </property> 
  272.  
  273.     <property name="advice"> 
  274.  
  275.       <ref local="AdviceBeanName"/> 
  276.  
  277.     </property> 
  278.  
  279. </bean> 
  280.  
  281. l         RegexpMethodPointcutAdvisor:可使用Regular expression定义Pointcut,在符合Regular expression的情况下应用Advice,其pattern属性用来指定所要符合的完整类名(包括 package名称)及方法名;定义该属性时可使用的符号包括: 
  282.  
  283. 符号 
  284.      
  285.  
  286. 描述 
  287.  
  288.      
  289.  
  290. 符合任意一个字符 
  291.  
  292.      
  293.  
  294. 符合前一个字符一次或多次 
  295.  
  296.      
  297.  
  298. 符合前一个字符零次或多次 
  299.  
  300.      
  301.  
  302. 转义字符,用来转义正则表达式中使用到的字符 
  303.  
  304.        <bean id="regexpAdvisor" 
  305.  
  306. class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
  307.  
  308.           <property name="pattern"> 
  309.  
  310.                <value>.*do.*</value> 
  311.  
  312.           </property> 
  313.  
  314.           <property name="advice"> 
  315.  
  316.                <ref local="AdviceBeanName"/> 
  317.  
  318.           </property> 
  319.  
  320.      </bean> 
  321.  
  322. 8、AutoProxy:自动代理 
  323.  
  324. l        BeanNameAutoProxyCreator:根据bean的名字为其自动创建代理对象,bean工厂自动返回其代理对象: 
  325.  
  326. <bean 
  327.  
  328. class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
  329.  
  330. <property name="beanNames"> 
  331.  
  332. <list> 
  333.  
  334.         <value>beanName</value> 
  335.  
  336. </list> 
  337.  
  338. </property> 
  339.  
  340. <property name="interceptorNames"> 
  341.  
  342. <list> 
  343.  
  344. <value>Advice/Advisor Bean Name</value> 
  345.  
  346.                             </list> 
  347.  
  348. </property> 
  349.  
  350. </bean> 
  351.  
  352. l        DefaultAdvisorAutoProxyCreator:自动将Advisor应用到符合Pointcut的目标对象上 
  353.  
  354. <bean id="regexpAdvisor" 
  355.  
  356. class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
  357.  
  358.     <property name="pattern"> 
  359.  
  360.       <value>.*do.*</value> 
  361.  
  362.     </property> 
  363.  
  364.     <property name="advice"><ref local="AdviceName"/></property> 
  365.  
  366. </bean> 
  367.  
  368. <bean 
  369.  
  370. class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 
  371.  
  372. 三、Spring的Web MVC: 
  373.  
  374.        1、DispatcherServlet:作为前端控制器,负责分发客户的请求到Controller; 
  375.  
  376.               在web.xml中的配置如下: 
  377.  
  378.        <servlet> 
  379.  
  380.       <servlet-name>mvc</servlet-name> 
  381.  
  382.       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
  383.  
  384.          <init-param> 
  385.  
  386.           <param-name>contextConfigLocation</param-name> 
  387.  
  388.           <param-value>/WEB-INF/mvc-servlet.xml</param-value> 
  389.  
  390.       </init-param> 
  391.  
  392.       <load-on-startup>1</load-on-startup> 
  393.  
  394.       </servlet> 
  395.  
  396.       <servlet-mapping> 
  397.  
  398.       <servlet-name>mvc</servlet-name> 
  399.  
  400.       <url-pattern>*.do</url-pattern> 
  401.  
  402.       </servlet-mapping> 
  403.  
  404.        2、Controller:负责处理客户请求,并返回ModelAndView实例; 
  405.  
  406. Controller必须实现接口org.springframework.web.servlet.mvc.Controller,实现该接口中的方法handleRequest(),在该方法中处理请求,并返回ModelAndView实例 
  407.  
  408. 3、HandlerMapping:DispatcherServlet根据它来决定请求由哪一个Controller处理; 
  409.  
  410. l         默认情况下,DispatcherServlet将使用org.springframework.web.servlet.handler. BeanNameUrlHandlerMapping,即使用和客户请求的URL名称一致的Controller的bean实例来处理请求; 
  411.  
  412. l         另外一种常用的HandlerMapping为org.springframework.web.servlet.handler. SimpleUrlHandlerMapping,配置如下: 
  413.  
  414. <bean 
  415.  
  416. class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
  417.  
  418.     <property name="mappings"> 
  419.  
  420.       <props> 
  421.  
  422.         <prop key="/add.do">add</prop> 
  423.  
  424.       </props> 
  425.  
  426.     </property> 
  427.  
  428. </bean> 
  429.  
  430. 在以上“mappings”属性设置中,“key”为请求的URL,而“value”为处理请求的Controller的bean名称 
  431.  
  432. 4、ModelAndView:用来封装View与呈现在View中的Model对象; 
  433.  
  434. DispatcherServlet根据它来解析View名称,并处理呈现在View中的Model对象 
  435.  
  436.        5、ViewResolver:DispatcherServlet委托ViewResolver来解析View名称; 
  437.  
  438.               常用的ViewResolver实例配置如下: 
  439.  
  440.        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
  441.  
  442.            <property name="prefix"> 
  443.  
  444.                  <value>/</value> 
  445.  
  446.            </property> 
  447.  
  448.             <property name="suffix"> 
  449.  
  450.                   <value>.jsp</value> 
  451.  
  452.            </property> 
  453.  
  454.       </bean> 
  455.  
  456. 四、Spring Data Access 
  457.  
  458.        1、Template 
  459.  
  460.        2、Dao Support 
  461.  
  462.        3、Transaction Manager 
  463.  
  464.        4、Transaction Proxy