springmvc源碼深度解析之?dāng)r截器過(guò)濾器視圖層分析_第1頁(yè)
springmvc源碼深度解析之?dāng)r截器過(guò)濾器視圖層分析_第2頁(yè)
springmvc源碼深度解析之?dāng)r截器過(guò)濾器視圖層分析_第3頁(yè)
springmvc源碼深度解析之?dāng)r截器過(guò)濾器視圖層分析_第4頁(yè)
springmvc源碼深度解析之?dāng)r截器過(guò)濾器視圖層分析_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Spring5.0源碼深度解析課程安Spring5.0事務(wù)源碼分Spring5.0AopSpring5.0、SpringMVCSpringBoot2.0余老 Spring框架快速入什么Spring框SpringJavaIoC(InversionofControlAOP(AspectOrientedProgramming,面NewUserService();Spring體系結(jié)1、SpringCore:BeanFactoryJavaBean(IOC)模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。2、SpringAOP:集成了面向切面的編程功能(AOP可以將性事物管理集成到應(yīng)用程序中。3、SpringCntext:一個(gè)配置文件,為Spring框架提供上下文信息4、SpringDo:Spring5、SpringORM:Spring集成了各種orm(objectrelationshipmap對(duì)象關(guān)系映射6、SpringWebweb(Struts、7、SpringwebMVC:Springweb思考一個(gè)問(wèn)題為什么啟動(dòng)SpringBoot項(xiàng)目的時(shí)候需要加上Configuration快速構(gòu)建Spring環(huán)Maven依賴信<artifactId>spring-Xml方式環(huán)境搭<beanid="userEntity"<beanid="userEntity"<propertyname="userId"<propertyname="userName"<beans" " " bean對(duì)publicclasspublicclassUserEntity{privateIntegeruserId;privateStringuserName;publicUserEntity(IntegeruserId,StringuserName)this.userId=this.userName=}publicvoidsetUserId(IntegeruserId)this.userId=}publicvoidsetUserName(StringuserName)this.userName=}publicStringtoString()return"UserEntity{""userId="+userId",userName='"+userName+'\''}}Spring啟動(dòng) spring配置文件,IOC容ClassPathXmlApplicationContextclassPath=new//UserEntityuserEntity=(UserEntity)classPath.getBean("userEntity");注解方式環(huán)境搭Configuration配置容publicpublicclassMySpringConfig//@Configuration等同于配置的spring配置文publicUserEntityuserEntity()returnnewUserEntity(10,}}publicclassUserEntity{privateIntegeruserId;privateStringuserName;publicUserEntity(IntegeruserId,StringuserName)this.userId=this.userName=}publicIntegergetUserId()return}publicStringgetUserName()return}publicvoidsetUserId(IntegeruserId)this.userId=}publicpublicvoidsetUserName(StringuserName)this.userName=}}使用注解形式形式加載privateprivatestaticAnnotationConfigApplicationContextpublicstaticvoidmain(String[]args)applicationContext=newAnnotationConfigApplicationContext(MySpringConfig.class);UserEntityuserEntity=applicationContext.getBean("userEntity",UserEntity.class);}@ComponentScan用掃包下注入springIOC容器publicclassMySpringConfig{//@Configuration等同于配spring配置文publicUserEntityuserEntity()returnnewUserEntity(10,}}privateprivatestaticAnnotationConfigApplicationContextpublicstaticvoidmain(String[]args)annotationConfigApplicationContextannotationConfigApplicationContext=newAnnotationConfigApplicationContext(MySpringConfig.class);UserServiceuserService=annotationConfigApplicationContext.getBean("userService",UserService.class);System.out.println("userService:"+userService);System.out.println("以下為IOC容器注入成功的對(duì)象String[]beanDefinitionNames=for(inti=0;i<beanDefinitionNames.length;i++){}}FilterType有四種類型ASPECTJAspectj@ComponentScan(value@ComponentScan(value="com.mayikt.v2",includeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION,=Controller.class)},useDefaultFilters=false)publicclassMySpringConfig{//@Configuration等同于配spring配置文publicUserEntityuserEntity()returnnewUserEntity(10,}}@ComponentScan(value@ComponentScan(value="com.mayikt.v2",excludeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION,=Controller.class)},useDefaultFilters=true)publicclassMySpringConfig{//@Configuration等同于配spring配置文publicUserEntityuserEntity()returnnewUserEntity(10,}}}SpringsingletonprototypeBeanrequestBeanBeanHttp請(qǐng)session作用域表示煤氣請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的BeanBean僅在當(dāng)前HttpUserServiceUserServiceuserService1=annotationConfigApplicationContext.getBean("userService",UserServiceuserService2=annotationConfigApplicationContext.getBean("userService",結(jié)果為L(zhǎng)azy表示為懶加載,當(dāng)真正需要獲取的時(shí)候才會(huì)被加True表示為懶加載false表示為在IOC容器加載的時(shí)候被創(chuàng)建publicclassUserServicepublicUserService()System.out.println("UserService無(wú)參數(shù)構(gòu)造被加載}}}Condition是在spring4.0增加的條件注解,通過(guò)這個(gè)可以功能可以實(shí)現(xiàn)選擇性的注入Bean操作,接下來(lái)先學(xué)習(xí)下Condition是如何使用的,然后分析spring源碼了解其中的實(shí)SpringWIN7win7publicpublicclassMyConditionimplementsCondition根據(jù)條件判斷上下文*@param@parampublicbooleanmatches(ConditionContextcontext,AnnotatedTypeMetadatametadata)1.獲取當(dāng)前環(huán)境配Environmentenvironment=context.getEnvironment();StringosName=environment.getProperty("");if(osName.equals("Windows7")){true就是能夠創(chuàng)建該return}return}}publicWin7Entitywin7Entity(){returnnew}@Import注@Import@Configurationbean@Import({V5UserEntity.class,默 beanid@Import({V5UserEntity.class,publicpublicclassMyImportSelectorimplementsImportSelectorAnnotationMetadata注解信*@param//添加需 的spring容器的returnnew}}@public@interfaceEnableUser}publicclassMyImportBeanDefinitionRegistrarimplementspublicclassMyImportBeanDefinitionRegistrarimplementsImportBeanDefinitionRegistrarpublicpublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry)//手 StringbeanName=RootBeanDefinitionrootBeanDefinition=newRootBeanDefinition(PayEntity.class);registry.registerBeanDefinition(beanName,rootBeanDefinition);}}publicpublicclassMyFactoryBeanimplementsFactoryBean<MemberEntity>publicMemberEntitygetObject()throwsExceptionreturnnew}publicClass<?>getObjectType()return}publicbooleanisSingleton()return}}publicMyFactoryBeanmyFactoryBean()returnnew}區(qū)別:BeanFactory是個(gè)Factory,也就是IOC容器或?qū)ο蠊S,F(xiàn)actoryBean是個(gè)Bean。SpringBeanBeanFactoryIOCFactoryBean而言,這個(gè)Bean不是簡(jiǎn)單的Bean,而是一個(gè)能生產(chǎn)或者修飾對(duì)象生成的工廠SpringBean的生命周期總refresh();getBean()→doGetBean()→createBean()→doCreateBean()→createBeanInstance(初始化對(duì)JavaCGLIBinvokeAwareMethods()awareapplyBeanPostProcessorsAfterInitializationSpringAop源碼分AspectJAutoProxyRegistrar中會(huì)對(duì)象BeanClass:AnnotationAwareAspectJAutoProxyCreatorAutoProxyCreator有是 AutoProxyCreator經(jīng)過(guò)這樣的一個(gè)類。判斷該被對(duì)象是否有被有實(shí)現(xiàn)過(guò)接口,如果有實(shí)現(xiàn)過(guò)接口就使用jdk動(dòng)態(tài),如果沒(méi)有實(shí)現(xiàn)接口則使用cglib動(dòng)態(tài)。MethodInterceptor(每個(gè)通知)invoke模擬SpringAop五個(gè)通知調(diào)用鏈關(guān)UserService接publicpublicclassUserServicepublicvoidlogin(StringuserName,Stringage){System.out.println("userName:"+userName+",age:"+age);}}創(chuàng)建方法接publicpublicinterfaceMethodInterceptor執(zhí)行通知*@paramObjectinvoke(MethodInvocationmethodInvocation)throwsInvocationTargetException,}創(chuàng)建前置通publicpublicclassBeforMethodInterceptorimplementsMethodInterceptorpublicObjectinvoke(MethodInvocationmethodInvocationthrowsInvocationTargetExceptionIllegalAccessExceptionreturnmethodIcess();//目標(biāo)方}}創(chuàng)建后置通publicpublicclassAfterMethodInterceptorimplementsMethodInterceptorpublicObjectinvoke(MethodInvocationmethodInvocation)InvocationTargetException,IllegalAccessExceptionObjectprocessmethodIcess();return}}創(chuàng)建環(huán)繞通publicpublicclassAroundMethodInterceptorimplementsMethodInterceptorpublicObjectinvoke(MethodInvocationmethodInvocation)throwsInvocationTargetException,IllegalAccessException{ Objectprocess=System.out.println("環(huán)繞通知之后執(zhí) return}}創(chuàng)建方法執(zhí)行接publicpublicinterfaceMethodInvocation方法調(diào)用個(gè)通知的方*Objectprocess()throwsInvocationTargetException,}publicclassDefaultMethodInvacationimplementsMethodInvocationprivateList<MethodInterceptor>chian;privateObjecttarget;//目標(biāo)對(duì)象privateMethodmethod;//目標(biāo)方法privateObjectargs[];//目標(biāo)參數(shù)publicDefaultMethodInvacation(List<MethodInterceptor>chian,Objecttarget,Methodmethod,Object[]args)this.chian=chian;this.target=target;this.method=method;this.args=args;}publicObjectprocess()throwsInvocationTargetException,IllegalAccessExceptionif(currentChianIndex==chian.size())執(zhí)行目標(biāo)returnreturnmethod.invoke(target,}MethodInterceptormethodInterceptor=//return}}Spring事務(wù)底層源碼分SpringAop基本環(huán)境搭Maven依賴信<artifactId>spring-mysql<artifactId>mysql-connector-<artifactId>spring-publicclassMyConfig{publicDataSourcedataSource()MysqlDataSourcemysqlDataSource=newMysqlDataSource();return}publicJdbcTemplatejdbcTemplate()returnnew}publicPlatformTransactionManagertxManager()returnnew}}publicclassOrderDao{privateJdbcTemplatepublicvoidaddOrderInfo()jdbcTemplate.update("insertintoorder_info}}Spring事務(wù)源碼分Aop實(shí)現(xiàn)一樣的功能。Ioc容器中TransactionInterceptor是 ifif(txAttr==null||!(tminstanceofCallbackPreferringPlatformTransactionManager))開啟事TransactionInfotxInfo=createTransactionIfNecessary(tm,txAttr,joinpointIdentification);ObjectretVal=null;try執(zhí)行目標(biāo)方retVal=}catch(Throwableex)//回滾當(dāng)前事務(wù)completeTransactionAfterThrowing(txInfo,ex);throwex;}finally}returnretVal;}純手寫SpringAop環(huán)繞通知+手動(dòng)事務(wù)就可以事SpringAop中所有最終是如何執(zhí)行?調(diào)用鏈關(guān)AutoProxyCreator使用該類創(chuàng)建目標(biāo)對(duì)象(TransactionInterceptor事務(wù)@EnableTransactionManagementePROXY: Beanid:Value:ProxyTransactionManagementConfiguration將一下對(duì)象到ioc容Value:tansactionInterceptorInfrastructureAdvisorAutoProxyCreator就是我們的后置處理Bean對(duì)象在初始化之后都會(huì)判斷是否需要?jiǎng)?chuàng)建類(根據(jù)是否有加上InfrastructureAdvisorAutoProxyCreator就 serviceSpring循環(huán)依賴原什么Spring循環(huán)依賴問(wèn)如何解決Spring循環(huán)依賴相關(guān)業(yè)務(wù)邏輯代publicclassAService{ privateBServicepublicvoidsetbService(BServicebService)this.bService=}}publicclassBService{ privateAServicepublicvoidsetaService(AServiceaService)this.aService=}}如何底層解決循環(huán)依賴原循環(huán)依賴中完整對(duì)象信Map<String,Object>singletonObjects一級(jí)緩存完成對(duì)象(對(duì)象和屬性都已經(jīng)賦值)Map<String,Object>earlySingletonObjects性缺沒(méi)有賦值早期對(duì)象Map<String,ObjectFactory<?>>singletonFactories三級(jí)緩存(只初始化,沒(méi)有給屬性賦值對(duì)象)存放提前對(duì)象AB依賴與BBAASpringBeanA(單例的情況doGetBeanStringbeanNameStringbeanNameObjectFactory<?>singletonFactorycreateBean→doCreateBeancreateBeanInstancecglib(注意對(duì)象不完整,因?yàn)槭煜](méi)有duGetBean1-6BAgetSingletonAapplyPropertyValues→valueResolver.resolveValueIfNecessary→resolveReference(argName,ref)init(初始化HashMap<Object,HashMap<Object,Object>objectHashMap=newHashMap<Object,1.A對(duì)objectHashMap.put("aService",new//2.B對(duì)象從三級(jí)緩存中查找到objectHashMap.put("bService",newAServiceaService=(AService)objectHashMap.get("aService");BServicebService=(BService)objectHashMap.get("bService");bService.aService=aService;//3.A對(duì)象需要設(shè)aService.bService=protectedprotectedObjectgetSingleton(StringbeanName,booleanallowEarlyReference)1.ObjectsingletonObject=//2.沒(méi)有創(chuàng)建對(duì)象,并且該對(duì)象正在創(chuàng)建(標(biāo)記為循環(huán)依賴的查詢if(singletonObject==null&&isSingletonCurrentlyInCreation(beanName))//3.singletonObject=this.earlySingletonObjects.get(beanName);if(singletonObject==null&&allowEarlyReference){//4.ObjectFactory<?>singletonFactory=this.singletonFactories.get(beanName);if(singletonFactory!=null){singletonObject=singletonFactory.getObject();this.earlySingletonObjects.put(beanName,singletonObject);}}}}returnprotectedprotectedvoidaddSingletonFactory(StringbeanName,ObjectFactory<?>singletonFactory){Assert.notNull(singletonFactory,"Singletonfactorymustnotbenull");if(!this.singletonObjects.containsKey(beanName)){this.singletonFactories.put(beanName,singletonFactory);}}},BAABBAbeaniscurrentlyincreation:IsthereanunresolvablecircularABBABBABABAABSpringBean創(chuàng)建AdoGetBeangetSingleton(StringgetSingleton(StringbeanName,ObjectFactory<?>singletonFactory)this.singletonsCurrentlyInCreation.add(beanName)createBeanInstancecglibbeanaddSingletonFactorypopulateBeanABBBAprotectedvoidaddSingleton(StringbeanName,ObjectsingletonObject){synchronized(this.singletonObjects){this.singletonObjects.put(beanName,publicObjectprotectedprotectedvoidaddSingletonFactory(StringbeanName,ObjectFactory<?>singletonFactory){Assert.notNull(singletonFactory,"Singletonfactorymustnotbenull");//判斷一級(jí)緩存是否存if(!this.singletonObjects.containsKey(beanName))//將該不完整的對(duì)象存放到三級(jí)緩存集合中this.singletonFactories.put(beanName,singletonFactory);}}}protectedprotectedObjectgetSingleton(StringbeanName,booleanallowEarlyReference)//1.一級(jí)緩存bean對(duì)象該集合緩存的對(duì)象為完整對(duì)象對(duì)象創(chuàng)建完畢并且已經(jīng)屬性賦值成功ObjectsingletonObject=if(singletonObject==null&&isSingletonCurrentlyInCreation(beanName))//2.從二級(jí)緩存中獲取對(duì)象信singletonObject=this.earlySingletonObjects.get(beanName);if(singletonObject==null&&allowEarlyReference){3.從三級(jí)緩存中獲取對(duì)ObjectFactory<?>singletonFactory=this.singletonFactories.get(beanName);if(singletonFactory!=null){singletonObjectsingletonObject=//4.如果三級(jí)緩存中存在對(duì)象的時(shí)候下,就返回二級(jí)緩存中。this.earlySingletonObjects.put(beanName,singletonObject);}}}}return}SpringIOCAOP依賴注入賦值A(chǔ)BB對(duì)象BAAspringSpringBeanAservicgetSingleton(beanName)singletonObjects一級(jí)緩存完整對(duì)象earlySingletonObjectssingletonFactories三級(jí)緩存存放嬰兒對(duì)象嬰兒對(duì)象(提前對(duì)象){}singletonsCurrentlyInCreationgetSingleton(StringbeanName,ObjectFactory<?>singletonFactory)this.singletonsCurrentlyInCreation.add(beanName)表示該對(duì)象已經(jīng)開始創(chuàng)建createBean() 賦值的)存放三級(jí)緩存中。ABABBprotectedprotectedvoidaddSingletonFactory(StringbeanName,ObjectFactory<?>singletonFactory){Assert.notNull(singletonFactory,"Singletonfactorymustnotbenull");//如果一級(jí)緩存沒(méi)有該對(duì)象的情if(!this.singletonObjects.containsKey(beanName))//將該對(duì)象存放到三級(jí)緩存中嬰兒對(duì)象this.singletonFactories.put(beanName,singletonFactory);}}}protectedprotectedObjectgetSingleton(StringbeanName,booleanallowEarlyReference)//1.一級(jí)緩存對(duì)象集合(緩存完整對(duì)象)對(duì)象已經(jīng)創(chuàng)建成功呢并且所有的屬性都已經(jīng)賦值成ObjectsingletonObject=2.如果已經(jīng)緩存沒(méi)if(singletonObject==null&&isSingletonCurrentlyInCreation(beanName))//查詢二級(jí)緩存是否有緩存對(duì)singletonObject=this.earlySingletonObjects.get(beanName);if(singletonObject==null&&allowEarlyReference){//4.查詢?nèi)?jí)緩存,三級(jí)緩存如果有的情況ObjectFactory<?>singletonFactory=this.singletonFactories.get(beanName);if(singletonFactory!=null){singletonObject=//將三級(jí)緩存中的數(shù)據(jù)放入到二級(jí)緩存中this.earlySingletonObjects.put(beanName,singletonObject);}}}}return}SpringMVC源碼分Servlet開發(fā)基本環(huán)Servlet簡(jiǎn)單的介SunAPIservletwebJava2ServletServletSpringMVC關(guān)idea快速創(chuàng)建一個(gè)Servlet項(xiàng)創(chuàng)建的mavenweb工廠發(fā)現(xiàn)沒(méi)有 ,則創(chuàng)建XML方 publicclassMyServletextendsHttpServletprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)ServletException,IOException{resp.getWriter().print("thisismayikt");}}基于注解方publicclassMyServletextendsHttpServletprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)ServletException,IOException{resp.getWriter().print("thisismayikt");}}Servlet線程是否答案:不安全,Servlet是單例的在高并況下,可能會(huì)存程安全問(wèn)publicclassMyServletextendsHttpServletprivateIntegercount=publicMyServlet(){}protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOExceptiontry{}catch(Exceptione)}resp.getWriter().print("thisismayiktcount:"+}}在web容器啟動(dòng)時(shí)為提供給第組件機(jī)會(huì)做一些初始化的工作,例如servlet或filtes等,servletServletContainerInitializer每個(gè)框架要使用ServletContainerInitializer就必須在對(duì)應(yīng)的jar包的META-INF/services 建一個(gè)名為javax.servlet.ServletContainerInitializer的文件,文件內(nèi)容指定具體的ServletContainerInitializer實(shí)現(xiàn)類。1、Servlet容器掃描,當(dāng)前應(yīng)用里面每一個(gè)jar包ServletContainerInitializer2ServletContainerInitializerServletContainerInitializer實(shí)現(xiàn)類的全類名;相關(guān)代@author螞蟻課堂創(chuàng)始人@title:@description:每特教育獨(dú)創(chuàng)第五期互聯(lián)網(wǎng)架構(gòu)課@date@HandlesTypes(value=publicclassMyServletContainerInitializerimplementsServletContainerInitializer*@param 類型也就是MyHandlesType所有子類@param@throwspublicvoidonStartup(Set<Class<?>>set,ServletContextservletContext)throwsServletException//1.打印所有 的類forfor(Class<?>c:set){}//2.servletContext手動(dòng)過(guò)濾器 ServletRegistration.DynamicpayServlet=servletContext.addServlet("payServlet",newPayServlet());}}基于xml方式啟Maven依賴信publicclassMyMvcConfig}配置文件內(nèi)publicpublicclassWebInitializerimplementsWebApplicationInitializerpublicvoidonStartup(javax.servlet.ServletContextservletContext)ServletException 創(chuàng)建SpringMVC容AnnotationConfigWebApplicationContextapp=//2.我們的配置文 我們DispatcherServletdispatcherServlet=newDispatcherServlet(app);ServletRegistration.Dynamicdynamic=servletContext.addServlet("dispatcherServlet",dispatcherServlet);dynamic.setLoadOnStartup(1);//最優(yōu)先啟}}}Jsp視圖publicpublicViewResolverviewResolver()InternalResourceViewResolverinternalResourceViewResolver=new前internalResourceViewResolver.setPrefix("/WEB-//后綴returninternalResourceViewResolver;}<%@pagelanguage="java"contentType="text/html;charset=UTF-我是完全注解方式整合SpringMVC器使用器和過(guò)濾器都是基于Aop實(shí)現(xiàn),能夠?qū)φ?qǐng)求執(zhí)行之前和之后實(shí)現(xiàn)。ServletWeb器不需要依賴于Servlet、不僅可以實(shí)現(xiàn)Web請(qǐng)求還有其他方法等SpringMVC器的使1.自定義請(qǐng)求pletion在DispatcherServletpublicpublicclassTokenInterceptorimplementsHandlerInterceptorpublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponsere

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論