1、Spring SSH 整合 学习笔记-wjt2762010-05-14spring2.5 学习笔记 第 2 页 共 47 页目录第一课:面向抽象编程 .4第二课:Jdom 的基本使用 4第三课:模拟 Spring 功能 5第四课:搭建 sping 的运行环境 .8一、 建立一个新的项目 .8二、 建立 spring 的配置文件 8三、 引入 spring 的 jar 包 8四、 测试代码: .8五、 注意接口的使用: .8第五课:IOC(DI)配置及应用 9一、 什么是 IOC、DI .9二、 编辑 xml 文件时,没有提示 .9三、 注入类型(Injecting dependencies)
2、.9(一) setter 注入类型 Setter Injection.9(二) 构造方法 Constructor Injection .10四、 id、name 11五、 简单属性的注入 11六、 Bean 的作用范围 scope12七、 集合注入 12八、 自动装配 autowire .13(一) byName.13(二) byType.14(三) 注意 .14九、 生命周期 15(一) lazy-init/default-lazy-init15(二) init-method destroy-method 不要和 prototype 一起用(了解) 15第六课:annotation 方式 S
3、pring.16一、 开始使用 annotation 配置 Spring 16二、 Autowired、Qualifier 16(一) Autowired.16(二) Qualifier.17三、 Resource(重要、推荐) .17(一) JSR-25017(二) Resource17四、 Componet.18五、 Scope、PostConstruct、PreDestroy .19六、 注解对应的 jar 包 19第七课:AOP(面向切面编程) .19一、 AOP 概念 19二、 利用动态代理实现面向切面编程 20第八课:Spring AOP 配置选项 .21一、 AOP 配置 ann
4、otation 方式 .21(一) 搭建 annotation 开发环境 21(二) aspectJ 类库 .22(三) AOP 的 annotation 实例 22spring2.5 学习笔记 第 3 页 共 47 页(四) AspectJ 的专业术语 .23(五) 织入点语法 .23(六) Advice.24(七) Pointcut.26(八) annotatin 方式的 AOP 实例 .26二、 AOP 配置 xml 方式 27三、 AOP 实现动态代理注意 28第九课:DataSource 28一、 Sping 配置数据源: 28二、 注入使用 29三、 dbcp.BasicDataS
5、ource29第十课 Spring 整合 Hiberante330一、 Spring 配置 hibernate3 的 SessionFactory30(一) xml 形式的 SessionFactory.30(二) annotation 注解方式的 SessionFactory30二、 引入 hibernate 所需要使用的 jar 31(一) 基本 jar .31(二) 加入 annotation 功能的 jar 包 31(三) 搭建日志环境并配置显示 DDL 语句 jar 包 .31三、 Spring 整合 hibernate3 事务 31(一) Annotation 注解方式配置事务管理
6、 31(二) Spring 事务选项 35(三) XML 文件形式配置 Spring 事务管理 37四、 HibernateTemplate.38(一) HibernateTemplate38(二) HibernateDaoSupport39第十一课:Spring 整合-SSH .40一、 第一步:加入 jar 包(需要的 jar 包列表) 40二、 第二步: 首先整合 Spring + Hibernate 41三、 第三步:再来整合 Struts2 41四、 struts 的读常量: .43第十二课:DTO、VO .43一、 DTO.43二、 VO43第十二课:SSH 整合存在的问题 43一
7、、 Jsp 中访问 Session 时,Session 已经关闭 .43二、 如果不配置事务,openSessionView 出现异常 44三、 中文乱码问题: 44第十三课:SSH 整合的 jar 包 45一、 Struts2.45二、 Hibernate3.3.245三、 Spring46spring2.5 学习笔记 第 4 页 共 47 页第一课:面向抽象编程原来什么类都是写死的,现在是先建立一个大的标准,然后再各个实体类来实现他们的功能,然后在调用的时候,使用这个标准调用,这样,你们那个来都可以被调用。实例:User实体类public class User private String
8、 username;private String password;public String getUsername() return username; public void setUsername(String username) this.username = username;public String getPassword() return password;public void setPassword(String password) this.password = password;UserDao 接口public interface UserDao public voi
9、d save(User u);UserDao 的实现 UserDaoImplpublic class UserDaoImpl implements UserDao Overridepublic void save(User u) System.out.println(“user save.“);User管理类public class UserService /这里需要什么的实现,在new时,就new 什么的实现,在调用方法时,会调用具体的实现类的方法private UserDao userDao = new UserDaoImpl();public UserDao getUserDao() r
10、eturn userDao;public void setUserDao(UserDao userDao) this.userDao = userDao; public void add(User u)userDao.save(u);/这里可以调用任务实现了UserDao接口的save方法了。第二课:Jdom 的基本使用test.xml8G spring2.5 学习笔记 第 5 页 共 47 页200 1580 10G 500 3000 实例类:public class Sample1 public static void main(String args) throws Exception
11、SAXBuilder sb=new SAXBuilder();/创建一个 SAXBuilder对象Document doc=sb.build(Sample1.class.getClassLoader().getResourceAsStream(“test.xml“);/构造文档对象Element root=doc.getRootElement(); /获取根元素List list=root.getChildren(“disk“);/取名字为disk的所有元素 for(int i=0;i实现的功能:当类初始化时,一、 程序会根据此配置文件初始化文件所有的bean元素所代表的类,放入一个容器中(使
12、用Map),然后在需要时,会根据ID值,取出这个对象;1、 代码:public class ClassPathXmlApplicationContext implements BeanFactory spring2.5 学习笔记 第 6 页 共 47 页private Map beans = new HashMap();public ClassPathXmlApplicationContext() throws ExceptionSAXBuilder sb=new SAXBuilder();/创建一个SAXBuilder对象Document doc=sb.build(ClassPathXmlA
13、pplicationContext.class.getClassLoader().getResourceAsStream(“beans.xml“); /构造文档对象Element root=doc.getRootElement(); /获取根元素/System.out.println(root.getName();List list=root.getChildren(“bean“);/取名字为disk的所有元素 for(int i=0;i beans = new HashMap();public ClassPathXmlApplicationContext() throws Exception
14、SAXBuilder sb=new SAXBuilder();/创建一个 SAXBuilder对象Document doc=sb.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(“beans.xml“); /构造文档对象Element root=doc.getRootElement(); /获取根元素List list=root.getChildren(“bean“);/取名字为disk的所有元素 for(int i=0;i)element.getChildren(“property
15、“)/获取property子元素中 属性为name的值(也就是需要注入的参数名称)String name = propertyElement.getAttributeValue(“name“);/获取 property子元素中 属性为bean的值 (需要注入参数的类型),此处的bean值是已经在上面初始化好了的bean的ID了。String bean = propertyElement.getAttributeValue(“bean“);/因此此处获取指定ID的beanObject beanObject = beans.get(bean);/组成set 方法名称:set + 第一个字母大写 +
16、 其它的字母String methodName = “set“ + name.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, beanOb
17、ject); public Object getBean(String name)return beans.get(name);注意,以上有背景色的部分是实现自动装配(注入)的代码。2、 测试public void testAdd_3() throws Exception BeanFactory factory = new ClassPathXmlApplicationContext();UserService service = (UserService)factory.getBean(“userService“);/以下两行代码在实现注入功能后,将不再需要,因为程序在加载时,已经帮我自动注
18、入这个参数了。/UserDao userDao = (UserDao)factory.getBean(“u“);/service.setUserDao(userDao);User u = new User();service.add(u);BeanFactory接口代码:public interface BeanFactory spring2.5 学习笔记 第 8 页 共 47 页public Object getBean(String name);第四课:搭建 sping 的运行环 境、 建立一个新的项目a) 建立新的项目;b) 建立需要的bean类、 建立 spring 的配置文件你可以在
19、 spring 文件中复制代码、 引入 spring 的 jar 包可以建立一个 User Library搭建 spring 环境基本的包:spring.jar 和 commons-logging.jar、 测试代码:public void testAdd_3() throws Exception BeanFactory factory = new ClassPathXmlApplicationContext(“beans.xml“);UserService service = (UserService)factory.getBean(“userService“);User u = new U
20、ser();service.add(u);注意:这里使用的ClassPathXmlApplicationContext和BeanFactory 是spring 的,如下:import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;、 注意接口的使用:ClassPathXmlApplicationContext类实现了ApplicationContext接口,而ApplicationContext接口又实
21、现了BeanFactory接口,这样BeanFactory是根上的接口。一般建议使用ApplicationContext接口,spring2.5 学习笔记 第 9 页 共 47 页因为:1、BeanFactory:只是完成Bean工厂的基本功能,不能完成bean的生命周期2、ApplicationContext:除了完成bean工厂的基本功能外,还完成的其它的附加功能( 比如:bean 的生命周期),也就是功能更强大这样上面的代码就是public void testAdd_3() throws Exception ApplicationContext factory = new ClassPa
22、thXmlApplicationContext(“beans.xml“);UserService service = (UserService)factory.getBean(“userService“);User u = new User();service.add(u);第五课:IOC(DI)配置及应用、 什么是 IOC、DIIOC: Inversion of Control控制反转:原来类的一些成员属性(例如UserService中的userDao成员属性)是由当前类(UserService)自己控制,现在不是由当前类 (UserService)自己控制,而是由容器(运行环境上下文、Sp
23、ring) 帮我们来控制。还是一种说法:原来我们自己控制是控制实现,而现在Spring是利用接口来控制的。所以我们由原来控制实现转为springg现在来控制接口(向上反转 )作用:实例化具体的bean动态装配bean(本来是由我来控制的,现在我交给容器来控制。)DI:Dependency Injection依赖注入 :一些成员属性(例如UserService中的userDao成员属性) 依赖Spring容器来注入好处:偶合性相对来降低了;另外,注入是使用配置文件来实现,这样修改来非常的方便.DI与IOC相对来说 是一样的概念。、 编辑 xml 文件时,没有提示1、 window prefere
24、nces myeclipse Files and Editing - xml xml catalog2、 add 按钮i. Location: D:share0900_Springsoftspring-framework-2.5.6distresourcesspring-beans-2.5.xsdii. URI: file:/D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsdiii. Key Type: Schema Locationiv. Key: http:/www.spr
25、ingframework.org/schema/beans/spring-beans-2.5.xsd、 注入类型(Injecting dependencies)1、 setter(重要)2、 构造方法(使用的非常少)3、 接口注入(可以忘记)spring2.5 学习笔记 第 10 页 共 47 页(一) setter 注入类型 Setter Injection就是在bean中使用setXXX方法进行注入来在bean类中,成员属性需要setXXX方法如下:public class UserService private UserDao userDao = new UserDaoImpl();pu
26、blic UserDao getUserDao() return userDao;public void setUserDao(UserDao userDao) this.userDao = userDao;public void add(User u) userDao.save(u);spring配置文件如下:(二) 构造方法 Constructor Injection首先在 bean 类中需要有成员属性作为参数的构造方法代码如下:public class UserService private UserDao userDao = new UserDaoImpl();public UserS
27、ervice(UserDao userDao) super();this.userDao = userDao;public UserDao getUserDao() return userDao;public void setUserDao(UserDao userDao) this.userDao = userDao;public void add(User u) userDao.save(u);注意:背景较深的代码为构造方法,带有参数的构造方法spring 配置文件如下:表示,重新new一个bean然后注入进去,使用表示,使用已经new好的bean,这是只是引用它。 使用和其子标签或进行构
28、造方法注入当构造方法注入时,构造方法中有多个参数时,可以使用以下两种方式注入:bean 代码:public class ExampleBean private int years;private String ultimateAnswer;public ExampleBean(int years, String ultimateAnswer) this.years = years;this.ultimateAnswer = ultimateAnswer;1、参数类型方式进行区分参数:xml 配置文件:注意:这样就是参数类型为 int 的注入 7500000,而参数类型为 java.lang.S
29、tring 的参数注入”42”,但这个方法不适合多个参数是相同的类型。2、利用索引进行区分参数xml配置文件注意:index=0 的注入到第一个参数,index=1 的注入到第二个参数。构造方法的注入不方便,所以我们需要使用 setter 注入方式。、 id、name注 xml 配置文件中标签中的属性名称如下:或以上标签中的属性id与name作用是一样,唯一的区别:id中不可以含有特殊字符,而name中可以有特殊字符spring2.5 学习笔记 第 12 页 共 47 页、 简单属性的注入当bean 中存在简单属性时的注入方式:bean代码如下:public class UserDaoImpl
30、 implements UserDao private int daoId;private String daoStatus;public int getDaoId() return daoId;public void setDaoId(int daoId) this.daoId = daoId;public String getDaoStatus() return daoStatus;public void setDaoStatus(String daoStatus) this.daoStatus = daoStatus;Overridepublic void save(User u) Sy
31、stem.out.println(“user save.“);xml配置文件如下:good直接使用 value属性或是子标签来注入、 Bean 的作用范围 scope在Spring配置文件中的标签可以指定bean 的作用范围利用标签中的scope 属性来指定scope值:1、 singleton单例:每次取出的bean都是同一个bean。默认就是这个2、 prototype原型:每次取的bean时,都会重新创建一个新的bean 3、 request4、 session5、 globalsession实例:注意:只有spring与web 框架结合时才会使用request/session/glob
32、alsession,但也非常少用,因为其它框架已经有功能非常强大的scope了( 例如:struts的scope)、 集合注入很少用,不重要,参考程序administratorexample.orgspring2.5 学习笔记 第 13 页 共 47 页supportexample.orgdevelopmentexample.orga list element followed by a referencean entryjust some stringa refjust some string、 自动装配 autowire含义:在bean注入时不需要我们来指定注入哪个具体的bean,而spr
33、ing容器会根据我的使用autowire属性来确定自动装配功能。autowire值:1、 autodetect;2、 byName:根据bean中成员属性的名称来自动装配3、 byType:根据bean 中成员属性的类型来自动装配。4、 constaractor5、 default:会根据标签中的default-autowire属性来进行自动装配的方式6、 no(默认就是这个,需要手动指定注入那个 bean)(一) byName根据bean 中成员属性的名称来自动装配。bean代码:spring2.5 学习笔记 第 14 页 共 47 页UserDaoImpl类public class Use
34、rDaoImpl implements UserDao private int daoId;public int getDaoId() return daoId;public void setDaoId(int daoId) this.daoId = daoId;Overridepublic String toString()return “daoId=“ + this.daoId;UserService类public class UserService private UserDao userDao = new UserDaoImpl();public UserDao getUserDao(
35、) return userDao;public void setUserDao(UserDao userDao) this.userDao = userDao;public void add(User u)userDao.save(u);spring的配置文件测试代码:public void testAdd_4() throws Exception ApplicationContext factory = new ClassPathXmlApplicationContext(“beans.xml“);UserService service = (UserService)factory.getB
36、ean(“userService“);System.out.println(service.getUserDao();结果:daoId=1说明:因为在配置文件中配置了两个UserDaoImpl(名称分别:userDao 、userDao2)和一个UserService类。而在userService的bean中并没有进行注入配置。而是使用了autowire属性指定了byName 值,这样结果是正确的,是因为spring看到autowire=byName后,会在配置文件中查找bean的id与userService 成员属性名称一至,然后将其注入,这样就完成了根据名称自动装配功能。spring2.5
37、 学习笔记 第 15 页 共 47 页(二) byType根据类型自动装配:就是spring在初始化时,会在配置文件中查找 的类型与userService成员属性的类型相比较,类型一致的将其注入,这样就完成了根据类型自动装配。(三) 注意1、 自动装配使用并不多;2、 只有在使用anntation注解时会使用的。3、 byType如果出现相同类型在两个以上,就会出现异常。、 生命周期(一) lazy-init/default-lazy-init(不重要)bean的何时初始化lazy-init值:default:表示使用标签中的default-lazy-init值true:表示context在初
38、始化时,不会初始化这个bean,只有在使用时才会初始化false:表示context在初始化时,就会初始化这个bean例如:(二) init-method destroy-method 不要和 prototype 一起用(了解)init-method:用于标签中的属性,表示在初始化这个bean之前所需要的执行方法destroy-method:用于标签中的属性,表示在这个bean销毁时所需要的执行方法。例如关闭连接池。注意:此属性不要与scpoe=”prototype”一起使用,否则会出现其它的问题。例如:userService类的代码public class UserService sprin
39、g2.5 学习笔记 第 16 页 共 47 页public void init()System.out.println(“现在开始初始化UserService“);private UserDao userDao = new UserDaoImpl();public UserDao getUserDao() return userDao; public void setUserDao(UserDao userDao) this.userDao = userDao;public void add(User u)userDao.save(u);public void destroy()System.
40、out.println(“destory“);测试代码:public void testAdd_4() throws Exception ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext(“beans.xml“);UserService service = (UserService)factory.getBean(“userService“);System.out.println(service.getUserDao();/因为在非webApplacationContext 中不能自动dest
41、ory,因为需要手动destory/而ApplicationContext 没有实现destory 方法,因此需要具体的实现类来 destoryfactory.destroy();第六课:annotation 方式 Spring、 开始使用 annotation 配置 Spring首先需要在 spring 的 xml 配置文件中加入下列红色加粗部分的代码。这样当 spring 加载配置文件时,发现有标签后,会帮我加载以下四个类(用于处理 annotation 方式的配置):1、AutowiredAnnotationBeanPostProcessor, 2、CommonAnnotationBea
42、nPostProcessor, 3、PersistenceAnnotationBeanPostProcessor, 4、RequiredAnnotationBeanPostProcessor二、 Autowired、Qualifier还是需要在 xml 文件中配置 beanspring2.5 学习笔记 第 17 页 共 47 页(一) Autowired位置:可以放在成员属性前面,也可以放在 getter 或 setter 方法前面,但是建议放在 setter 方法前面作用:表示该对应的成员属性可以完成自动配置功能(默认是根据 byType 的)例如:xmp 配置文件:前缀部分见上面代码,以此
43、略。userServicepublic class UserService private UserDao userDao = new UserDaoImpl();public UserDao getUserDao() return userDao;/表示该成员属性可以自动装配(默认根据类型byType)/annotation建议放在setter方法前面Autowiredpublic void setUserDao(UserDao userDao) this.userDao = userDao;public void add(User u)userDao.save(u);说明:这样spring
44、就可以帮我们完成自动装配功能(默认是根据 byType)(二) Qualifier因为Autowired默认是根据byType来自动装配注入的。当有多个相同类型的bean时,Spring就会出现异常,提示找到多个符合条件的bean,但是不知道选择哪个bean 来注入。这时我们需要另外一注解来告诉Spring用那个bean,这就是Qualifier注解, Qualifier使用value参数来指定注入那个bean代码:public class UserService private UserDao userDao = new UserDaoImpl();public UserDao getUse
45、rDao() return userDao;/表示该成员属性可以自动装配(默认根据类型byType)/当配置文件中有多个相同类型的bean时,需要使用 Qualifier注解来说明那个bean来自动装配Autowiredpublic void setUserDao(Qualifier(value=“u“) UserDao userDao) this.userDao = userDao;public void add(User u)userDao.save(u);spring2.5 学习笔记 第 18 页 共 47 页三、 Resource(重要、推荐)还是需要在 xml 文件中配置 bean(
46、一) JSR-250JCP:Java Community Process 是由多个厂家出人来构成的 J2EE 组织,主要是用于定 Java 的一些新的标准而每一个标签都可以称之为一个 JSR而每一个新的 JSR 都会加一个数字是区别什么 JSR,可以到官方网看看具体 JSR 定了哪些新的标准。(二) Resource代码:import javax.annotation.Resource;public class UserService private UserDao userDao = new UserDaoImpl();public UserDao getUserDao() return u
47、serDao;/在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao)/注意这个Resource是J2EE的(import javax.annotation.Resource)Resourcepublic void setUserDao(UserDao userDao) this.userDao = userDao;public void add(User u)userDao.save(u);说明:在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao)注意这个Resource是J2EE 的(import j
48、avax.annotation.Resource)Resource默认是根据byName来的,如果没有找到相同的名称再根据byType,当然也可以指定bean的name如下:Resource(name=“u2“)public void setUserDao(UserDao userDao) this.userDao = userDao;注意:一般使用Resource 而不会使用Autowired不足:如果没有源码,就无法使用 annotation,只能使用 xml四、 Componet以上使用Autowired、Resource 注解时,还是需要在 xml 文件配置 bean,这样就达不到完全使用 annotation 进行注解。因此现在引用Component 在那个 bean 前进行注解,表示那个类是需要的 bean有了Componet 注解,这样就不需要在 xml 文件中配置 bean 了。注意:Componet 是Spring 的注解(org.springframework.stereotype.Componen