《spring框架案例学习文档笔记.pdf》由会员分享,可在线阅读,更多相关《spring框架案例学习文档笔记.pdf(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、spring2.5 学习笔记第 1 页 共 45 页目录第一课:面向抽象编程.3 第二课:Jdom的基本使用 .3 第三课:模拟Spring 功能.4 第四课:搭建sping 的运行环境.7 一、建立一个新的项目.7 二、建立 spring的配置文件.7 三、引入 spring的 jar包.7 四、测试代码:.7 五、注意接口的使用:.7 第五课:IOC(DI)配置及应用.8 一、什么是 IOC、DI.8 二、编辑 xml 文件时,没有提示.8 三、注入类型(Injecting dependencies).8(一)setter注入类型 Setter Injection.8(二)构造方法 Con
2、structor Injection.9 四、id、name.10 五、简单属性的注入.10 六、Bean的作用范围scope.11 七、集合注入.11 八、自动装配 autowire.12(一)byName.12(二)byType.13(三)注意.13 九、生命周期.14(一)lazy-init/default-lazy-init.14(二)init-method destroy-method 不要和 prototype一起用(了解).14 第六课:annotation方式 Spring.15 一、开始使用 annotation配置 Spring.15 二、Autowired、Qualifi
3、er.15(一)Autowired.15(二)Qualifier.16 三、Resource(重要、推荐).16(一)JSR-250.16(二)Resource.16 四、Componet.17 五、Scope、PostConstruct、PreDestroy.18 六、注解对应的jar 包.18 第七课:AOP(面向切面编程).一、AOP概念.二、利用动态代理实现面向切面编程19 第八课:Spring AOP 配置选项.一、AOP配置 annotation方式.(一)搭建 annotation开发环境20(二)aspectJ 类库.(三)AOP的 annotation实例.(四)Aspect
4、J 的专业术语.Spring SSH整合 学习笔记-wjt2762010-05-14 spring2.5 学习笔记第 2 页 共 45 页(五)织入点语法.22(六)Advice.23(七)Pointcut.25(八)annotatin方式的 AOP实例.25 二、AOP 配置 xml 方式 .26 三、AOP 实现动态代理注意.27 第九课:DataSource.27 一、Sping 配置数据源:.27 二、注入使用.28 三、dbcp.BasicDataSource.28 第十课 Spring整合 Hiberante3.29 一、Spring 配置 hibernate3的 SessionF
5、actory.29(一)xml 形式的 SessionFactory.29(二)annotation注解方式的SessionFactory.29 二、引入 hibernate所需要使用的jar.30(一)基本 jar.30(二)加入 annotation功能的 jar包.30(三)搭建日志环境并配置显示DDL语句 jar包.30 三、Spring 整合 hibernate3事务 .30(一)Annotation注解方式配置事务管理.30(二)Spring 事务选项.34(三)XML文件形式配置Spring 事务管理.36 四、HibernateTemplate.37(一)HibernateTe
6、mplate.37(二)HibernateDaoSupport.38 第十一课:Spring 整合-SSH.39 一、第一步:加入jar包(需要的 jar包列表).39 二、第二步:首先整合 Spring+Hibernate.40 三、第三步:再来整合Struts2.40 四、struts的读常量:.42 第十二课:DTO、VO.42 一、DTO.42 二、VO.42 第十二课:SSH 整合存在的问题.42 一、Jsp 中访问 Session 时,Session 已经关闭.42 二、如果不配置事务,openSessionView 出现异常 .43 三、中文乱码问题:.43 第十三课:SSH 整
7、合的 jar包.44 一、Struts2.44 二、Hibernate3.3.2.44 三、Spring.45 spring2.5 学习笔记第 3 页 共 45 页第一课:面向抽象编程原来什么类都是写死的,现在是先建立一个大的标准,然后再各个实体类来实现他们的功能,然后在调用的时候,使用这个标准调用,这样,你们那个来都可以被调用。实例:User 实体类publicclass User private String username;private String password;public String getUsername()returnusername;publicvoid setUs
8、ername(String username)this.username=username;public String getPassword()returnpassword;publicvoid setPassword(String password)this.password=password;UserDao接口publicinterface UserDao publicvoid save(User u);UserDao的实现 UserDaoImpl publicclass UserDaoImpl implements UserDao Overridepublicvoid save(Use
9、r u)System.out.println(user save.);User 管理类publicclass UserService /这里需要什么的实现,在new 时,就 new什么的实现,在调用方法时,会调用具体的实现类的方法private UserDao userDao=new UserDaoImpl();public UserDao getUserDao()returnuserDao;publicvoid setUserDao(UserDao userDao)this.userDao=userDao;publicvoid add(User u)userDao.save(u);/这里可以
10、调用任务实现了UserDao接口的 save 方法了。第二课:Jdom的基本使用test.xml 8Gspring2.5 学习笔记第 4 页 共 45 页200 1580 10G500 3000 实例类:publicclass Sample1 publicstaticvoid main(String args)throws Exception SAXBuilder sb=new SAXBuilder();/创建一个 SAXBuilder对象Document doc=sb.build(Sample1.class.getClassLoader().getResourceAsStream(test.
11、xml);/构造文档对象Element root=doc.getRootElement();/获取根元素 List list=root.getChildren(disk);/取名字为 disk的所有元素for(int i=0;ilist.size();i+)Element element=(Element)list.get(i);String name=element.getAttributeValue(name);/获取元素中属性为name 的值 String capacity=element.getChildText(capacity);/取disk子元素 capacity的内容 Stri
12、ng directories=element.getChildText(directories);String files=element.getChildText(files);System.out.println(磁盘信息:);System.out.println(分区盘符:+name);System.out.println(分区容量:+capacity);System.out.println(目录数:+directories);System.out.println(文件数:+files);System.out.println(-);第三课:模拟Spring 功能因为 Spring 是使用
13、 xml 配置文件来实现的,所以我们首先模拟一个xml 的配置文件如下:beans.xml 实现的功能:当类初始化时,一、程序会根据此配置文件初始化文件所有的bean 元素所代表的类,放入一个容器中(使用 Map),然后在需要时,会根据ID值,取出这个对象;1、代码:publicclass ClassPathXmlApplicationContext implements BeanFactory spring2.5 学习笔记第 5 页 共 45 页private Map beans =new HashMap();public ClassPathXmlApplicationContext()th
14、rows Exception SAXBuilder sb=new SAXBuilder();/创建一个 SAXBuilder对象 Document doc=sb.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(beans.xml);/构造文档对象 Element root=doc.getRootElement();/获取根元素/System.out.println(root.getName();List list=root.getChildren(bean);/取名字为 disk的所
15、有元素for(int i=0;ilist.size();i+)Element element=(Element)list.get(i);String id=element.getAttributeValue(id);String clazz=element.getAttributeValue(class);System.out.println(id+:+clazz);Object o=Class.forName(clazz).newInstance();beans.put(id,o);public Object getBean(String name)returnbeans.get(name)
16、;2、测试:BeanFactory factory=new ClassPathXmlApplicationContext();UserService service=new UserService();/UserService service=(UserService)factory.getBean(userService);UserDao userDao=(UserDao)factory.getBean(u);/此得只需要根据ID 就可以取得 Bean 对象来使用service.setUserDao(userDao);User u=new User();service.add(u);二、当某
17、一 bean 元素下存在 property子元素时,则需要把这个子元素作为参数自动注入(使用 setXXX 方法)到这个 bean 对象中1、代码:publicclass ClassPathXmlApplicationContext implements BeanFactory private Map beans =new HashMap();public ClassPathXmlApplicationContext()throws Exception SAXBuilder sb=new SAXBuilder();/创建一个 SAXBuilder对象 Document doc=sb.build
18、(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(beans.xml);/构造文档对象 Element root=doc.getRootElement();/获取根元素 List list=root.getChildren(bean);/取名字为 disk的所有元素for(int i=0;ilist.size();i+)Element element=(Element)list.get(i);String id=element.getAttributeValue(id);String clazz
19、=element.getAttributeValue(class);System.out.println(id+:+clazz);spring2.5 学习笔记第 6 页 共 45 页 Object o=Class.forName(clazz).newInstance();beans.put(id,o);/*以下 for循环是实现模拟spring自动装配(注入)功能/一开始列出此 bean 的所有 property子元素for(Element propertyElement:(List)element.getChildren(property)/获取 property子元素中属性为 name的值
20、(也就是需要注入的参数名称)String name=propertyElement.getAttributeValue(name);/获取 property子元素中属性为 bean 的值 (需要注入参数的类型),此处的 bean 值是已经在上面初始化好了的bean的ID 了。String bean=propertyElement.getAttributeValue(bean);/因此此处获取指定ID 的bean Object beanObject=beans.get(bean);/组成 set 方法名称:set+第一个字母大写 +其它的字母 String methodName=set+name
21、.substring(0,1).toUpperCase()+name.substring(1);System.out.println(methodName=+methodName);/获取 bean 的set 方法,参数(方法名,参数:此参数的类型)Method m=o.getClass().getMethod(methodName,beanObject.getClass().getInterfaces()0);/使用反映机制,执行method 方法,从而实现注入功能 m.invoke(o,beanObject);public Object getBean(String name)return
22、beans.get(name);注意,以上有背景色的部分是实现自动装配(注入)的代码。2、测试publicvoid testAdd_3()throws Exception BeanFactory factory=new ClassPathXmlApplicationContext();UserService service=(UserService)factory.getBean(userService);/以下两行代码在实现注入功能后,将不再需要,因为程序在加载时,已经帮我自动注入这个参数了。/UserDao userDao=(UserDao)factory.getBean(u);/serv
23、ice.setUserDao(userDao);User u=new User();service.add(u);BeanFactory接口代码:publicinterface BeanFactory public Object getBean(String name);spring2.5 学习笔记第 7 页 共 45 页第四课:搭建sping 的运行环境一、建立一个新的项目a)建立新的项目;b)建立需要的 bean 类二、建立 spring 的配置文件你可以在spring 文件中复制代码 !-或是下面的方式-三、引入 spring 的 jar 包可以建立一个User Library 搭建 s
24、pring 环境基本的包:spring.jar 和 commons-logging.jar 四、测试代码:publicvoid testAdd_3()throws Exception BeanFactory factory=new ClassPathXmlApplicationContext(beans.xml);UserService service=(UserService)factory.getBean(userService);User u=new User();service.add(u);注意:这里使用的ClassPathXmlApplicationContext和BeanFact
25、ory是spring的,如下:import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;五、注意接口的使用:ClassPathXmlApplicationContext类实现了 ApplicationContext接口,而 ApplicationContext接口又实现了 BeanFactory接口,这样 BeanFactory是根上的接口。一般建议使用ApplicationContext接口,因为:
26、1、BeanFactory:只是完成 Bean 工厂的基本功能,不能完成bean 的生命周期2、ApplicationContext:除了完成 bean 工厂的基本功能外,还完成的其它的附加功能(比如:bean 的生spring2.5 学习笔记第 8 页 共 45 页命周期),也就是功能更强大这样上面的代码就是publicvoid testAdd_3()throws Exception ApplicationContextfactory=new ClassPathXmlApplicationContext(beans.xml);UserService service=(UserService)
27、factory.getBean(userService);User u=new User();service.add(u);第五课:IOC(DI)配置及应用一、什么是 IOC、DI IOC:Inversion of Control控制反转:原来类的一些成员属性(例如 UserSer vice 中的 userDao 成员属性)是由当前类(UserService)自己控制,现在不是由当前类(UserService)自己控制,而是由容器(运行环境上下文、Spring)帮我们来控制。还是一种说法:原来我们自己控制是控制实现,而现在 Spring 是利用接口来控制的。所以我们由原来控制实现转为sprin
28、gg现在来控制接口(向上反转)作用:实例化具体的bean 动态装配 bean(本来是由我来控制的,现在我交给容器来控制。)DI:Dependency Injection依赖注入:一些成员属性(例如 UserService 中的 userDao 成员属性)依赖 Spring 容器来注入好处:偶合性相对来降低了;另外,注入是使用配置文件来实现,这样修改来非常的方便.DI与IOC 相对来说是一样的概念。二、编辑 xml 文件时,没有提示1、window preferences myeclipse Files and Editing-xml xml catalog 2、add 按钮i.Location
29、:D:share0900_Springsoftspring-framework-2.5.6distresourcesspring-beans-2.5.xsd ii.URI:file:/D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd iii.Key Type:Schema Location iv.Key:http:/www.springframework.org/schema/beans/spring-beans-2.5.xsd 三、注入类型(Injecting d epen
30、d encies)1、setter(重要)2、构造方法(使用的非常少)3、接口注入(可以忘记)(一)setter注入类型 Setter Injection就是在 bean 中使用 setXXX 方法进行注入来在bean 类中,成员属性需要setXXX 方法如下:publicclass UserService private UserDao userDao=new UserDaoImpl();public UserDao getUserDao()returnuserDao;spring2.5 学习笔记第 9 页 共 45 页 publicvoid setUserDao(UserDao userD
31、ao)this.userDao=userDao;publicvoid add(User u)userDao.save(u);spring配置文件如下:!-或是下面的方式-(二)构造方法 Constructor Injection 首先在 bean 类中需要有成员属性作为参数的构造方法代码如下:publicclass UserService private UserDao userDao=new UserDaoImpl();public UserService(UserDao userDao)super();this.userDao=userDao;public UserDao getUserD
32、ao()returnuserDao;publicvoid setUserDao(UserDao userDao)this.userDao=userDao;publicvoid add(User u)userDao.save(u);注意:背景较深的代码为构造方法,带有参数的构造方法spring配置文件如下:!-!-需要注意的:使用 表示,重新 new 一个 bean 然后注入进去,使用 表示,使用已经 new好的 bean,这是只是引用它。-使用 和其子标签 或进行构造方法注入spring2.5 学习笔记第 10 页 共 45 页当构造方法注入时,构造方法中有多个参数时,可以使用以下两种方式注入
33、:bean 代码:publicclass ExampleBean privateintyears;private String ultimateAnswer;public ExampleBean(int years,String ultimateAnswer)this.years=years;this.ultimateAnswer=ultimateAnswer;1、参数类型方式进行区分参数:xml配置文件:注意:这样就是参数类型为int的注入 7500000,而参数类型为java.lang.String的参数注入”42”,但这个方法不适合多个参数是相同的类型。2、利用索引进行区分参数xml 配
34、置文件注意:index=0 的注入到第一个参数,index=1 的注入到第二个参数。构造方法的注入不方便,所以我们需要使用setter注入方式。四、id、name 注 xml 配置文件中 标签中的属性名称如下:或 以上标签中的属性id 与name 作用是一样,唯一的区别:id 中不可以含有特殊字符,而name 中可以有特殊字符五、简单属性的注入当bean 中存在简单属性时的注入方式:bean 代码如下:publicclass UserDaoImpl implements UserDao privateintdaoId;private String daoStatus;publicint get
35、DaoId()returndaoId;spring2.5 学习笔记第 11 页 共 45 页publicvoid setDaoId(int daoId)this.daoId=daoId;public String getDaoStatus()returndaoStatus;publicvoid setDaoStatus(String daoStatus)this.daoStatus=daoStatus;Overridepublicvoid save(User u)System.out.println(user save.);xml 配置文件如下:good 直接使用 value属性或是 子标签来
36、注入六、Bean的作用范围 scope 在Spring配置文件中的 标签可以指定 bean 的作用范围利用 标签中的 scope属性来指定scope 值:1、singleton单例:每次取出的bean 都是同一个 bean。默认就是这个2、prototype原型:每次取的bean 时,都会重新创建一个新的bean 3、request 4、session 5、globalsession 实例:注意:只有 spring与web 框架结合时才会使用request/session/globalsession,但也非常少用,因为其它框架已经有功能非常强大的scope 了(例如:struts的scope)
37、七、集合注入很少用,不重要,参考程序 administratorexample.orgsupportexample.orgdevelopmentexample.orga list element followed by a referencespring2.5 学习笔记第 12 页 共 45 页an entryjust some stringa refjust some string八、自动装配 autowire 含义:在 bean 注入时不需要我们来指定注入哪个具体的bean,而 spring容器会根据我的使用autowire属性来确定自动装配功能。autowire值:1、autodetec
38、t;2、byName:根据 bean 中成员属性的名称来自动装配3、byType:根据 bean 中成员属性的类型来自动装配。4、constaractor 5、default:会根据 标签中的 default-autowire属性来进行自动装配的方式6、no(默认就是这个,需要手动指定注入那个bean)(一)byName 根据 bean 中成员属性的名称来自动装配。bean 代码:UserDaoImpl类publicclass UserDaoImpl implements UserDao privateintdaoId;publicint getDaoId()returndaoId;publi
39、cvoid setDaoId(int daoId)this.daoId=daoId;Overridepublic String toString()returndaoId=+this.daoId;spring2.5 学习笔记第 13 页 共 45 页UserService类publicclass UserService private UserDao userDao=new UserDaoImpl();public UserDao getUserDao()returnuserDao;publicvoid setUserDao(UserDao userDao)this.userDao=userD
40、ao;publicvoid add(User u)userDao.save(u);spring的配置文件测试代码:publicvoid testAdd_4()throws Exception ApplicationContext factory=new ClassPathXmlApplicationContext(beans.xml);UserService service=(UserService)factory.getBean(userService);System.out.println(service.getUserDao();结果:daoId=1说明:因为在配置文件中配置了两个Use
41、rDaoImpl(名称分别:userDao、userDao2)和一个 UserService类。而在 userService的bean 中并没有进行注入配置。而是使用了autowire属性指定了 byName 值,这样结果是正确的,是因为 spring看到 autowire=byName后,会在配置文件中查找bean 的id 与userService成员属性名称一至,然后将其注入,这样就完成了根据名称自动装配功能。(二)byType 根据类型自动装配:就是spring在初始化时,会在配置文件中查找的类型与 userService成员属性的类型相比较,类型一致的将其注入,这样就完成了根据类型自动
42、装配。(三)注意1、自动装配使用并不多;2、只有在使用 anntation注解时会使用的。3、byType如果出现相同类型在两个以上,就会出现异常。spring2.5 学习笔记第 14 页 共 45 页九、生命周期(一)lazy-init/default-lazy-init(不重要)bean 的何时初始化lazy-init值:default:表示使用 标签中的 default-lazy-init值 true:表示 context在初始化时,不会初始化这个bean,只有在使用时才会初始化 false:表示 context在初始化时,就会初始化这个bean 例如:(二)init-method de
43、stroy-method 不要和 prototype一起用(了解)init-method:用于 标签中的属性,表示在初始化这个bean 之前所需要的执行方法destroy-method:用于 标签中的属性,表示在这个bean 销毁时所需要的执行方法。例如关闭连接池。注意:此属性不要与scpoe=”prototype”一起使用,否则会出现其它的问题。例如:userService类的代码publicclass UserService publicvoid init()System.out.println(现在开始初始化UserService);private UserDao userDao=new
44、 UserDaoImpl();public UserDao getUserDao()returnuserDao;publicvoid setUserDao(UserDao userDao)this.userDao=userDao;publicvoid add(User u)userDao.save(u);publicvoid destroy()System.out.println(destory);测试代码:spring2.5 学习笔记第 15 页 共 45 页publicvoid testAdd_4()throws Exception ClassPathXmlApplicationConte
45、xt factory=newClassPathXmlApplicationContext(beans.xml);UserService service=(UserService)factory.getBean(userService);System.out.println(service.getUserDao();/因为在非 webApplacationContext中不能自动 destory,因为需要手动destory/而ApplicationContext没有实现 destory方法,因此需要具体的实现类来destoryfactory.destroy();第六课:annotation方式
46、Spring 一、开始使用 annotation配置 Spring 首先需要在spring 的 xml 配置文件中加入下列红色加粗部分的代码。这样当spring加载配置文件时,发现有 标签后,会帮我加载以下四个类(用于处理annotation方式的配置):1、AutowiredAnnotationBeanPostProcessor,2、CommonAnnotationBeanPostProcessor,3、PersistenceAnnotationBeanPostProcessor,4、RequiredAnnotationBeanPostProcessor 二、Autowired、Qualif
47、ier 还是需要在xml 文件中配置bean(一)Autowired 位置:可以放在成员属性前面,也可以放在getter 或 setter 方法前面,但是建议放在setter 方法前面作用:表示该对应的成员属性可以完成自动配置功能(默认是根据 byType 的)例如:xmp 配置文件:前缀部分见上面代码,以此略。userService publicclass UserService private UserDao userDao=new UserDaoImpl();spring2.5 学习笔记第 16 页 共 45 页public UserDao getUserDao()returnuserD
48、ao;/表示该成员属性可以自动装配(默认根据类型 byType)/annotation建议放在 setter方法前面Autowiredpublicvoid setUserDao(UserDao userDao)this.userDao=userDao;publicvoid add(User u)userDao.save(u);说明:这样 spring就可以帮我们完成自动装配功能(默认是根据 byType)(二)Qualifier 因为 Autowired默认是根据 byType 来自动装配注入的。当有多个相同类型的bean 时,Spring就会出现异常,提示找到多个符合条件的bean,但是不知
49、道选择哪个bean 来注入。这时我们需要另外一注解来告诉Spring用那个 bean,这就是 Qualifier注解,Qualifier使用 value参数来指定注入那个 bean 代码:publicclass UserService private UserDao userDao=new UserDaoImpl();public UserDao getUserDao()returnuserDao;/表示该成员属性可以自动装配(默认根据类型byType)/当配置文件中有多个相同类型的bean 时,需要使用Qualifier注解来说明那个bean 来自动装配Autowiredpublicvoid
50、 setUserDao(Qualifier(value=u)UserDao userDao)this.userDao=userDao;publicvoid add(User u)userDao.save(u);三、Resource(重要、推荐)还是需要在xml 文件中配置bean(一)JSR-250 JCP:Java Community Process是由多个厂家出人来构成的J2EE组织,主要是用于定Java的一些新的标准而每一个标签都可以称之为一个JSR 而每一个新的JSR都会加一个数字是区别什么JSR,可以到官方网看看具体JSR 定了哪些新的标准。(二)Resource 代码:import