spring框架案例学习文档笔记.docx
编辑Xml文献时,没有提醒错误!未定义书签0四、注入类型(InjeCtingdependencies)Setter注入类型SetterInjection(二)构造方法COnStrUCtOrInjectionid、name五、简朴属性的注入六、错误!未定义书签。错误!未定义书签。错误!未定义书签。错误!未定义书签。错误!未定义书签。Bean的作用范围scopeSPring-SSH整合学习笔记八一wjt2762023-05-14七、(二)init-methoddestroy-method不要和ProtOtyPe一起用(了解)错误!未定义书签。第六课:annotation方式SPring错误!未定义书签。一、 开始使用annotation配置SPring错误!未定义书签。二、 (Antnwirpd.(WJualifiar错误!未定义书签。(一) ©Autowired错误!未定义书签。(二) ©Qualifier错误!未定义书签。三、 Res。UrCe(重要、推荐)错误!未定义书签。(一) JSR-250错误!未定义书签。(二) ©Resource错误!未定义书签。四、 Componet错误!未定义书签。五、 ©ScopesPOStConStrUct、Prd)CStroy错误!未定义书签。六、 注解相应的jar包错误!未定义书签。第七课:AOP(面向切面编程)错误!未定义书签。一、 AoP概念错误!未定义书签。二、 运用动态代理实现面向切面编程错误!未定义书签。第八课:SpringAOP配置选项错误!未定义书签。一、 AOP配置annotation方式错误!未定义书签。(一) 搭建annotation开发环境错误!未定义书签。(二) aspectJ类库错误!未定义书签。(三) AOP的annotation实例错误!未定义书签。(四) ASPeCtJ的专业术语错误!未定义书签。(五) 织入点语法错误!未定义书签。(六) Advice错误!未定义书签。二、 AOP配置Xinl方式错误!未定义书签.三、 AoP实现动态代理注意错误!未定义书签。第九课:DataSource错误!未定义书签。一、 SPing配置数据源:错误!未定义书签。二、 注入使用错误!未定义书签。三、 dbcp.BasicDataSource错误!未定义书签。第卜课SPring整合Hiberante3错误!未定义书签。一、 Spring配置hibernate3的SessionFactory错误!未定义书签。(一)XnIl形式的SeSSionFaCtory错误!未定义书签。(二)annotation注解方式的SeSSionFaCtory错误!未定义书签。二、 引入hibernate所需要使用的jar错误!未定义书签。(一) 基本jar错误!未定义书签。(二) 加入annotation功能的jar包错误!未定义书签。(三) 搭建日记环境并配置显示DD1.语句Jar包错误!未定义书签。三、 SPring整合hibernate3事务错误!未定义书签。(一) Annotation注解方式配置事务管理错误!未定义书签。(二) SPring事务选项错误!未定义书签。(三) XM1.文献形式配置SPring事务管理错误!未定义书签。四、 IiibernateTemplate错误!未定义书签。(一) HibernateTemplate错误!未定义书签。(二) H1bernateDaoSupport错误!未定义书签。第十一课:SPring整合-SSH错误!未定义书签。一、第一步:加入jar包(需要的jar包列表)错误!未定义书签。四、StrUtS的读常量:错误!未定义书签.第十二课:DTO.VO错误!未定义书签。一、 DTO错误!未定义书签。二、 VO错误!未定义书签。第十二课:SSH整合存在的问题错误!未定义书签。一、 Jsp中访问Session时,Session已经关闭错误!未定义书签。二、 假如不配置事务,OPenSeSSiOnVieW出现异常错误!未定义书签.三、 中文乱码问题:错误!未定义书签。第十三课:SSH整合的jar包错误!未定义书签。一、 Struts2错误!未定义书签。二、 Hibernate3.3.2错误!未定义书签。三、 Spring错误!未定义书签.第一课:面向抽象编程本来什么类都是写死的,现在是先建立一个大的标准,然后再各个实体类来实现他们的功能,然后在调用的时候,使用这个标准调用,这样,你们那个来都可以被调用。实例:USer实体类publicclassUserprivateStringusername;privateStringpassword;publicStringgetUsername()returnusername;publicvoidsetusername(Stringusername)this.username=username;pxblicStringgetPassword()returnpassword;publicvoidsetpassword(Stringpassword)this.password=password;UserDao接口publicinterfaceUserDaopublicvoidsave(Useru);)UserDao的实现UserDaoImpIpublicclassUserDaoImplimplementsUserDaoOverridepublicvoidsave(Useru)System,out.printIn("usersave.);)USer管理类publicclassUserService/这里需要什么的实现,在new时,就new什么的实现,在调用方法时,会调用品体的实现类的方法privateUserDaouserDao=newUserDaoImpl();publicUserDaogetUserDao()returnuserDao;publicvoidSetUserDao(UserDaouserDao)this.userDao=userDao;publicvoidadd(Useru)userDao.save();/这里可以调用任务实现了USerDaO接口的SaVe方法T。)第二课:,dom的基本使用test.xml<?xmlversion=,1.O"encoding="UTF-8"1><HD><diskname="C"><capacity>8G<capacity><directories>200<directories><files>1580<files><disk><diskname=',D,><capacity>10G<capacity><directories>500<directories><files>3000<files><disk><HD>实例类:publicclassSamplelpublicstaticvoidmain(Stringargs)throwsExceptionSAXBuildersb=newSAXBUiIder();/创建-个SAXBUiIder对象Documentdoc=sb.build(Samplel.class.getClass1.oader().getResorCeAsStream(11test.xml");构造文档对象Elementroot=doc.getRootElement();/获取根元素1.iStlist=root.getChildren("disk");/取名字为disk的所有元素for(inti=0;i<list.size();i+)Elementelement=(Element)list.get(i);Stringname=element.getAttributeValue(,name");/获取元素中属性为name的值Stringcapacity=element.getChildText("capacity");/取disk子元素CaPaCiEy的内容Stringdirectories=element.getChildText("directories");Stringfiles=element.getChildText(,files");System,out.printin("磁盘信息:");System.out.printIn("分区盘符:"+name);System.out.printIn(“分区容量:"+capacity);System,out.printIn(',目录数:"+directories);System.out.println("文献数:"+files);System,out.printIn(,',);第三课:模拟SPring功能由于SPring是使用XmI配置文献来实现的,所以我们一方面模拟一个XmI的配置文献如下:beans.×ml<beanid="u"class="com.wjt276.dao.impl.UserDaoImpl,7><beanid="userService"class="com.wjt276.service.UserService"><propertyname="userDao"bean="u"><bean>实现的功能:当类初始化时,一、程序会根据此配置文献初始化文献所有的bean元素所代表的类,放入一个容器中(使用Map),然后在需要时,会根据ID值,取出这个对象;1、代码:PUbliCclassClasspathxmlApplicationContextimplementsBeanFactoryprivateMap<String,Object>beans=newHaShMaPString,Object>();publicClasspathxmlApplicationContext()throwsExceptionSAXBuildersb=newSAXBUiIeIer();创建一个SAXBUiIder对象Documentdoc=sb.build(ClassPathXmlApplicationContext.class.getClass1.oader().getResourceAsStream(,beans.xml");构造文档对象Elementroot=doc.getRootElement();/获取根元素/System.out.printIn(root.getNameO);1.iStlist=root.getChildren(,beann);/取名字为disk的所有元素for(inti=0;i<list.sizeO;i+)Elementelement=(Element)list.get(i);Stringid=element.getAttributeValue("id");Stringclazz=element.getAttributeValue("class");System,out.printIn(id+,:"+clazz);Objecto=Class.forNameclazz).newlnstance();beans.put(id,o);)publicObjectgetBean(Stringname)(returnbeans.get(name);2、测试:BeanFactoryfactory=newClasspathxmlApplicationContext();UserServiceservice=newUserService();/UserServiceservice=(UserService)factory.getBean(11userService11);UserDaouserDao=(USerDao)factory.getBean(,u");此得只需要根据工D就可以取得Bean对象来使用service.SetUserDao(userDao);Useru=newUser();service.add(u);当某一bean元素下存在ProPerty子元素时,则需要把这个子元素作为参数自动注入(使用SetXXX方法)到这个bean对象中1、代码:pxblicclassClassPathXmlApplIcationContexti11lementsBeanFactoryprivateMap<String,Object>beans=newHaShMaPString,Object>O;publicClasspathxmlApplicationContext()throwsExceptionfSAXBuildersb=newSAXBUilder();/创建'个SAXBUilder对象Documentdoc=sb.build(ClasspathxmlApplicationContext.class.getClass1.oader().getResourceAsStream("beans.xml,);构造文档对象Elementroot=doc.getRootElement();获取根元素1.iStlist=root.getChildren(ubean,');取名字为disk的所有元素for(inti=0;i<list.size();i+)Elementelement=(Element)list.get(i);Stringid=element.getAttributeValue(,id");StringClaZZ=element.getAttributeValue("class");System,out.printIn(id+,:,+clazz);Objecto=Class.forNameclazz).newlnstance();beans.put(id,o);/*以下for循环是实现模拟SPring自动装配(注入)功能/一开始列出此bean的所有PrOPerty子元素for(ElementpropertyElement:(1.istxElemenC)element.getChildren(,roper1.y,')/获取pr。Perty子元素中属性为name的值(也就是需要注入的参数名称)Stringname=propertyElement.getAttributeValue("name");获取ProPerty子元素中属性为bean的值(需要注入参数的类型),此处的bean值是已经在上面初始化好了的bean的工D了。Stringbean=propertyElement.getAttributeValue("bean");/因此此处获取指定工D的beanObjectbeanbject=beans.get(bean);/组成Set方法名称:set+第一个字母大写+其它的字母StringmethodName="set,'+name.substring(0rl).toUpperCase()+name.substring(1);System.out.printinCmethodName="+methodName);获取bean的Set方法,参数(方法名,参数:此参数的类型)Methodm=o.getClass().getMethod(methodName,beanbject.getClass().getlnterfaces()(0);使用反映机制,执行method方法,从而实现注入功能m.invoke(o,beanbject);)publicObjectgetBean(Stringname)returnbeans.get(name);)注意,以上有背景色的部分是实现自动装配(注入)的代码。2、测试pvblicvoidtestAdd_3()throwsExceptionBeanFactoryfactory=newCIaSSPathXmIAPPliCatiOnConteXt();UserServiceservice=(UserService)factory.getBean(nuserServicen);/以下两行代码在实现注入功能后,将不再需要,由于程序在加教时,已经帮我自动注入这个参数了。/UftsrDaoUS(SrDao=(U-erDao)factOry.Bean(''u'');/service.6CtU6crDaou6crDao);Useru=newUser();service.add(U);)BeanFaCtOry接口代码:publicinterfaceBeanFactorypublicObjectgetBean(Stringname);)第四课:搭建SPing的运营环境一、建立一个新的项目a)建立新的项目;b)建立需要的bean类二、建立SPring的配置文献你可以在spring文献中复制代码<?xmlversion=,1.Onencoding=,'UTF-"?><beansxmlns=""xmlns:xsi="”xsi:Schema1.ocation=",><beanid="u"class="com.wjt276,dao,impl.UserDaoImpl11><bean><beanid="userService"class="com.wjt276.service.UserService"><propertyname=nuserDao"ref="u"><!-这里的ref表达参考那个bean-><!一或是下面的方式<propertyname=,serDao,'><refbean="11><ref><property>可以建立个User1.ibrary搭建spring环境基本的包:SPringJar和Commons-IoggingJar四、测试代码:publicvoidtestAdd_3()throwsExceptionBeanFactoryfactory=newClassPathXmlApplicationContext(11beans.xnl11);UserServiceservice=(UserService)factory.getBean(nUserService,);Useru=newUser();service.add();注意:这里使用的Cj1.aSSPathXInlAPPIiCatiOnCOnteXt和BeanFaCtOry是SPring的,如下:importorg.springframework.beans.factory.BeanFactory;importorg.springframework.context.support.ClassPathXmlApplicationContext;五、注意接口的使用:CIaSSPathXrnIAPPIiCatiOnConteXt类实现了APPIiCatiOnCOnteXt接口,而APPliCatiOnConteXt接口又实现了BeanFaCtOry接口,这样BeanFaCtorV是根上的接口。-般建议使用APPliCatiOnCOnteXt接口,由于:1、BeanFaCtOry:只是完毕Bean工厂的基本功能,不能完毕bean的生命周期2、ApplicationContext:除了完毕bean工厂的基本功能外,还完毕的其它的附加功能(比如:bean的生命周期),也就是功能更强大这样上面的代码就是publicvoidtestAdd_3()throwsExceptionAPPIiCatiOnCOnteXtfactory=newClassPathXmlApplicationContext("beans.xml");UserServiceservice=(UserService)factory.getBean(11userService11);Useru=newUser();service.add(u);第五课:IOC(Dl)配置及应用一、 什么是100、DlIOC:InversionofControI控制反转:本来类的一些成员属性(例如USerSerViCe中的USerDaO成员属性)是由当前类(USerSerViCe)自己控制,现在不是由当前类(USerSerViCe)自己控制,而是由容器(运营环境上下文、SPring)帮我们来控制。还是一种说法:本来我们自己控制是控制实现,而现在SPring是运用接口来控制的。所以我们由本来控制实现转为SPringg现在来控制接口(向上反转)作用:实例化具体的bean动态装配bean(本来是由我来控制的,现在我交给容器来控制。)DEDependencyInjeCtiOn依赖注入:一些成员属性(例如USerSerViCe中的USerDac)成员属性)依赖SPring容器来注入好处:偶合性相对来减少了;此外,注入是使用配置文献来实现,这样修改来非常的方便.Dl与IoC相对来说是同样的概念。二、 编辑Xml文献时,没有提醒i. window-preferences-myeclipse-FilesandEditing-xml-xmlcatalog2、add按钮1. 1.ocation:D:share0900_Springsoftspring-framework-2.5.6distresourcesspring-beans-2.5.×sdURI:file:/D:/shareX)900_Spring/soft/spring-framework-2.5.dist/resources/spring-beans-2.5.xsdiii. KeyType:Schema1.ocationiv. Key:三、 注入类型(Injectingdependencies)1、SetteK重要)2、构造方法(使用的非常少)3、接口注入(可以忘掉)(一)setter注入类型SetterInjection就是在bean中使用SetXXX方法进行注入来在bean类中,成员属性需要SetXXX方法如下:publicclassUserService(privateUserDaouserDao=newUserDaoImpl();publicUserDaogetUserDao()returnuserDao;)publicvoidSetUserDao(UserDaouserDao)this.userDao=userDao;publicvoidadd(Useru)userDao.save(u);)SPring配置文献如下:<beanid="u"class="com.wjt276.dao.impl.UserDaoImpl"><bean><beanid=11userServicet,CIaSS="com.wjt276.service.UserServicen><propertyname="userDao',ref="u"><!-这里的ref表达参考id=u的那个bean><!一或是下面的方式<propertyname='*userDao,><refbean=nu11><ref><roerty>一><bean>(二)构造方法ConstructorInjection一方面在bean类中需要有成员属性作为参数的构造方法代码如下:publicclassUserServiceprivateUserDaouserDao=newUserDaoImpl();publicUserService(UserDaouserDao)super();this.userDao=userDao;)publicUserDaogetUserDao()returnuserDao;publicvoidSetUserDao(UserDaouserDao)this.userDao=userDao;publicvoidadd(Useru)userDao.save(u);)注意:背景较深的代码为构造方法,带有参数的构造方法<!需要注意的:使用<bean>表达,重新new一个bean然后注入进去,使用<ref>表达,使用已经new好的bean,这是只是引用它。-><constructor-arg><bean>使用<constructor-arg>和其子标签<bean>或<ref>进行构造方法注入当构造方法注入时,构造方法中有多个参数时,可以使用以下两种方式注入:bean代码rpublicclassEXamPIeBeanprivateintyears;privateStringUltimateAnswer;publicExampleBean(intyears,StringUltimateAnswer)this.years=years;this.UltimateAnswer=UltimateAnswer;)1、参数类型方式进行区分参数:xml配置文献:<beanid="exampleBean"class="examples.ExampleBean"><constructor-argtype=,int"value=',7500000"><construetor-argtype="java.lang.String"value="42"><bean>注意:这斤就.是咨数类型为int的注入7500000,而参数类型为java.lang.String的参总3注入“42”,但这个方法不适合多个参数是相同的类型。2、运用索引进行区分参数XmI配置文献<pearjid="exampleBean"class="examples.ExampleBean"><constructor-argindex="0"value="7500000"><construetor-argindex=,1"value=n42,>注意:index=。的注入到第一个参数,index=1的注入到第二个参数”构造方法的注入不方便,所以我们需要使用Setter注入方式。四、 id、name注Xml配置文献中<bean>标签中的属性名称如下:<beanid=,u"class="com.wjt276.dao,impl.UserDaoImpl"><bean>或Cbeanname="u"class="com.wjt276.dao.impl.UserDaoIinpl"><bean>以上标签中的属性id与name作用是同样,唯一的区别,id中不可以具有特殊字符,而name中可以有特殊字符五、简朴属性的注入当bean中存在简朴属性时的注入方式:bean代码如下:publicclassUserDaoImplimplementsUserDaoprivateintdaold;privateStringdaoStatus;publicintgetDaoId()returndaold;publicvoidSetDaoId(intdaold)this.daold=daold;publicStringgetDaoStatus()returndaoStatus;publicvoidSetDaoStatus(StringdaoStatus)this.daoStatus=daoStatus;Overridepublicvoidsave(User)System.out.printin("usersave)XmI配置文献如下:<beanid=,u"class=1,com.wjt276.dao.impl.UserDaoImpl,><propertyname="daold"value=MSMx/property><propertyname=,daoStatus,><vale>good<vale><proerty><bean>直接使用ValUe属性或是value>子标签来注入六、Bean的作用范围scope在SPring配置文献中的<bean>标签可以指定bean的作用范围运用<bean>标签中的SCoPe属性来指定scope®:1、SingIetOn单例:每次取出的bean都是同一个bean。默认就是这个2、PrOtOtyPe原型:每次取的bean时,都会重新创建一个新的bean3、 request4、 session5、 globalsession实例:<beanid="u"class=ncom.wjt276,dao.impl.UserDaoImpl"><bean><beanname="userService"class="com.wjt276.service.UserService',scope="prototype11><propertyname="userDao"ref="u,'><bean>注意:只有SPring与Web框架结合时才会使用request/SeSSiOn/globalsession,但也非常少用,由于其它框架已有功能非常强大的SCQPe了(例如:StrUtS的SCOPe)七、集合注入很少用,不重要,参考程序<peanid="u"class="com.wjt276.dao.impl.UserDaoImpl"><propertyname="properties"><props><propkey="administrator"><prop><propkey="support11><prop><prokey="development,><prop><props><property><propertyname=11list,><list><value>alistelementfollowedbyareference<value><refbean="myDataSource"><list><property><propertyname="map"><map><entry><key><value>anentry<value><key><value>justsomestring<value><entry><entry><key><value>aref<value><key><refbean="myDataSource"><entry><map><property><proertyname=,set,><set><value>jstsomestring<value><refbean="myDataSource"><set><property>八、自动装配autowire含义:在bean注入时不需要我们来指定注入哪个具体的bean,而SPring容器会根据我的使用autowire属性来拟定自动装配功能。autowire(S:1、autodetect;2、byName:根据bean中成员属性的名称来自动装配3、byType:根据bean中成员属性的类型来自动装配。4、Constaractor5、default:会根据beans标签中的default-autowire属性来进行自动装配的方式6、no(默认就是这个,需要手动指定注入那个bean)()byName根据bean中成员属性的名称来自动装配。bean代码:UserDaoImplpublicclassUserDaoImplimplementsUserDaoprivateintdaold;publicintgetDaoId()returndaold;publicvoidSetDaoId(intdaold)this.daold=daold;OverridepublicStringtoString()return'*daold=,+this.daold;USerSerViCe类publicclassUserServiceprivateUserDaouserDao=newUserDaoImpl();publicUserDaogetUserDao()returnuserDao;this.serDao=serDao;publicvoidadd(Useru)userDao.save(u);SPring的配置文献<beanid="userDao"class="com,wjt276,dao,impl.UserDaoImpl"><propertyname=,daold"value="1,><property><bean><beanid="userDao2"class="com.wjt276.dao.impl.UserDaoImpl,><propertyname=,daold"value=,2,><property><bean><beanname=nUserService"class=,con.wjt276.service.UserService"scope="prototype"aur.owire="byName"<bean>测试代码:publicvoidtestAdd|()throwsExceptionApplicationContextfactory=newClasspathxmlApplicationContext("beans.xml");