版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一篇:Spring概述1、Spring框架内核IoC(InverseOfControl):反转控制。AOP(AspectOrientedProgramming):面向切面编程。2、Spring的体系结构3、Spring开发所需的资源主spring-framework-3.0,2,RELEASE-dependencie^zip 2013/1/420;52主spnng-framework-3,2^RELEASE-distzip上 2013/1/317:W/ \/ 依赖的jz咆Sp「ing官■方的开发包:jar、doc、sr特蜘坦(因卜RELE然EEd5P而g-fraEeworkTNQRELE*E卜共享.副景 新建交I也名都惨改日期大小docs■►文档:手册、APIlibsschema_Iicense.txt-名都惨改日期大小docs■►文档:手册、APIlibsschema_Iicense.txt-noiice.brt]1rMdfne.txtASpring的a泡>xsd均束文档2012/12/137:462015/9/2111:5€2O12/U/137:462012/12/13734201^/12/137;:242012/12/137:24文件夹文件夹文件夹文本文档文本文档,一Jj_■»■一"“a---T-1KB第二篇:Spring核心之loC(控制反转)1、拷贝核心jar包:logging'l.ll.jcom.spnng5ourcerorrions.logging'l.ll.jspring-beans'3.2.0.RELEASE.jarspring-context-3.2.0.RELEASE.jarpispring-core-3.2.0.RELEASEjarspring-expression-3.2.0.RELEASEJar依赖pispring-core-3.2.0.RELEASEjarspring-expression-3.2.0.RELEASEJar依赖SpringCore2、loC的概念:主动壹被动,控制权发生了新移主动壹被动,控制权发生了新移,这就叫做ToCSeMte实现自己创津Dm实例对零.控利权在自取上主动行为.pubfticclassXXX'&erviceJrnp]impterneritsXXXServkejprivateUwrD^ouserOaopublicvoki「egi5ttMurserDao.sawO;publicda3UseHDaatmpIimplementUse<Dao{publicvoidsave{X//执行JDK保存陋依触:1.U整出日口接口/k2VUwrDaolmpEEBj^i^展供Tsette访法publk:void^tUserDao(UsdrDiM!u^erDao){thk.us«rDao-userDao;}被动接受3、资源交给Spring管理建立spring的配置文件:EE叵a、schema约束文档资料位置EE叵二电追星QQ+RELEASES卜fipring-l^atWfewdc-3.2.0.REIJEASE,docs*spring-fraffiewodc-ireferwice*htitil►1A名称 “ 修改日期 竞型 大小spring.tld.html 2012/12/137:3S Chrome HTMLD... 47 KB^pring-appendice5.html 2012/12/137:38 Chrome HTMLD... 2 KEF5pring-core.html 2012/12/137:33 Chrome HTMLD... 5 KB?spring-dsta-tier.html 2012/12/137:38 Chrome HTMLD... 4 KBFwpring-foEtldhml 2012/12/1373S C-rome HTMLD... 223 KEgspring-integratiaruhtEl 2012/12/137:38 Chrome HTMLD.„ 4 KB苜spring-introductiDri.htrnl 2012/12/137:38 Chrome HTMLD... 4 KEgspring-雌b,html 2012/L2/137:3S Chrome HTMLD.„ 4 KBspring-what5-new.html 2012/L2/137:38 Chrorne HTMLD... 2 KB时忸氏ng.html 2012/12/137:3SChromeHTMLD.„ 213KEtran&sctiar.hbYil 2012/12/1373S Chrorne HTMLD... l&l KEftvalkdation.lrtml 2012/12/13738 Chrome HTMLD... lift KE时vfewhml 2012/12/1373S Chrome HTMLD.^ 171 KEFweb-integration.htinl 2012/12/137:3S Chrome HTMLD... 31 KE■,、Fxsd-config.hftml三708 匚hr口m电HTKJIn 口耳k口_,开▼刻录新重点域月兰nfiq.html 2C12.12/13733T.2D15/9/?19:03b、schema引入后xml没有提示的解决方案xmlcaxmlcaXMLCatalogMyEclipse】匚中LiFilesandEditorsXMLXMLCatalogEntriesS(|XMLC]<箱;UserSpecifiedEntries玩PluginSpecifiedEntriesc、把DAO实现交给Spring容器(Map结构)管理c?xrilverfcsicin=r'J.0irencoding=J,,l/rF-gJ,,?><!--发行包::spring«framework-3,2,0,RELEA£E\@0£515p「iriR・f「anieH0iEk・「ef€r'Enc:ethtnnl\KFd・CQ|nfiiE・html■■>< n鼻Killns=11ttp;//wmj,fpkingfr-Qm^MQrk「scjhemfl/bec?ns™xmln5;M5i=rahttp;//eh・m3.。产g/20&1/XMLScfrefflcr-i门51即£•"xsi:5chemaLocation="Bhttp://^wrspHnff/roflfeworA,org/5c/?ew/beanjhttp://wwwB5pringframe^rk,org/sche^/beans/^pring-beans.xsd,B><!--sprdn请理的:闽原Man:定文二个贲麻在5prin晋礼所有^^兼叫liftManid:轮亮诵Bl的翎招碓一f1。=垓瑜摸全名<beanid="user-D^o^class^^cfl.itcast,sprir?glaC.User'DaoI^pt"*/></beans>从Spring容器中获取资源a、把核心jar包加入到classpath中
UserDaoImplH/b</beans>4、依赖注入:DI(DependencyInjection)b、启动Spring容器“应用puihlic.亡工2App(publ£.£.st:ariif ]jiiPgS){//ApplitatioriConitaxt:SpringSiS//ClassPathXmlApplicatiorirCont'e-Kt;IESS件在仁工融融更th中ApplicationContextac胃fibhClasslPathXjmlUserDaoImplH/b</beans>4、依赖注入:DI(DependencyInjection)b、启动Spring容器“应用puihlic.亡工2App(publ£.£.st:ariif ]jiiPgS){//ApplitatioriConitaxt:SpringSiS//ClassPathXmlApplicatiorirCont'e-Kt;IESS件在仁工融融更th中ApplicationContextac胃fibhClasslPathXjmlApplicationContext('"cn/itc.ast/spring/_D1loC/beart,xml11)jUserDaouserDao=(UserDaoJac.ge七吁sain( "技瞪渤1从与pring哥法中融!虎遇ubsrDaoasave()j<I--发行包:spring-frairtewdrk-3a2.0.RELEASE\do<:£\spring-framework-referenceXhtmiJlXxs-d-configthtml<bean5xmlns="http"//5Prirorg/5c■片《所口/Sscjfts;wxmIns:x,i="http w3,org/2&&l/XMLSc/few?a-irrstance"xsiischemaLDcatioin=Hhttp://www,springframeiM/schema/beansh七七p; spr~if?g//Str/iema/beans/iprirrgf-beans.xs€/,T>pirgpertzy:通运属性[写屈性与etitep方法)注入name:思性钠ref;弓|用郦1个匕电白内5、Spring核心类或接口核心接口:ApplicationcontextClassPathXmlApplicationContext:加载位于classpath中的spring配置文件。FileSystemXmlApplicationContext:加载位于本地磁盘上的 spring配置文件。<propertynam@^"ref=lpwserDa,ow></property></beanycbeanid^^wserDao"c1ass=,-cn-<tcast.springr_02DI.U5*rkbidlrrH^AddEMihzI|」*e占5|^iftg.i!SrCirCft/fci5t1,SprifiqJC,nU^C11!b*ir"ml EMeiui WdltbAiKhHeLdhSou^rRdertc*-N1Kv*g«rieDrchftriertMkItsfBun Ocsigrwii白-b«flri#nJ骂"KU时川职4七1即><versio*i=,'Ii&"ertcodityptEH^r1pwt情陶壮/je£刀口上条「£『pparlinfor。府ngRjesciurctBuilde-f-sA*vaBuikiPaihJj^aCodtEtJe/RddUbmiyJmbBuildPah1Su410向西”4.bbririwJARaanddfF an141buildpaih:UMrUMI,UtiiiLibraiiiri++cam.ipringBauic«LCiguap«h«.Dammi->pr^g-b«n-1.2jO.RELEAbE.jM-D:\R£L£ASJ“W—3ns7aiJlRELEi^f.jjr-DARE*一1kprngcarB^ZjO.RELEA&EJai■以±REL£工QL**>prir^-«xprntiran-^J.ILREl.EA5Ej«r-比J^EJSdMt部librarytoadd1o<dw网也.AddUtafiry.-"*廿5¥即加工碑兄174,UUL.El<beanid=**userSerwtcet¥class=Ncn.itcast,spring._&2DI.UserS^^iceI^plw>UserLibr即H.了解:BeanFactory和Applicationcontext获取Bean的区另1J在加就配置文件附,Stt吧配罡婶的bzan买例化7AppliLuliuri<utiLyxLat=rruwCly^^PtrLliXmlApplicationContext(Mcn/itcast/spring/02DI/be口n・乂/1");UserDacuserDao=(UserOao)ac.getBean(,buserDaoM)j,LjserDac.save()j/,拉正加载:用到的^偎才会实例化Resourceresource=mewClassPathResourcet''cn/itcast/5pring/_02DI/be3n.xml,h);BeanFactorybeafiiFactory=newXmlBeanFactory(resource);UserDaouserDao=(UserDsio)beanFsctoryBgetBean(,hui5erDaoM)juserDao.saveOi6、Bean的初始化方式一:使用默认的构造方法。(推荐,重点)注意:Bean要有默认的构造方法<!--使用默认构苣方些例化bemn--><beanid="beanl"class=lfcn»itcast.spring.GSinit.Beanl,rX/bean>方式二:静态工厂方法初始化(遗留老系统)V91*W-W〜.,—・JW>-mF=■尸. V■j^g■■*V V" 、J//老系统:静态工厂口u’ri仁亡1日5亨 i《B电日riFact□广yfpublicstaticBean2getBean2(){returnnewBean2();}<!--使用静态工厂的方法产生been匚la”:静杰工厂类名factory-method:创建bean的静态方法名称一■><beanid=ubean2"class=Mcn*itcc?st.spring StaticBeanFactory'*factory-method="getBean2"/>方式三:实例工厂方法初始化(遗留者系统)7/老系统:实例工厂publicclassInstanceBeanFactory(publicBean3getBean3(){returnnewBeanB();})<!-使用实打虹厂的方法产生bw3n--><beanid="instanceBeanFact&ryw "cn.itcast.spring._03init,InstancedeartFactctry1*/><beanid=wbean3wfactcry-method=ngetBean3"factory-bean-,rii?stanceBeanFactcry"X/bean>
7、bean的存活范围<bean的scope属性>:取值:singlton(默认值):单例的。在spring容器中实例只有一个。prototype:非单例的。用的时候都会创建新的对象。request:请求范围。(只能用在web环境下)session:会话范围。(只能用在web环境下)■ 产FFF¥a』产・Sr!lTy|J■WFMiPffWIRr<*-rVF甘/XLFriFMJ* 1产*>taFFy-lur%.ufFI'-ra- ¥<E--轼/腌碉:sin£jLton^ <bean "class=ricnsitcast.spring._£c°P&- "scope= 1></bean><!-- prototype■<bean1<^=’『£|@曰门2"clas5=Jjcn.itcc?st.sprfng*_04scope.Bean2,rscope="prototype1></bean>8、bean的生命周期有关配置为玷-meth口d:指定初始化时要执行的方法。初始化方法执行一次6€三±「口了-巾白七八口6:指定消毁5口「:1口€容器时,bEan要执行的稍毁方法.只适含单例模式<beanid="beanl"class="cn.itcast.spring._05LifecycLe.Beanl"init-method=11aa"destroy-method=f,bb"/>public/电■*[public/电■*[匕ue±dm日工11〔£1:尸工11且[J曰「g5)(bc=neuCLassPathXml^ijpplicatimCtHntext("cn/itcast/spriog/_&5Lifecyc1e/beantxml");bc=neuCLassPathXml^ijpplicatimCtHntext("cn/itcast/spriog/_&5Lifecyc1e/beantxml");Beanlbeanl=(Bednl)at.getBean("bean1!!);beanl^daSonftethLinigf);b日32.d口&口好th1口虱);ac.£lose()-,/*闱印rdHg客迷9、依赖注入:重点9.1通过构造方法注入id="bw刖["clsss=n.iteflst.springr_06D!High,Bean!N><!-给构宣方法注入壁披ind也乂:指定.辎晾引位孟type品混爹煎的类母value:注入的乐Strin葭逗棱毅姗,且能弱自咖S微哪接如果不指定ind石乂和typ-是由酉造顺序决定的,容易出得--><con5tructoi"=argirdex-hlnvalue-type=r,int^X/constructorarg><constructoi"=argindex=N6Wvalu€="出单攀"type=,hjavn.Long.String^X/constructor-arg>R/bean>
9.2setter属性注入:重点publicclass {privateStringname;privateintage;privateBean3bean3jpublicBe3nmgetBeanB(){returnbean3;}publicvoidsetBean3(Bean3bean3){this_bean3=beanB")publicvoid£etNam©(Stringname){=name;}publicvoidsetAge(intage){this.age=age;}日^OverridepublicStringtoString(){return"Bean?[name=*'+name+",age="+age+}\--属性注入-->id="becm2”二19三三="七门.ii:七口5七.spring 工High.HegnN"><proper,tyname="name"value="^^"></property><proper,tyname="age,lvalue="39"></property><!--注入弓I用类型:使用口慈<proper,tyname="bean3"ref="bean3"></property></bean><!--把hean3交给spring管理--><beanid="bean3"class="cn.itcast.spring._06DIHigh.Bean3"></bean>9.3p名称空间:p名称空间的支持:1、引入空间:xmlns:p="http://www.springframeworkTorg/schema/p**2、属性值的注入:基相陛和St「in弟 p:属性名称=“值”引用类型:P:属性名称bean的名字”--><bean= class=Jlcn.itcast.spring._06DlHigh.Bean2ftp:ndme="切摸第"p:age=>r5911p:bean3-ref=Nbean3,7>
9.4SpEL:SpringExpressionLanguage<!--5pEL:基本语法并{5pEL}<beanid="bean22"class-"cn,itcast.spring._06DIHigh,Bean2"><propertyname=,Fnamer,value=Fr#fFj^iWf/,,></pr,operty><properizyname="age"value="69"></property><propertyname=^bean3rjvalue="#{bean3)"X/property></bean>I _9.5注入数组或集合privateString[]arrs;privateList<Strirg>list;privateSet<String>set;privateMap<StringjString>mapjprivatePropertiesprops]publicvoidsetProps(Propertiesprops)(ps=props;}publicvoidsetMap(Map<String,String>map){this.map二map;}publicvoidsetSet(Set<String>set){this.set=setj)publicvoidsetList(List<String>list){this,list=list;}publicvoidsetArrs(String[]arr5){this.arrs=arrs;}publicvoidprint(){System*outsprintln("Array:"+Arrays,as£ist(arrs))jSystem.out.println("List:"+list);System.oof.println(+,Set:"+set);System.out.println(1,map:"+map);System.out.println(''props:11+props);
<1--数组或隼合的注入<beanid="bean4"class="cn.itcast.spring._Q6DIHigh.Bean4"><!--数组注入元鎏<propertyname="arrsrr><array><value>aa</value><value>bb</value><value>cc</value>5/array></property><!一生入List赭一><propertyname="tistM><list><value>aaa</value><value>bbb</value><value>ccc</value></property>JI ,%__,-L^-=fc 、<(--注入£2七元素一》<propertyname="set"><set><value>aaaa</value><value>bbbb</value><value>cccc</value></set></property><!——注入Ma际素<propertyname=rtmapfl><map><entrykey="aHvalue="aaaaaH/><entrykey="b"value="bbbbb"/></map></property><!--p「ope广ties的内容;keyvalue-<propertyname=,lprops*'><props><propkey=1raa">aaaaaa</prop><propkey-,fbbrj>bbbbbb</prop></props></property></bean>10、团队开发按模块编写spring配置文件。
<beansxmln£="htt, /sch&mp/beans"xmlns:p="http://wjflM./schema/p"xmlns:xsi="http://gw.\/20dl/XMLSchema-instance"xsi:schemaLDcation="http:/./schema/beans. 一亡七户;//^^・5人/^日日,尸叮小二的广»+。,q/写chema/beons/spring-beans.Xsd"><!一主/孟文南二> i<importresourcesftbean-modeLI,xmL"/><import.「g5011广(:日三“52口门-用口£/212.乂m1”『士</beans>注意事项:同一个xml文件中不能出现相同id名称的bean多个xml文件可以出现id相同名称的bean,后导入的配置的会覆盖前面的配置。fe♦1产*/*vrrrrr■3产ar'HfJ1r5Jrrw『r%■■vr——!■■—“ryyjwfr/—产■—J"ry1”斗wf•一・d3f<1-i喇用如酸中的id的特性“唯一前提:多个S?置文件中有相同1邺b-n,且当前不适宜修成它的茗字,遹过谈由田科睡新的名称name:也可以1靛bw日由名林*多个信用诲号制意。--><beanid=rrbeanl"name=TIbblfbbllfbblll"clas5=wcn.it^ast.spring._07mjLtTXmL.Beanl^y<propertyname=''name"value="modeproperty></bean>11、使用注解11.0概述作用:替代xml作为配置文件。注解VSXML注解:优点开发直观,开发效率高。缺点硬编码。XML:缺点开发效率低,麻烦。优点运行期间可配置。11.1Spring中使用注解进行配置a、jar包:还是使用核心的5个jar即可b、spring配置文件指定bean的搜索路径
一<beansxmlrs=(*/?ttpr//wLvwJ/scherna/beans11xmlns:p="http://ww^.spritiQframehrork*org/schema/p"xmlns:xsi="httpr///2001/XMLSchema-instance"|Kmlnr;二口武丁式七=://2旧.Bprinqfr口所启.sg/"正时口/七加£。)斗xsi:schemaLocations"http: .spr'ingfrtuneh/or'/schema/be□ns/schema/beans/spring-beans.xsdhttp"/hnw.EpringfranezoNi.白广^/士亡卜左前仃/用力门之金/七http://hMW.springfram^M/scbema/contejct/spring-context.xsrf">3<1--给导P「in由首宅强<context:component-scanbase-package=wcr?.itcost.springT_Q8annotation(7></beans>c、实例化资源^Component/A0=i-F;<beanid="beanl''显于宝自cntitcast*spring._08annotation+Beanl,hX/bean>publicclassBeanl(privateStringname;publicStringgetName(){returnnmme;11.2常用的注解资源管理:方式一:©Component:把bean交给spring容器管理。默认bean的名称就是类名首字母小写方式二:©Component的衍生注解,主要用在三层架构开发中©Controller:表现层使用,一般动作类上@Service:业务层使用©Repository:持久层使用资源注入:方式一:@Autowired:自动注入required属性:默认值是true。注入失败,抛出错误说找不到对应的 beanfalse:注入失败,抛NullPointerException©Qualifier:指定要注入的bean的名称。要配置@Autowired来使用@Value:注入基本类型数据和 String按类型自动注入的注意事项:注入属性类型为class如果类名(简单类名)对应的类只有一个,注入成功如果类名(简单类名)对应的类有多个,注入失败注入属性类型为interface
如果不存在对应接口的实现类,注入失败如果对应接口的实现类为一个,注入成功如果对应接口的实现类为多个,注入失败方式二:©Resource:功能和@Autowire是类似的。默认按照类型进行注入。此注解是 Spring框架对JSR-250的支持。@Autowire和©Qualifier可以按照指定名称进行注入; @Resource(name="bean的名称";@ComponentpublicclassCustomerServicelmplimplementsCustomeriServic&{77^Autowired//@Qualifier("customsrDao11)■II@Resqu广ce//默认按照类理进行注入 (口日me="工ustcun曰uDac")privateCustomer-DaocustomerDao;publicvoidregist(){customerDao.save();))生命周期有关注解://生命周期有关的注解@ComponentpublicclassBe3nl{//初始化方法|®PostConstructpublicvoidaa(){System.out.printin(11aaa......1);}//i肖毁方法@PreDestroypublicvoidbb(){System.out.println(Mbbb ;}针对老系统,bean是由工厂创造的
//zrgConfiguration//指定当前类为酉造类publicclassFactory{$Bean(name=nb2(,) //说明产生的是一个bf日n,并取名为b2publicBean2getBean2(){returnnewBean2();12、Spring中使用JUnita、导入jar包新增一个jar包:spring-test-320.RELEASE.jarb、如何使用单元测试门野预先蜀l£p「in瞬弱1®RuhWith(Spir,ingJUniit4Cla£sRijnner.class)//设置单元副i加勺基运行5£.SContextCoAfiguration(locations=l,,,classpathscm/itcast/spring/_02juinit/bean,xml,i,)//l^Spr,iri^'0jg^:ffpubpublic*1酬8■写11510印田『3!&尸丫1,£妇丁史5七i@AutQwired注入被厮it的买凰pr1〃&金«■Cust口me「与mpmic:e匚u三七dine「52「yi汇注入被厮it的买凰@TestpublicvoidtestREgis1:(){CuS.tOnierSi&rviee.regist()J第三篇:Spring核心之AOP(面向切面编程)1、代理模式静态代理:代理类已经写出来了,实实在在的存在的。动态代理:(Spring采用的)运行期间生成的,内存中的类。基于接口的动态代理:JDK代理,Proxy。编译时快,运行时慢。基于子类的动态代理: CGLIB。编译时慢,运行时快导入cglib的jar包:Spring框架用的代理:目标类实现了某个接口,用JDK代理;目标类没有实现任何接口,用CGLIB代理。
2、通过一个事务管理案例,理解什么是 AOPThreadLocal:线程局部变量.当前线程放的对象,只有当前线程能取。简单模拟该类的代码:publicclassThreadLocal<T>;privateMap<Runnable,T>map=newHashMap<RunnablerT>():publicvoidset(Tt){map,put(Thread.currentThread0,t):}publicTget(){map.get(Thread*currentThread()):}publicvoidremove(){map.remove(Thread.currentThread());AOP的好处:h使程序员专注于实现业务可拔插式开发,不会修改原来的代码3、AOP编程思想把切面问题在运行时织入到业务代码中,这就是AOP把切面问题在运行时织入到业务代码中,这就是AOP编程传筑开发业务代码改变切面问题I 1传筑开发业务代码改变切面问题I 1专注于业务代码,不考虑切面问题;切面问题都写到公用的代码;运行期间把切面公用代码织入到业务代码中(核心技术:动态代理);4、Spring中AOP的概念连接点(Joinpoint):连接点指类中的方法。切入点(Pointcut):切入点指被抽取了共性功能的方法。通知(Advice):这些被抽取出来组成独立代码逻辑的共性功能称为通知。通知类别:前面、后面、返回后、最终、异常、环绕。弓I入(Introduction)目标对象(TargetObject):目标对象指包含切入点的类对象AOP代理(AOPProxy)织入(Weaving)切面(Aspect):指被抽取了共性功能的方法(切入点)与被抽取了共性功能(通知)对应的绑定关系。关心的某一方面(比如:事务、日志、效率方面)AOP开发流程:5、基于XML的AOP搭建AOP的Spring环境基于Spring的IoC核心的。a、拷贝必要的AOPjar包spring-aop-320.RELEASE.jar
spring-aspects-3.2.0.RELEASE.jar(对aspectJ的实现).aspectj.weaver-1.6.8.RELEASE.jar一注day34_D3_5pringAOP£src■hJRESystemLibrary[JavaSE-1,6]•-spnng_aop:\RELE^s\ccre'嬴.aopalliance-l^O.Ojar-r-二_E二•-:.方口昌.aspec^.weaver-l.S.B.RELEASEjar-D:\l遥sprirg-aop-3.2.0.RELEASE.jar■D:\RELEASES\springJars\aopi^1spring-aspects-3h2.0.RELEASEjar □pringjar^:\RELE^s\ccre/&初ing_gr吕呷comHSpringsourceHorgHapachexommonsJogging-Ll.l.jar--
函spring-beans-S^nOnRELEASEjar-D:ELEr--二,◎口1门匚:」&“弓二匚
扇spring-context-S.2.O.RELEASE.jar-D:\RELEASES\springJars\<@spring-core-3,2,0.RELEASEjar-D:\RELEA£E£\5pring_jar5\cciD砌spring-ejcpression-3»2,0,RELEASEjar■D:\RELEASES\springJab、编写核心业务代码(制定连接点).〃核心业务publicclassCustomerService{publicvoidsave(){System,out.printIn("CustomerServicesave।}publicvoidupdate(){System,out.println("CustomerServiceupdate}c、通知制作:切面公用代码//通知:切面的公用华码〃&jviu(通知)。战者叫增强publicclassTransacticnAdvice(publicvoidstartTransection(){System.out.println("开启事务");)publicvoidcommit(){System,out.ppintIn("提交事务”);}d、Spring配置文件
4bean<3-4bean<3-xmlns= //nww.^pringfrGmcwGrh.. schrma/beans切入点表达式<|-- 静cutiqn(幅胃丽is万法jig回审日-就-万法钿^^购利累)|--><r,哪m,,><aop:beforerwthod=r,startTransactLohr,[一一口;|<aop:beforerwthod=r,startTransactLohr,[一一口;|3比千口广€rf*e]hod="stdrtTransaction"mI・「一步舟!fe嘲血-1■<anp::bwfcir*iM>thod="stjrtlransaction”<aap::b二干口r«iwthod-"Et=rtlran-saction"<aop:bfFQr^-ifcethod-"&tflrtTrsn?acti^n"^pintciJt^^executionf^oidpoiritcut=*extcuticMii(voidpointcut-^cxi^curtionCvoidpojntq*eMpeurttiora(void艮02nt£»t-"execvtion(voidcn,itc-ast.s.pring・.CustomerService))■"/>■■>c.n.itcast।spring,_OLA*-CustcmerService*s^ve(intjjav.s.Iding<aop:befo^i*eth&d=nstartlpansactionr!g$int$;.U.t--execijitiarii(^oidcn. *{..)>"/>--<aop;beforenethodi=n£tartr™rtS£rctton"point£ut="'execu11 *eJikiteMitmE0广 14DP』,cn.itcast.tpiring._01AQP.CustoniErSizrvic*.&jvq(intu..))"/>cnritost;spring._ftlAtM*.Cy^toffitfrSGiirvicv,号.hf(T-})-/>-->cn..itcast,sp尸工fir,rCvstcwerService,*vs.( -->切入点的定义形式逐级应用范围放大<aop:beforemethod="s<aop:beforemethod="startTransactionit= *cn.itca5t.spring._01ACN:ia.*.¥f..))w/>特点:复用性差<1-定义切入点,飙一个名稀一》<aop:pointcutexpre&5ion="execwtionf*cnrTtcajt,spring.02AOP..*P*(..id="ptlH/>ZI--通知类型:前面执行methadj推行国拓照中的哪个方法pointcut:指定切入点{|目前切sav。<aop:beforemethod=tartTrransactton"口01|"11七11七-「已f='1'口土工平》特点:针对该切面具备复用性V!一进行AOPB地贵一<aop:confie>j《!一羲切入点,给定一个名称--> "|《aop:p口inttu比总tp广总s■弓iiSii="白龙皮亡叶]:白1口t匕.土口.*力自.g』£OP\一*f.口,J-id=:"p七7"/)<(--BiSiJIS-><aop:aspectref="tmduice"?仃一,通知类出土前面执行methods执行通毗申的酬个方法pointcut:指定切入点(<aop:beforemetlhad='"stcrrtlrGnsoction'rpointcut-ref=irptl"/></aop:aspect</aopieanfig>特点:多个切面共用5.4通知类型帮助理解的(实际上就是一个环绕通知代码 )"V(.Tr日rLaautiQnMmn日ger工5±c?广亡,『/日门,口二七:口门()■由总thod.invoke(占,白rgm);由总thod.invoke(占,白rgm);beforeTransactionMmit();大}catch(Exceptione){TransactionManager.roLLback();e.printStackTrace();}finally{TransactionManager.r^iea£e();,),returnnull;afterRetumrigaftarThrowingafterbefore:after-returning:after-throwing:after:<aop:aspect^f="t^Advzce',>!-before;前置通知。在切入点方法前的行--〉vwcjp:beforemethod= Tr-tinsection"pointcut=^executionf*cn,itcast►spring+_02AtiviceType+*+save(,.+))"1--after-returning:.在切入点返回她行.如果根心让野代S(原始代即出出了异和询1知不会同行二->aop:after-returningmethod="ccwmnitMpointcuts'^xecutionf*cn□itcost.spring._02AdviceType.*.sa^e(.I--after-throwing:出现异常时进行通知。-->aop:after-throwingm@thod=aroLLback11pointcut="executionf*cn.itcast.spring._92AdviceType.^^save(.^))''f-m代电口:魁通知,不管忠也持它都会执行一》<aop:aftermethods"reLease"pointcut="execution(*cn.itcast.spring._02AdviceType.*.sgvb(..,)"/》</aop:aspect>环绕通知:around
//环绩通知,功能非常建大。//原始/弓(即论核心:哮代码>三在哪里,就在哪里执行」 //运行期间:5P厂1口底把原蛤代码封装到Pf。匚&&dingJoinFoint对盘市publicvoidaround^HroceedingJoinHointpjp)t//获取原才制弋码并调用try(System,oi/f.printin("aroundbefore ");ce&d()-System.otjt.println("aroundafterreturning }catch(Throwablee){System.out*printin("aroundafterthrowing*.**.");e*printStackTrace();}finally{System.out+printing11aroundafter}6、注意:多个前面的通知的执行顺序<aop:config>w箕p「巨与与icin二”总k色已utiQfi「卡匚门,£七c口写士■.互pr足ft耳-_01Adhice.*,合口期£(,-〉J"id=r'ptlRr/><!='学不前罡通知时;口比>京件的Ifi席为耀Q5七广架的栏鬣霞=一|<aop:&spectre+=MIoguflltfviceB,><aop:beforemethods pointcut~ref=irptl"/>V/gQp二名弓<aop:aspect「€千="》<aap:beforemethod=MstartTransaction"ppointcut-ref=nptln/></aop:aspect></aop:conifig>7、获取原始方法的参数和返回值P己CKmge(_ri._LLLd、L*spfifflg._tJZMUV±CMlBgb!〃核心业务 一:publicclassCustomerservice{publicvoidsave(Stringnamejintage){System.out.printIn("CustomerServicesave>>publicStringfimd(){System.out.printIn(^CustomerServicefind,.・・");i return”发现了一条新记录”;,}}I原始方法前面执行的通知:beforearound(before)使用场景:在原始方法执行前,利用前置通知 获取参数,进行一些判断、校验等功能。/在公用代码中f通知}”出原始方法的希数和返回值■ublicclassMyAdvicel{//我取嬖数是有意义,获即返回(fi是没有意即//Pinpoint:9p「in娱把原始方法够故等信息封装至阳象中.如果还要传久其他参敕,询对象心须位于第一个位置publicvoidbefore(loinPointjp){Stringparaml=(String)jp.getArgs()[0];intparam2=(integer)jp+getArgs()[!];System.outprinting"MyAdvicelbefore拿至晾抬方券麴:”+「日户口巾工:":"+p日尸门山2);System.out.printIn("MyAdvicelbefore}publicvoidaround(Proceeding]oinPointpjp)throwsThrowable(Stringparaml-(String)pjpTgetArgs()[0];intparamZ=(integerjpjp.getArgs()[1]JSystem.out.printlnf"MyAdvicelaround罕至晾始方缪徽;114-paraml+":1'+par,am2)\Systeni.out.printin(nMyAd\ficelaround.....n);ceed();<b?anidl=5tDfiwrSe/*wice,rcla55=*icfl『itcast- ng._MJSduiceArgisPCystoufflerSerwi.eebpan><b^:anid=MrtfyArfvtr^I11class="ci^,£teast.spring;_&2AdviceAr^gs. cellT></b-ean><aop:conifig><aop:a&pectref="mydduiceln><aop:beforemethad=^before"pointcLit='"executiafif*cn.itccrst.springvice4rgst*.sai/ef..))*'/><aap:aroundmethod= pointcut= C"打.itccrst,spr1ingP_ P**Bsavef,,))《/△也户:白&p电</aoprconfig>beans>原始方法执行后的通知:after-returningaround(afeter)使用场景:在原始方法执行后,利用后置通知获取原始方法的返回值, 进行一些功能上的改变。after-returning获取返回值:<!--Spring把原蛤方扬返回信我AS<]了returnin徵疑的短中--)<aop:afterreturningmethod="after"「Eturningu"r七*ctLme"fjointuuizn“EJcecMtiorrC*cn.itcast.spring._02AdviceArgs.-、+、<通知:7/茨取原始方法的返回值 ///通知的方法的翎中就必须定义该堂里 /publicvoidafter(5tringrtValue){System.o(jt_println("MyAdvicel白ftu爨取了原始方海^返回值:"+「七匕lu。;System.out.printin("MyAdvicelafter.....,1);)around获取返回值:<aop:aroundmethod="orounJlwpointcut=Nexegrutionftcn.£tccrst.spr£iig._e2^lc/vice^rg5u^\find(..JJ'7>通知:publiuuci'daroiyidl(Pr0,ee«jjnglciinPointpjp)throasThrowabluf |StringrtValue=(String)ceedQ;System+out.printIn("MyAdvicelaround n+rtValu€)j在通知中获取产生的异常:after-throwing<1--在图题中不取厚好方生产生的-><aop:after-throwingmetihodl= rrhrowf"thrxjwings^e"painttut=*exectrtion(*cjiHitct.s/srf._e24di/£ce^r^s-*tt/pdctef..))//获取原始方法调用时产生的异常publicvoidafterThrowing(Throwablee){System,out.printin("MyAdvicelaterThrowing,..."+e.getMessage())System.out.printin("MyAdvicelaterThrowing}•8、SPring中使用注解配置 AOPa、在Spring配置文件中增加以下内容<beansxmlins= spPiwg/rcriHewoF'fa.arg/seows1Mxmlns::xsi=Hhttp;//.wwwPm3rorg/2091『XMLS匚方封jwcj-instsnce口xmlns:aop=Nhttp;//j^ww.springframeMrk、org/schenta/oop"xsi:5chemaLocation="rhttp springframework-or^g/scherna/beanshttp:〃whfl#・sprif?g/r£7iflewt?/sc^eFflcr/beGrts/spring-b'eQrts.xsd1http://wwW/schema/aop/sch&ma/aarp/spring-aop・xsJIbeariiid= tomerServiceMclass=-l,cnBiteast.spring._02Advic&Args.CustomerServiceH></bean>u--•7i.d="用yUdL]匚白工"仃Ir55="1门.itcerst-spring,_02Ad\ficeArgs.MyAdvicel™></bean>aop:aspectj-autoproxy/></b,tearii^b、常用注解@Aspect:指定切面@Before@After@AfterReturning@AfterThrowing@Around|gA严cut"触蜘 |publicclassMyAdvicel(N在通裕中苜粮指定切入点离法式//@Before("execution(*un-itcast>springB annotationAOP=CustonerService»save(*.))")//publicvoidbefare(){//Systemi-out.println("MyAdvicelbeforeB.■一//1.//@After("'executionf*cnBiteast*spring._03annotationAOPaCustDmeirServicetsave(*8))")//publicvoidafterf){// SysterrnaoutBprint1n("MyAdvicelafter."}形式一指定通用的切入点//定义切入点,写到一个方孟上,透方转有返回值和萋数i®Pointcut("execution(*cn.itcast.spring■_®3annotationAOP.Customerservice.sav«(..publicvoidptl(){)@Before("MyAdvicel,ptl()")publicvoidbefore(){SystemaouttprintIn(''MyAdvicelbbefore-..*-11)j)^After("MyAdvicel.ptT(尸)publicveldafter(){System,outtprintIn(''MyAdvicelaafterB----")j)}c、多个前置(或其他)通知的执行顺序按照通知方法名称的字母排序$Befcre("MyAdvicel.ptl()")_publicvoidbeforel(){System.out.printlnf"MyAdvicelbbeforel^Before("MyAdvicel.ptl()'*) |publicvoidbefore(){ —~ ISystem.out.println("MyAdvicelbbefore第四篇:数据库访问及事务管理1、Spring中的JDBC只是对JDBC编码进行了薄薄的封装,不是框架。类似工具的应用DBUtil。是一种DAO设计模式2、导入jar包目前只是用:SPring+JDBC(暂时不管Hibernate的事情)-12Jmy?ql-connertor-Java-5.0.8-bin.jar]spring*Jdbc*3.2.O.RELEASE.jar-12Jmy?ql-connertor-Java-5.0.8-bin.jar]spring*Jdbc*3.2.O.RELEASE.jar■a]spring'tx-3.2.0.RELEASE.jar529KB392KB236KB2007/10/423:112012/12/137352012/12/137:35ExecutableJarFileExecutableJarFileExecutableJarFile3、Spring提供了一个JDBC操作模板JdbcTemplate:类似DButil中的QueryRunner方式一:publicclassUserDaoImpl1implemen'tsUserOaQ{,内朝L条数据publicvoidsave()(DriverMaragerDataSourcedataSource=newDriverManagerDataSource();//设置敝据库的隹按dataSource,setDriverClassHameC"com.mysql.jdbc,Driver");dataSource.setUrl(Njdbc:mysql;///day35");dataScurce-setU£ernama("root"');dataSource.setPasswor*d(bbsorryb,);JdbcTemplateJdbcTemplate=newJdbcT«mplat)5jdbcTemplate.setDataSource(dataSource);jdbcTemplate.execute{"insertintousers(name^age)values('aaa1f10)");<!--方式一:设有即用一<beanid="userDaolr,class=,rcn.itcast.spring._01Advice.UssrDaoImpLlITx/bean>方式二:publicclassUs@rDacIinpl2ImplemQn'tfiU导色「口口口(privateJdbcTemplatejdbcTemplate;publicvoidsetJdbcTemplate(JdbcTemplatejdbcTemplate){this,jdbcTemplate=jdbcTemplate;)//插入一条数据publicvoidsave(){jdbcTemplate.execute(11insertintousers(namejage)values(1bbb1j10)")j})<!一方式二:有些卵用<beani.d=tiuserDao2**class="cn.itcast.spring._&lAdvice.UserDaoImpl2,l><propertyname="JdbcTernpLate"「日千=尸Late"X/property〉</baan><!--定义JDBC梗板<beanid="jdbcTemplate*1class="org.springfrafnetn/ork.jdbc.core.JdbcTemptate*t><propertyname="dataSource"ref="c/atcjSource"X/property></bean>方式三:public 5hUs&rDaoIrflplBextendsJdbcDaoSupportimplementsUserDao(,,播入一条勤据publicvoidsave(){getJdbcTennplete(),execute("insertintousers(namejSge)values(pccc1,10)");)} 口耳统计横式<[--方式三:日后经常用-><be^n class=Mcn.itcast.spriic€,UserDaoImpl3"><propertyriame=r,dataScnjrcer<ref=^dataSource*rX/property></bean>4、Spring中的数据源常用的数据源Spring数据源实现类DriverManagerDataSource:Spring内部的《be副口id-'VotoSour-ce spring/rGHneworfc,jdbc, ^erAfoncpgerDfltaSowrce">prnpprtyname="d「iverCIassWcrme"valuer”仁cwm,mysqt,jdbc,DriverX/property>prqpertyname="urlv^lue=rrjdb匚:mysql:///day350></property>propertynaniE=*'usernamerrvs1ue=lrrootar></property>propertyname="possword"valus=iTsorryH></property></bean>/IhiA-i产%DBCP数据源BasicDataSource拷贝dbcp的jar包:commons-dbcp.jarcommons-pool.jar<!--DBCP数据源<b@anid=rfdata5ourc&DBCPJJcla^s=9torgsapach&.commons.dbcp.BasicDataSourcEN><propertyname=^driverClassjVaw11valuer"com,mysqiBjdbcBDriverwX/property><propertyname=*Fwr,lwvalue="jdbc:mysqL:///day35^></property><propertyname=^LrserniJmea"value=rProot"></property>^propertyname-^password“value-"sorryHX/property></bean>C3P0数据源 ComboPooledDataSource拷贝c3p0的jar包:<1--门P微据调--><beanid=Mdatc?SGwrceC5P0--class=Hcaffl>mchcxnge,v2.c3p0+ComboPoderfDataSowJ'ce*><propertyname= yerCIassuvalue=婚匚otj.砂sqI.jdbc.Dri”》</property>propertyname=MjdbcUrl"value=^jdbc:nys(jt:///day35u></property>property
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论