## Spring * [1.ä»ä¹æ¯spring?](#1ä»ä¹æ¯spring) * [2.使ç¨Springæ¡æ¶ç好夿¯ä»ä¹ï¼](#2使ç¨springæ¡æ¶ç好夿¯ä»ä¹) * [3.Springç±åªäºæ¨¡åç»æ?](#3springç±åªäºæ¨¡åç»æ) * [4.Springæ¯æä¹è§£å³å¾ªç¯ä¾èµçï¼](#4springæ¯æä¹è§£å³å¾ªç¯ä¾èµç) * [5.Spring Bootæå¨è£ é æåªå ç§æ¹å¼ï¼](#5spring-bootæå¨è£ é æåªå ç§æ¹å¼) * [6.Spring Bootèªå¨é ç½®åç](#6spring-bootèªå¨é ç½®åç) * [7.è°è°èªå·±å¯¹äºSpring IOCççè§£](#7è°è°èªå·±å¯¹äºspring-iocççè§£) * [8.è°è°èªå·±å¯¹äºSpring AOPççè§£](#8è°è°èªå·±å¯¹äºspring-aopççè§£) * [9.Spring AOPåAspectJ AOPæä»ä¹åºå«ï¼](#9spring-aopåaspectj-aopæä»ä¹åºå«) * [10.Springä¸çbeançä½ç¨åæåªäºï¼](#10springä¸çbeançä½ç¨åæåªäº) * [11.Springä¸çåä¾beanç线ç¨å®å ¨é®é¢äºè§£åï¼](#11springä¸çåä¾beanç线ç¨å®å ¨é®é¢äºè§£å) * [12.Springä¸çbeançå½å¨æäºè§£è¿åï¼](#12springä¸çbeançå½å¨æäºè§£è¿å) * [13.Spring MVCçå·¥ä½åçäºè§£åï¼](#13spring-mvcçå·¥ä½åçäºè§£å) * [14.Springæ¡æ¶ä¸ç¨å°äºåªäºè®¾è®¡æ¨¡å¼ï¼](#14springæ¡æ¶ä¸ç¨å°äºåªäºè®¾è®¡æ¨¡å¼) * [15.@Componentå@Beançåºå«æ¯ä»ä¹ï¼](#15componentåbeançåºå«æ¯ä»ä¹) * [16.å°ä¸ä¸ªç±»å£°æä¸ºSpringçbeançæ³¨è§£æåªäºï¼](#16å°ä¸ä¸ªç±»å£°æä¸ºspringçbeançæ³¨è§£æåªäº) * [17.Springäºå¡ç®¡ççæ¹å¼æå ç§ï¼](#17springäºå¡ç®¡ççæ¹å¼æå ç§) * [18.Springäºå¡ä¸çéç¦»çº§å«æåªå ç§ï¼](#18springäºå¡ä¸çéç¦»çº§å«æåªå ç§) * [19.Springäºå¡ä¸æåªå ç§äºå¡ä¼ æè¡ä¸ºï¼](#19springäºå¡ä¸æåªå ç§äºå¡ä¼ æè¡ä¸º) * [20.Spring äºå¡åºå±åç](#20spring-äºå¡åºå±åç) * [21.BeanFactoryåApplicationContextæä»ä¹åºå«ï¼](#21beanfactoryåapplicationcontextæä»ä¹åºå«) * [22.Resource æ¯å¦ä½è¢«æ¥æ¾ãå è½½çï¼](#22resource-æ¯å¦ä½è¢«æ¥æ¾å è½½ç) * [23.è§£éèªå¨è£ é çåç§æ¨¡å¼ï¼](#23è§£éèªå¨è£ é çåç§æ¨¡å¼) * [24.æåªäºä¸åç±»åçIOC(ä¾èµæ³¨å ¥)ï¼](#24æåªäºä¸åç±»åçiocä¾èµæ³¨å ¥) * [25.Spring AOP å®ç°åç](#25spring-aop-å®ç°åç) * [26.ApplicationContexté常çå®ç°æ¯ä»ä¹?](#26applicationcontexté常çå®ç°æ¯ä»ä¹) * [27. Bean å·¥åå Application contexts æä»ä¹åºå«ï¼](#27-bean-å·¥åå-application-contexts-æä»ä¹åºå«) * [åèèµæ](#åèèµæ) #### 1.ä»ä¹æ¯spring? Spring æ¯ä¸ªjavaä¼ä¸çº§åºç¨ç弿ºå¼åæ¡æ¶ãSpring主è¦ç¨æ¥å¼åJavaåºç¨ï¼ä½æ¯æäºæ©å±æ¯é对æå»ºJ2EEå¹³å°çwebåºç¨ãSpring æ¡æ¶ç®æ æ¯ç®åJavaä¼ä¸çº§åºç¨å¼åï¼å¹¶éè¿POJO为åºç¡çç¼ç¨æ¨¡åä¿è¿è¯å¥½çç¼ç¨ä¹ æ¯ã #### 2.使ç¨Springæ¡æ¶ç好夿¯ä»ä¹ï¼ - è½»éï¼Spring æ¯è½»éçï¼åºæ¬ççæ¬å¤§çº¦2MBã - æ§å¶å转ï¼Springéè¿æ§å¶å转å®ç°äºæ¾æ£è¦åï¼å¯¹è±¡ä»¬ç»åºå®ä»¬çä¾èµï¼è䏿¯åå»ºææ¥æ¾ä¾èµç对象们ã - é¢ååé¢çç¼ç¨(AOP)ï¼Springæ¯æé¢ååé¢çç¼ç¨ï¼å¹¶ä¸æåºç¨ä¸å¡é»è¾åç³»ç»æå¡åå¼ã - 容å¨ï¼Spring å å«å¹¶ç®¡çåºç¨ä¸å¯¹è±¡ççå½å¨æåé ç½®ã - MVCæ¡æ¶ï¼SpringçWEBæ¡æ¶æ¯ä¸ªç²¾å¿è®¾è®¡çæ¡æ¶ï¼æ¯Webæ¡æ¶çä¸ä¸ªå¾å¥½çæ¿ä»£åã - äºå¡ç®¡çï¼Spring æä¾ä¸ä¸ªæç»çäºå¡ç®¡çæ¥å£ï¼å¯ä»¥æ©å±å°ä¸è³æ¬å°äºå¡ä¸è³å ¨å±äºå¡ï¼JTAï¼ã - å¼å¸¸å¤çï¼Spring æä¾æ¹ä¾¿çAPIæå ·ä½ææ¯ç¸å ³çå¼å¸¸ï¼æ¯å¦ç±JDBCï¼Hibernate or JDOæåºçï¼è½¬å为ä¸è´çunchecked å¼å¸¸ã #### 3.Springç±åªäºæ¨¡åç»æ? 以䏿¯Spring æ¡æ¶çåºæ¬æ¨¡åï¼ - Core module - Bean module - Context module - Expression Language module - JDBC module - ORM module - OXM module - Java Messaging Service(JMS) module - Transaction module - Web module - Web-Servlet module - Web-Struts module - Web-Portlet module #### 4.Springæ¯æä¹è§£å³å¾ªç¯ä¾èµçï¼ æ´ä¸ªIOC容å¨è§£å³å¾ªç¯ä¾èµï¼ç¨å°çå 个éè¦æåï¼ singletonObjectsï¼ä¸çº§ç¼åï¼åæ¾å®å ¨åå§å好çBeançéåï¼ä»è¿ä¸ªéåä¸ååºæ¥çBeanå¯ä»¥ç«é©¬è¿å earlySingletonObjectsï¼äºçº§ç¼åï¼åæ¾åå»ºå¥½ä½æ²¡æåå§å屿§çBeançéåï¼å®ç¨æ¥è§£å³å¾ªç¯ä¾èµ singletonFactoriesï¼ä¸çº§ç¼åï¼åæ¾åå®ä¾Beanå·¥åçéå singletonsCurrentlyInCreationï¼åæ¾æ£å¨è¢«å建çBeançéå IOC容å¨è§£å³å¾ªç¯ä¾èµçæè·¯ï¼ 1. åå§åBeanä¹åï¼å°è¿ä¸ªBeanNameæ¾å ¥ä¸çº§ç¼å 2. å建Beanå°åå¤å建çBeanæ¾å ¥ singletonsCurrentlyInCreation ï¼æ£å¨å建çBeanï¼ 3. createNewInstance æ¹æ³æ§è¡å®åæ§è¡ addSingletonFactoryï¼å°è¿ä¸ªå®ä¾å使²¡æå±æ§èµå¼çBeanæ¾å ¥äºçº§ç¼åï¼å¹¶ä»ä¸çº§ç¼åä¸ç§»é¤ 4. 屿§èµå¼&èªå¨æ³¨å ¥æ¶ï¼å¼åå ³èå建 5. å ³èå建æ¶ï¼æ£æ¥âæ£å¨è¢«å建çBeanâ䏿¯å¦æå³å°æ³¨å ¥çBeanã妿æï¼æ£æ¥äºçº§ç¼å䏿¯å¦æå½ååå»ºå¥½ä½æ²¡æèµå¼åå§åçBeanãå¦ææ²¡æï¼æ£æ¥ä¸çº§ç¼å䏿¯å¦ææ£å¨å建ä¸çBeanãè³æ¤ä¸è¬ä¼æï¼å°è¿ä¸ªBeanæ¾å ¥äºçº§ç¼åï¼å¹¶ä»ä¸çº§ç¼åä¸ç§»é¤ 6. ä¹åBean被æåæ³¨å ¥ï¼æåæ§è¡ addSingletonï¼å°è¿ä¸ªå®å ¨å建好çBeanæ¾å ¥ä¸çº§ç¼åï¼ä»äºçº§ç¼ååä¸çº§ç¼åç§»é¤ï¼å¹¶è®°å½å·²ç»å建äºçåå®ä¾Bean #### 5.Spring Bootæå¨è£ é æåªå ç§æ¹å¼ï¼ 1. ä½¿ç¨æ¨¡å¼æ³¨è§£ @Component çï¼Spring2.5+ï¼ 2. 使ç¨é 置类 @Configuration ä¸ @Bean ï¼Spring3.0+ï¼ 3. ä½¿ç¨æ¨¡åè£ é @EnableXXX ä¸ @Import ï¼Spring3.1+ï¼ å ¶ä¸ä½¿ç¨ @Component åè¡ç注解å¾å¸¸è§ï¼å±å¼åä¸å¸¸ç¨çå¥è·¯ï¼ä¸åèµè¿°ã 使¨¡å¼æ³¨è§£åªè½å¨èªå·±ç¼åç代ç 䏿 æ³¨ï¼æ æ³è£ é jarå ä¸çç»ä»¶ã为æ¤å¯ä»¥ä½¿ç¨ @Configuration ä¸ @Beanï¼æå¨è£ é ç»ä»¶ï¼å¦ä¸ä¸ç¯ç @Configuration 示ä¾ï¼ãä½è¿ç§æ¹å¼ä¸æ¦æ³¨åè¿å¤ï¼ä¼å¯¼è´ç¼ç ææ¬é«ï¼ç»´æ¤ä¸çµæ´»çé®é¢ã SpringFramework æä¾äºæ¨¡åè£ é åè½ï¼éè¿ç»é ç½®ç±»æ æ³¨ @EnableXXX 注解ï¼å卿³¨è§£ä¸æ 注 @Import 注解ï¼å³å¯å®æç»ä»¶è£ é çææã #### 6.Spring Bootèªå¨é ç½®åç 详è§ï¼https://blog.csdn.net/Dongguabai/article/details/80865599 #### 7.è°è°èªå·±å¯¹äºSpring IOCççè§£ IOCï¼Inversion Of Controllï¼æ§å¶åè½¬ï¼æ¯ä¸ç§è®¾è®¡ææ³ï¼å°±æ¯å°åæ¬å¨ç¨åºä¸æå¨åå»ºå¯¹è±¡çæ§å¶æï¼äº¤ç±ç»Springæ¡æ¶æ¥ç®¡çãIOCå¨å ¶ä»è¯è¨ä¸ä¹æåºç¨ï¼å¹¶éSpringç¹æãIOC容卿¯Springç¨æ¥å®ç°IOCçè½½ä½ï¼IOC容å¨å®é ä¸å°±æ¯ä¸ä¸ªMap(key, value)ï¼Mapä¸åæ¾çæ¯åç§å¯¹è±¡ã å°å¯¹è±¡ä¹é´çç¸äºä¾èµå ³ç³»äº¤ç»IOC容卿¥ç®¡çï¼å¹¶ç±IOC容å¨å®æå¯¹è±¡çæ³¨å ¥ãè¿æ ·å¯ä»¥å¾å¤§ç¨åº¦ä¸ç®ååºç¨çå¼åï¼æåºç¨ä»å¤æçä¾èµå ³ç³»ä¸è§£æ¾åºæ¥ãIOC容å¨å°±åæ¯ä¸ä¸ªå·¥å䏿 ·ï¼å½æä»¬éè¦å建ä¸ä¸ªå¯¹è±¡çæ¶åï¼åªéè¦é 置好é ç½®æä»¶/注解å³å¯ï¼å®å ¨ä¸ç¨èè对象æ¯å¦ä½è¢«åå»ºåºæ¥çãå¨å®é 项ç®ä¸ä¸ä¸ªServiceç±»å¯è½ç±å ç¾çè³ä¸å个类ä½ä¸ºå®çåºå±ï¼å妿们éè¦å®ä¾åè¿ä¸ªServiceï¼å¯è½è¦æ¯æ¬¡é½ææ¸ æ¥è¿ä¸ªServiceææåºå±ç±»çæé 彿°ï¼è¿å¯è½ä¼æäººé¼ç¯ã妿å©ç¨IOCçè¯ï¼ä½ åªéè¦é 置好ï¼ç¶åå¨éè¦çå°æ¹å¼ç¨å°±è¡äºï¼å¤§å¤§å¢å äºé¡¹ç®çå¯ç»´æ¤æ§ä¸éä½äºå¼åé¾åº¦ã Springæ¶ä»£æä»¬ä¸è¬éè¿XMLæä»¶æ¥é ç½®Beanï¼åæ¥å¼å人åè§å¾ç¨XMLæä»¶æ¥é ç½®ä¸å¤ªå¥½ï¼äºæ¯Sprng Boot注解é ç½®å°±æ ¢æ ¢å¼å§æµè¡èµ·æ¥ã #### 8.è°è°èªå·±å¯¹äºSpring AOPççè§£ AOPï¼Aspect-Oriented Programmingï¼é¢ååé¢ç¼ç¨ï¼è½å¤å°é£äºä¸ä¸å¡æ å ³ï¼å´ä¸ºä¸å¡æ¨¡åæå ±åè°ç¨çé»è¾æè´£ä»»ï¼ä¾å¦äºå¡å¤çãæ¥å¿ç®¡çãæéæ§å¶çï¼å°è£ èµ·æ¥ï¼ä¾¿äºåå°ç³»ç»çéå¤ä»£ç ï¼é使¨¡åé´çè¦å度ï¼å¹¶æå©äºæªæ¥ç坿©å±æ§åå¯ç»´æ¤æ§ã Spring AOPæ¯åºäºå¨æä»£ççï¼å¦æè¦ä»£çç对象å®ç°äºæä¸ªæ¥å£ï¼é£ä¹Spring AOPå°±ä¼ä½¿ç¨JDK卿代çå»å建代ç对象ï¼èå¯¹äºæ²¡æå®ç°æ¥å£ç对象ï¼å°±æ æ³ä½¿ç¨JDK卿代çï¼è½¬è使ç¨CGlib卿代ççæä¸ä¸ªè¢«ä»£ç对象çåç±»æ¥ä½ä¸ºä»£çã å½ç¶ä¹å¯ä»¥ä½¿ç¨AspectJï¼Spring AOPä¸å·²ç»éæäºAspectJï¼AspectJåºè¯¥ç®å¾ä¸æ¯Javaçæç³»ç»ä¸æå®æ´çAOPæ¡æ¶äºã使ç¨AOPä¹åæä»¬å¯ä»¥æä¸äºéç¨åè½æ½è±¡åºæ¥ï¼å¨éè¦ç¨å°çå°æ¹ç´æ¥ä½¿ç¨å³å¯ï¼è¿æ ·å¯ä»¥å¤§å¤§ç®å代ç éãæä»¬éè¦å¢å æ°åè½ä¹æ¹ä¾¿ï¼æé«äºç³»ç»çæ©å±æ§ãæ¥å¿åè½ãäºå¡ç®¡çåæé管ççåºæ¯é½ç¨å°äºAOPã #### 9.Spring AOPåAspectJ AOPæä»ä¹åºå«ï¼ Spring AOPæ¯å±äºè¿è¡æ¶å¢å¼ºï¼èAspectJæ¯ç¼è¯æ¶å¢å¼ºãSpring AOPåºäºä»£çï¼Proxyingï¼ï¼èAspectJåºäºåèç æä½ï¼Bytecode Manipulationï¼ã Spring AOPå·²ç»éæäºAspectJï¼AspectJåºè¯¥ç®å¾ä¸æ¯Javaçæç³»ç»ä¸æå®æ´çAOPæ¡æ¶äºãAspectJç¸æ¯äºSpring AOPåè½æ´å 强大ï¼ä½æ¯Spring AOPç¸å¯¹æ¥è¯´æ´ç®åã 妿æä»¬çå颿¯è¾å°ï¼é£ä¹ä¸¤è æ§è½å·®å¼ä¸å¤§ã使¯ï¼å½åé¢å¤ªå¤çè¯ï¼æå¥½éæ©AspectJï¼å®æ¯SpringAOPå¿«å¾å¤ã #### 10.Springä¸çbeançä½ç¨åæåªäºï¼ 1.singletonï¼å¯ä¸beanå®ä¾ï¼Springä¸çbeané»è®¤é½æ¯åä¾çã 2.prototypeï¼æ¯æ¬¡è¯·æ±é½ä¼å建ä¸ä¸ªæ°çbeanå®ä¾ã 3.requestï¼æ¯ä¸æ¬¡HTTP请æ±é½ä¼äº§çä¸ä¸ªæ°çbeanï¼è¯¥beanä» å¨å½åHTTP requestå ææã 4.sessionï¼æ¯ä¸æ¬¡HTTP请æ±é½ä¼äº§çä¸ä¸ªæ°çbeanï¼è¯¥beanä» å¨å½åHTTP sessionå ææã 5.global-sessionï¼å ¨å±sessionä½ç¨åï¼ä» ä» å¨åºäºPortletçWebåºç¨ä¸æææä¹ï¼Spring5ä¸å·²ç»æ²¡æäºãPortletæ¯è½å¤çæè¯ä¹ä»£ç ï¼ä¾å¦HTMLï¼ç段çå°åJava Webæä»¶ãå®ä»¬åºäºPortlet容å¨ï¼å¯ä»¥åServlet䏿 ·å¤çHTTP请æ±ã使¯ä¸Servletä¸åï¼æ¯ä¸ªPortlet齿ä¸åçä¼è¯ã #### 11.Springä¸çåä¾beanç线ç¨å®å ¨é®é¢äºè§£åï¼ å¤§é¨åæ¶åæä»¬å¹¶æ²¡æå¨ç³»ç»ä¸ä½¿ç¨å¤çº¿ç¨ï¼æä»¥å¾å°æäººä¼å ³æ³¨è¿ä¸ªé®é¢ãåä¾beanåå¨çº¿ç¨é®é¢ï¼ä¸»è¦æ¯å 为å½å¤ä¸ªçº¿ç¨æä½åä¸ä¸ªå¯¹è±¡çæ¶åï¼å¯¹è¿ä¸ªå¯¹è±¡çééææååéçåæä½ä¼åå¨çº¿ç¨å®å ¨é®é¢ã æä¸¤ç§å¸¸è§çè§£å³æ¹æ¡ï¼ 1.å¨bean对象ä¸å°½éé¿å å®ä¹å¯åçæååéï¼ä¸å¤ªç°å®ï¼ã 2.å¨ç±»ä¸å®ä¹ä¸ä¸ªThreadLocalæååéï¼å°éè¦çå¯åæååéä¿åå¨ThreadLocalä¸ï¼æ¨èçä¸ç§æ¹å¼ï¼ã #### 12.Springä¸çbeançå½å¨æäºè§£è¿åï¼ 1.Bean容卿¾å°é ç½®æä»¶ä¸Spring Beançå®ä¹ã 2.Bean容å¨å©ç¨Java Reflection APIå建ä¸ä¸ªBeançå®ä¾ã 3.妿æ¶åå°ä¸äºå±æ§å¼ï¼å©ç¨set()æ¹æ³è®¾ç½®ä¸äºå±æ§å¼ã 4.妿Beanå®ç°äºBeanNameAwareæ¥å£ï¼è°ç¨setBeanName()æ¹æ³ï¼ä¼ å ¥Beançååã 5.妿Beanå®ç°äºBeanClassLoaderAwareæ¥å£ï¼è°ç¨setBeanClassLoader()æ¹æ³ï¼ä¼ å ¥ClassLoader对象çå®ä¾ã 6.妿Beanå®ç°äºBeanFactoryAwareæ¥å£ï¼è°ç¨setBeanClassFacotory()æ¹æ³ï¼ä¼ å ¥ClassLoader对象çå®ä¾ã 7.ä¸ä¸é¢ç类似ï¼å¦æå®ç°äºå ¶ä»*Awareæ¥å£ï¼å°±è°ç¨ç¸åºçæ¹æ³ã 8.妿æåå è½½è¿ä¸ªBeançSpring容å¨ç¸å ³çBeanPostProcessorå¯¹è±¡ï¼æ§è¡postProcessBeforeInitialization()æ¹æ³ã 9.妿Beanå®ç°äºInitializingBeanæ¥å£ï¼æ§è¡afeterPropertiesSet()æ¹æ³ã 10.妿Beanå¨é ç½®æä»¶ä¸çå®ä¹å å«init-method屿§ï¼æ§è¡æå®çæ¹æ³ã 11.妿æåå è½½è¿ä¸ªBeançSpring容å¨ç¸å ³çBeanPostProcesså¯¹è±¡ï¼æ§è¡postProcessAfterInitialization()æ¹æ³ã 12.å½è¦éæ¯Beançæ¶åï¼å¦æBeanå®ç°äºDisposableBeanæ¥å£ï¼æ§è¡destroy()æ¹æ³ã 13.å½è¦éæ¯Beançæ¶åï¼å¦æBeanå¨é ç½®æä»¶ä¸çå®ä¹å å«destroy-method屿§ï¼æ§è¡æå®çæ¹æ³ã #### 13.Spring MVCçå·¥ä½åçäºè§£åï¼ 1.客æ·ç«¯ï¼æµè§å¨ï¼åé请æ±ï¼ç´æ¥è¯·æ±å°DispatcherServletã 2.DispatcherServletæ ¹æ®è¯·æ±ä¿¡æ¯è°ç¨HandlerMappingï¼è§£æè¯·æ±å¯¹åºçHandlerã 3.è§£æå°å¯¹åºçHandlerï¼ä¹å°±æ¯æä»¬å¹³å¸¸è¯´çControlleræ§å¶å¨ï¼ã 4.HandlerAdapter伿 ¹æ®Handleræ¥è°ç¨çæ£çå¤ç卿¥å¤ç请æ±åæ§è¡ç¸å¯¹åºçä¸å¡é»è¾ã 5.å¤çå¨å¤çå®ä¸å¡åï¼ä¼è¿åä¸ä¸ªModelAndView对象ï¼Modelæ¯è¿åçæ°æ®å¯¹è±¡ï¼Viewæ¯é»è¾ä¸çViewã 6.ViewResolver伿 ¹æ®é»è¾View廿¥æ¾å®é çViewã 7.DispatcherServletæè¿åçModelä¼ ç»Viewï¼è§å¾æ¸²æï¼ã 8.æViewè¿åç»è¯·æ±è ï¼æµè§å¨ï¼ã #### 14.Springæ¡æ¶ä¸ç¨å°äºåªäºè®¾è®¡æ¨¡å¼ï¼ 1.å·¥å设计模å¼ï¼Spring使ç¨å·¥å模å¼éè¿BeanFactoryåApplicationContextå建bean对象ã 2.代ç设计模å¼ï¼Spring AOPåè½çå®ç°ã 3.åä¾è®¾è®¡æ¨¡å¼ï¼Springä¸çbeané»è®¤é½æ¯åä¾çã 4.æ¨¡æ¿æ¹æ³æ¨¡å¼ï¼Springä¸çjdbcTemplateãhibernateTemplateç以Templateç»å°¾çå¯¹æ°æ®åºæä½çç±»ï¼å®ä»¬å°±ä½¿ç¨å°äºæ¨¡æ¿æ¨¡å¼ã 5.å è£ å¨è®¾è®¡æ¨¡å¼ï¼æä»¬ç项ç®éè¦è¿æ¥å¤ä¸ªæ°æ®åºï¼èä¸ä¸åç客æ·å¨æ¯æ¬¡è®¿é®ä¸æ ¹æ®éè¦ä¼å»è®¿é®ä¸åçæ°æ®åºãè¿ç§æ¨¡å¼è®©æä»¬å¯ä»¥æ ¹æ®å®¢æ·çéæ±è½å¤å¨æåæ¢ä¸åçæ°æ®æºã 6.è§å¯è 模å¼ï¼Springäºä»¶é©±å¨æ¨¡åå°±æ¯è§å¯è 模å¼å¾ç»å ¸çä¸ä¸ªåºç¨ã 7.éé 卿¨¡å¼ï¼Spring AOPçå¢å¼ºæéç¥ï¼Adviceï¼ä½¿ç¨å°äºéé 卿¨¡å¼ãSpring MVCä¸ä¹æ¯ç¨å°äºéé 卿¨¡å¼éé Controllerã #### 15.@Componentå@Beançåºå«æ¯ä»ä¹ï¼ 1.ä½ç¨å¯¹è±¡ä¸åã@Component注解ä½ç¨äºç±»ï¼è@Bean注解ä½ç¨äºæ¹æ³ã 2.@Component注解é常æ¯éè¿ç±»è·¯å¾æ«ææ¥èªå¨ä¾¦æµä»¥åèªå¨è£ é å°Spring容å¨ä¸ï¼æä»¬å¯ä»¥ä½¿ç¨@ComponentScan注解å®ä¹è¦æ«æçè·¯å¾ï¼ã@Bean注解é常æ¯å¨æ æè¯¥æ³¨è§£çæ¹æ³ä¸å®ä¹äº§çè¿ä¸ªbeanï¼åè¯Springè¿æ¯æä¸ªç±»çå®ä¾ï¼å½æéè¦ç¨å®çæ¶åè¿ç»æã 3.@Bean注解æ¯@Component注解çèªå®ä¹æ§æ´å¼ºï¼èä¸å¾å¤å°æ¹åªè½éè¿@Beanæ³¨è§£æ¥æ³¨åbeanãæ¯å¦å½å¼ç¨ç¬¬ä¸æ¹åºçç±»éè¦è£ é å°Spring容å¨çæ¶åï¼å°±åªè½éè¿@Bean注解æ¥å®ç°ã #### 16.å°ä¸ä¸ªç±»å£°æä¸ºSpringçbeançæ³¨è§£æåªäºï¼ æä»¬ä¸è¬ä½¿ç¨@Autowired注解å»èªå¨è£ é beanãèæ³è¦æä¸ä¸ªç±»æ è¯ä¸ºå¯ä»¥ç¨@Autowired注解èªå¨è£ é çbeanï¼å¯ä»¥éç¨ä»¥ä¸ç注解å®ç°ï¼ 1.@Component注解ãéç¨ç注解ï¼å¯æ 注任æç±»ä¸ºSpringç»ä»¶ã妿ä¸ä¸ªBeanä¸ç¥éå±äºåªä¸ä¸ªå±ï¼å¯ä»¥ä½¿ç¨@Componentæ³¨è§£æ æ³¨ã 2.@Repository注解ãå¯¹åºæä¹ å±ï¼å³Daoå±ï¼ä¸»è¦ç¨äºæ°æ®åºç¸å ³æä½ã 3.@Service注解ãå¯¹åºæå¡å±ï¼å³Serviceå±ï¼ä¸»è¦æ¶åä¸äºå¤æçé»è¾ï¼éè¦ç¨å°Daoå±ï¼æ³¨å ¥ï¼ã 4.@Controller注解ã对åºSpring MVCçæ§å¶å±ï¼å³Controllerå±ï¼ä¸»è¦ç¨äºæ¥åç¨æ·è¯·æ±å¹¶è°ç¨Serviceå±çæ¹æ³è¿åæ°æ®ç»å端页é¢ã #### 17.Springäºå¡ç®¡ççæ¹å¼æå ç§ï¼ 1.ç¼ç¨å¼äºå¡ï¼å¨ä»£ç ä¸ç¡¬ç¼ç ï¼ä¸æ¨è使ç¨ï¼ã 2.声æå¼äºå¡ï¼å¨é ç½®æä»¶ä¸é ç½®ï¼æ¨è使ç¨ï¼ï¼å为åºäºXMLç声æå¼äºå¡ååºäºæ³¨è§£ç声æå¼äºå¡ã #### 18.Springäºå¡ä¸çéç¦»çº§å«æåªå ç§ï¼ å¨TransactionDefinitionæ¥å£ä¸å®ä¹äºäºä¸ªè¡¨ç¤ºé离级å«ç常éï¼ ISOLATION_DEFAULTï¼ä½¿ç¨åç«¯æ°æ®åºé»è®¤çé离级å«ï¼Mysqlé»è®¤éç¨çREPEATABLE_READé离级å«ï¼Oracleé»è®¤éç¨çREAD_COMMITTEDé离级å«ã ISOLATION_READ_UNCOMMITTEDï¼æä½çé离级å«ï¼å 许读åå°æªæäº¤çæ°æ®åæ´ï¼å¯è½ä¼å¯¼è´è读ã幻读æä¸å¯éå¤è¯»ã ISOLATION_READ_COMMITTEDï¼å 许读åå¹¶åäºå¡å·²ç»æäº¤çæ°æ®ï¼å¯ä»¥é»æ¢è读ï¼ä½æ¯å¹»è¯»æä¸å¯éå¤è¯»ä»æå¯è½åç ISOLATION_REPEATABLE_READï¼å¯¹åä¸å段ç夿¬¡è¯»åç»æé½æ¯ä¸è´çï¼é¤éæ°æ®æ¯è¢«æ¬èº«äºå¡èªå·±æä¿®æ¹ï¼å¯ä»¥é»æ¢è读åä¸å¯éå¤è¯»ï¼ä½å¹»è¯»ä»æå¯è½åçã ISOLATION_SERIALIZABLEï¼æé«çé离级å«ï¼å®å ¨æä»ACIDçé离级å«ãææçäºå¡ä¾æ¬¡é个æ§è¡ï¼è¿æ ·äºå¡ä¹é´å°±å®å ¨ä¸å¯è½äº§çå¹²æ°ï¼ä¹å°±æ¯è¯´ï¼è¯¥çº§å«å¯ä»¥é²æ¢è读ãä¸å¯éå¤è¯»ä»¥å幻读ã使¯è¿å°ä¸¥éå½±åç¨åºçæ§è½ãé常æ åµä¸ä¹ä¸ä¼ç¨å°è¯¥çº§å«ã #### 19.Springäºå¡ä¸æåªå ç§äºå¡ä¼ æè¡ä¸ºï¼ å¨TransactionDefinitionæ¥å£ä¸å®ä¹äºå «ä¸ªè¡¨ç¤ºäºå¡ä¼ æè¡ä¸ºç常éã æ¯æå½åäºå¡çæ åµï¼ PROPAGATION_REQUIREDï¼å¦æå½ååå¨äºå¡ï¼åå å ¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼åå建ä¸ä¸ªæ°çäºå¡ã PROPAGATION_SUPPORTSï¼ å¦æå½ååå¨äºå¡ï¼åå å ¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼å以éäºå¡çæ¹å¼ç»§ç»è¿è¡ã PROPAGATION_MANDATORYï¼ å¦æå½ååå¨äºå¡ï¼åå å ¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼åæåºå¼å¸¸ãï¼mandatoryï¼å¼ºå¶æ§ï¼ã 䏿¯æå½åäºå¡çæ åµï¼ PROPAGATION_REQUIRES_NEWï¼ å建ä¸ä¸ªæ°çäºå¡ï¼å¦æå½ååå¨äºå¡ï¼åæå½åäºå¡æèµ·ã PROPAGATION_NOT_SUPPORTEDï¼ ä»¥éäºå¡æ¹å¼è¿è¡ï¼å¦æå½ååå¨äºå¡ï¼åæå½åäºå¡æèµ·ã PROPAGATION_NEVERï¼ ä»¥éäºå¡æ¹å¼è¿è¡ï¼å¦æå½ååå¨äºå¡ï¼åæåºå¼å¸¸ã å ¶ä»æ åµï¼ PROPAGATION_NESTEDï¼ å¦æå½ååå¨äºå¡ï¼åå建ä¸ä¸ªäºå¡ä½ä¸ºå½åäºå¡çåµå¥äºå¡æ¥è¿è¡ï¼å¦æå½å没æäºå¡ï¼å该åå¼çä»·äºPROPAGATION_REQUIREDã #### 20.Spring äºå¡åºå±åç ååå¤çåå ââIoC ç±äºspringè§£å³çé®é¢æ¯å¯¹åä¸ªæ°æ®åºè¿è¡å±é¨äºå¡å¤ççï¼å ·ä½çå®ç°é¦å ç¨springä¸çIoCååäºäºå¡å¤çåå ãå¹¶ä¸å°å¯¹äºå¡çåç§é ç½®æ¾å°äºioc容å¨ä¸ï¼è®¾ç½®äºå¡ç®¡çå¨ï¼è®¾ç½®äºå¡çä¼ æç¹æ§åé离æºå¶ï¼ã AOPæ¦æªéè¦è¿è¡äºå¡å¤ççç±» Springäºå¡å¤çæ¨¡åæ¯éè¿AOPåè½æ¥å®ç°å£°æå¼äºå¡å¤ççï¼å ·ä½æä½ï¼æ¯å¦äºå¡å®è¡çé ç½®å读åï¼äºå¡å¯¹è±¡çæ½è±¡ï¼ï¼ç¨TransactionProxyFactoryBeanæ¥å£æ¥ä½¿ç¨AOPåè½ï¼çæproxy代ç对象ï¼éè¿TransactionInterceptorå®æå¯¹ä»£çæ¹æ³çæ¦æªï¼å°äºå¡å¤ççåè½ç¼ç»å°æ¦æªçæ¹æ³ä¸ã读åioc容å¨äºå¡é ç½®å±æ§ï¼è½¬å为springäºå¡å¤çéè¦çå 鍿°æ®ç»æï¼TransactionAttributeSourceAdvisorï¼ï¼è½¬å为TransactionAttributeè¡¨ç¤ºçæ°æ®å¯¹è±¡ã 对äºå¡å¤çå®ç°ï¼äºå¡ççæãæäº¤ãåæ»ãæèµ·ï¼ springå§æç»å ·ä½çäºå¡å¤çå¨å®ç°ãå®ç°äºä¸ä¸ªæ½è±¡åéé ãéé çå ·ä½äºå¡å¤çå¨ï¼DataSourceæ°æ®æºæ¯æãhibernateæ°æ®æºäºå¡å¤çæ¯æãJDOæ°æ®æºäºå¡å¤çæ¯æï¼JPAãJTAæ°æ®æºäºå¡å¤çæ¯æãè¿äºæ¯æé½æ¯éè¿è®¾è®¡PlatformTransactionManagerãAbstractPlatforTransactionä¸ç³»åäºå¡å¤ççæ¯æã ä¸ºå¸¸ç¨æ°æ®æºæ¯ææä¾äºä¸ç³»åçTransactionManagerã æ»ç» PlatformTransactionManagerå®ç°äºTransactionInterceptionæ¥å£ï¼è®©å ¶ä¸TransactionProxyFactoryBeanç»åèµ·æ¥ï¼å½¢æä¸ä¸ªSpring声æå¼äºå¡å¤çç设计ä½ç³»ã #### 21.BeanFactoryåApplicationContextæä»ä¹åºå«ï¼ ApplicationContextæä¾äºä¸ç§è§£å³ææ¡£ä¿¡æ¯çæ¹æ³ï¼ä¸ç§å è½½æä»¶èµæºçæ¹å¼(å¦å¾ç)ï¼ä»ä»¬å¯ä»¥åçå¬ä»ä»¬çbeansåéæ¶æ¯ãå¦å¤ï¼å®¹å¨æè 容å¨ä¸beansçæä½ï¼è¿äºå¿ 须以beanå·¥åçç¼ç¨æ¹å¼å¤ççæä½å¯ä»¥å¨åºç¨ä¸ä¸æä¸ä»¥å£°æçæ¹å¼å¤çãåºç¨ä¸ä¸æå®ç°äºMessageSourceï¼è¯¥æ¥å£ç¨äºè·åæ¬å°æ¶æ¯ï¼å®é çå®ç°æ¯å¯éçã ç¸åç¹ï¼ä¸¤è 齿¯éè¿xmlé ç½®æä»¶å è½½beanï¼ApplicationContextåBeanFacotryç¸æ¯ï¼æä¾äºæ´å¤çæ©å±åè½ã ä¸åç¹ï¼BeanFactoryæ¯å»¶è¿å è½½ï¼å¦æBeançæä¸ä¸ªå±æ§æ²¡ææ³¨å ¥ï¼BeanFacotryå è½½åï¼ç´è³ç¬¬ä¸æ¬¡ä½¿ç¨è°ç¨getBeanæ¹æ³æä¼æåºå¼å¸¸ï¼èApplicationContextåå¨åå§åèªèº«æ¯æ£éªï¼è¿æ ·æå©äºæ£æ¥æä¾èµå±æ§æ¯å¦æ³¨å ¥ï¼æä»¥é常æ åµä¸æä»¬éæ©ä½¿ç¨ApplicationContextã #### 22.Resource æ¯å¦ä½è¢«æ¥æ¾ãå è½½çï¼ Resource æ¥å£æ¯ Spring èµæºè®¿é®çç¥çæ½è±¡ï¼å®æ¬èº«å¹¶ä¸æä¾ä»»ä½èµæºè®¿é®å®ç°ï¼å ·ä½çèµæºè®¿é®ç±è¯¥æ¥å£çå®ç°ç±»å®æââæ¯ä¸ªå®ç°ç±»ä»£è¡¨ä¸ç§èµæºè®¿é®çç¥ã Spring 为 Resource æ¥å£æä¾äºå¦ä¸å®ç°ç±»ï¼ UrlResourceï¼è®¿é®ç½ç»èµæºçå®ç°ç±»ãClassPathResourceï¼è®¿é®ç±»å 载路å¾éèµæºçå®ç°ç±»ãFileSystemResourceï¼è®¿é®æä»¶ç³»ç»éèµæºçå®ç°ç±»ãServletContextResourceï¼è®¿é®ç¸å¯¹äº ServletContext è·¯å¾éçèµæºçå®ç°ç±»ï¼InputStreamResourceï¼è®¿é®è¾å ¥æµèµæºçå®ç°ç±»ãByteArrayResourceï¼è®¿é®åèæ°ç»èµæºçå®ç°ç±»ã è¿äº Resource å®ç°ç±»ï¼é对ä¸åççåºå±èµæºï¼æä¾äºç¸åºçèµæºè®¿é®é»è¾ï¼å¹¶æä¾ä¾¿æ·çå è£ ï¼ä»¥å©äºå®¢æ·ç«¯ç¨åºçèµæºè®¿é®ã #### 23.è§£éèªå¨è£ é çåç§æ¨¡å¼ï¼ èªå¨è£ é æä¾äºç§ä¸åçæ¨¡å¼ä¾Spring容å¨ç¨æ¥èªå¨è£ é beansä¹é´çä¾èµæ³¨å ¥: noï¼é»è®¤çæ¹å¼æ¯ä¸è¿è¡èªå¨è£ é ï¼éè¿æå·¥è®¾ç½®ref 屿§æ¥è¿è¡è£ é beanã byNameï¼éè¿åæ°åèªå¨è£ é ï¼Spring容卿¥æ¾beansç屿§ï¼è¿äºbeanså¨XMLé ç½®æä»¶ä¸è¢«è®¾ç½®ä¸ºbyNameãä¹å容å¨è¯å¾å¹é ãè£ é å该beanç屿§å ·æç¸åååçbeanã byTypeï¼éè¿åæ°çæ°æ®ç±»åèªå¨èªå¨è£ é ï¼Spring容卿¥æ¾beansç屿§ï¼è¿äºbeanså¨XMLé ç½®æä»¶ä¸è¢«è®¾ç½®ä¸ºbyTypeãä¹å容å¨è¯å¾å¹é åè£ é å该beanç屿§ç±»å䏿 ·çbeanã妿æå¤ä¸ªbeanç¬¦åæ¡ä»¶ï¼åæåºé误ã constructorï¼è¿ä¸ªåbyType类似ï¼ä¸è¿æ¯åºç¨äºæé 彿°çåæ°ã妿å¨BeanFactoryä¸ä¸æ¯æ°å¥½æä¸ä¸ªbean䏿é 彿°åæ°ç¸åç±»åï¼åæåºä¸ä¸ªä¸¥éçé误ã autodetectï¼å¦ææé»è®¤çæé æ¹æ³ï¼éè¿ constructçæ¹å¼èªå¨è£ é ï¼å¦åä½¿ç¨ byTypeçæ¹å¼èªå¨è£ é ã #### 24.æåªäºä¸åç±»åçIOC(ä¾èµæ³¨å ¥)ï¼ æé å¨ä¾èµæ³¨å ¥ï¼æé å¨ä¾èµæ³¨å ¥å¨å®¹å¨è§¦åæé å¨çæ¶å宿ï¼è¯¥æé 卿ä¸ç³»åçåæ°ï¼æ¯ä¸ªåæ°ä»£è¡¨æ³¨å ¥ç对象ã Setteræ¹æ³ä¾èµæ³¨å ¥ï¼é¦å 容å¨ä¼è§¦åä¸ä¸ªæ åæé 彿°ææ åéæå·¥åæ¹æ³å®ä¾å对象ï¼ä¹å容å¨è°ç¨beanä¸çsetteræ¹æ³å®æSetteræ¹æ³ä¾èµæ³¨å ¥ã #### 25.Spring AOP å®ç°åç å®ç°AOPçææ¯ï¼ä¸»è¦åä¸ºä¸¤å¤§ç±»ï¼ ä¸æ¯éç¨å¨æä»£çææ¯ï¼å©ç¨æªåæ¶æ¯çæ¹å¼ï¼å¯¹è¯¥æ¶æ¯è¿è¡è£ 饰ï¼ä»¥å代åæå¯¹è±¡è¡ä¸ºçæ§è¡ï¼äºæ¯éç¨éæç»å ¥çæ¹å¼ï¼å¼å ¥ç¹å®çè¯æ³åå»ºâæ¹é¢âï¼ä»è使å¾ç¼è¯å¨å¯ä»¥å¨ç¼è¯æé´ç»å ¥æå ³âæ¹é¢âç代ç ã Spring AOP çå®ç°åçå ¶å®å¾ç®åï¼AOP æ¡æ¶è´è´£å¨æå°çæ AOP 代çç±»ï¼è¿ä¸ªä»£çç±»çæ¹æ³åç± Adviceååè°ç®æ å¯¹è±¡çæ¹æ³æç»æ, å¹¶å°è¯¥å¯¹è±¡å¯ä½ä¸ºç®æ 对象使ç¨ãAOP 代çå å«äºç®æ 对象çå ¨é¨æ¹æ³ï¼ä½AOP代çä¸çæ¹æ³ä¸ç®æ å¯¹è±¡çæ¹æ³åå¨å·®å¼ï¼AOPæ¹æ³å¨ç¹å®åå ¥ç¹æ·»å äºå¢å¼ºå¤çï¼å¹¶åè°äºç®æ å¯¹è±¡çæ¹æ³ã Spring AOP使ç¨å¨æä»£çææ¯å¨è¿è¡æç»å ¥å¢å¼ºä»£ç ã使ç¨ä¸¤ç§ä»£çæºå¶ï¼åºäºJDKç卿代çï¼JDKæ¬èº«åªæä¾æ¥å£ç代çï¼ååºäºCGlibç卿代çã (1) JDKç卿代ç JDKç卿代çä¸»è¦æ¶åjava.lang.reflectå ä¸ç两个类ï¼ProxyåInvocationHandlerãå ¶ä¸InvocationHandleråªæ¯ä¸ä¸ªæ¥å£ï¼å¯ä»¥éè¿å®ç°è¯¥æ¥å£å®ä¹æ¨ªåé»è¾ï¼å¹¶éè¿åå°æºå¶è°ç¨ç®æ ç±»ç代ç ï¼å¨æçå°æ¨ªåé»è¾ä¸ä¸å¡é»è¾ç»å¨ä¸èµ·ãèProxyå©ç¨InvocationHandler卿å建ä¸ä¸ªç¬¦åæä¸æ¥å£çå®ä¾ï¼çæç®æ ç±»ç代ç对象ã å ¶ä»£çå¯¹è±¡å¿ é¡»æ¯æä¸ªæ¥å£çå®ç°, 宿¯éè¿å¨è¿è¡æé´å建ä¸ä¸ªæ¥å£çå®ç°ç±»æ¥å®æå¯¹ç®æ 对象ç代ç.åªè½å®ç°æ¥å£çç±»çæä»£çï¼èä¸è½é对类ã (2)CGLib CGLibéç¨åºå±çåèç ææ¯ï¼ä¸ºä¸ä¸ªç±»å建åç±»ï¼å¹¶å¨åç±»ä¸éç¨æ¹æ³æ¦æªçææ¯æ¦æªææç¶ç±»çè°ç¨æ¹æ³ï¼å¹¶é¡ºå¿ç»å ¥æ¨ªåé»è¾.å®è¿è¡æé´çæç代ç对象æ¯ç®æ ç±»çæ©å±åç±».æä»¥æ æ³éç¥finalãprivateçæ¹æ³,å 为å®ä»¬ä¸è½è¢«è¦å.æ¯é对类å®ç°ä»£ç,ä¸»è¦æ¯ä¸ºæå®çç±»çæä¸ä¸ªåç±»ï¼è¦çå ¶ä¸æ¹æ³ã å¨springä¸é»è®¤ãåµä¸ä½¿ç¨JDK卿代çå®ç°AOP,妿proxy-target-class设置为trueæè 使ç¨äºä¼åçç¥é£ä¹ä¼ä½¿ç¨CGLIBæ¥åå»ºå¨æä»£ç.SpringãAOPå¨è¿ä¸¤ç§æ¹å¼çå®ç°ä¸åºæ¬ä¸æ ·ï¼ä»¥JDK代ç为ä¾ï¼ä¼ä½¿ç¨JdkDynamicAopProxyæ¥å建代çï¼å¨invoke()æ¹æ³é¦å éè¦ç»å ¥å°å½åç±»çå¢å¼ºå¨å°è£ å°æ¦æªå¨é¾ä¸ï¼ç¶åéå½çè°ç¨è¿äºæ¦æªå¨å®æåè½çç»å ¥ï¼æç»è¿å代ç对象ã #### 26.ApplicationContexté常çå®ç°æ¯ä»ä¹? - FileSystemXmlApplicationContext ï¼æ¤å®¹å¨ä»ä¸ä¸ªXMLæä»¶ä¸å è½½beansçå®ä¹ï¼XML Bean é ç½®æä»¶çå ¨è·¯å¾åå¿ é¡»æä¾ç»å®çæé 彿°ã - ClassPathXmlApplicationContextï¼æ¤å®¹å¨ä¹ä»ä¸ä¸ªXMLæä»¶ä¸å è½½beansçå®ä¹ï¼è¿éï¼ä½ éè¦æ£ç¡®è®¾ç½®classpathå 为è¿ä¸ªå®¹å¨å°å¨classpathéæ¾beané ç½®ã - WebXmlApplicationContextï¼æ¤å®¹å¨å è½½ä¸ä¸ªXMLæä»¶ï¼æ¤æä»¶å®ä¹äºä¸ä¸ªWEBåºç¨çææbeanã #### 27. Bean å·¥åå Application contexts æä»ä¹åºå«ï¼ Application contextsæä¾ä¸ç§æ¹æ³å¤çææ¬æ¶æ¯ï¼ä¸ä¸ªé常çåæ³æ¯å è½½æä»¶èµæºï¼æ¯å¦éåï¼ï¼å®ä»¬å¯ä»¥å注å为çå¬å¨çbeanåå¸äºä»¶ãå¦å¤ï¼å¨å®¹å¨æå®¹å¨å çå¯¹è±¡ä¸æ§è¡çé£äºä¸å¾ä¸ç±beanå·¥å以ç¨åºåæ¹å¼å¤ççæä½ï¼å¯ä»¥å¨Application contextsä¸ä»¥å£°æçæ¹å¼å¤çãApplication contextså®ç°äºMessageSourceæ¥å£ï¼è¯¥æ¥å£çå®ç°ä»¥å¯ææçæ¹å¼æä¾è·åæ¬å°åæ¶æ¯çæ¹æ³ã ### åèèµæ https://www.cnblogs.com/yanggb/p/11004887.html https://www.jianshu.com/p/a5d960c6f6dd https://ifeve.com/spring-interview-questions-and-answers/