1、spring2.5 学习笔记 第46页 共46页Spring SSH整合 学习笔记-wjt2762010-05-14目录第一课:面向抽象编程4第二课:Jdom的基本使用4第三课:模拟Spring功能5第四课:搭建sping的运行环境8一、建立一个新的项目8二、建立spring的配置文件8三、引入spring的jar包8四、测试代码:8五、注意接口的使用:8第五课:IOC(DI)配置及应用9一、什么是IOC、DI9二、编辑xml文件时,没有提示9三、注入类型(Injecting dependencies)9(一)setter注入类型Setter Injection9(二)构造方法Construc
2、tor Injection10四、id、name11五、简单属性的注入11六、Bean的作用范围scope12七、集合注入12八、自动装配autowire13(一)byName13(二)byType14(三)注意14九、生命周期15(一)lazy-init/default-lazy-init15(二)init-method destroy-method 不要和prototype一起用(了解)15第六课:annotation方式Spring16一、开始使用annotation配置Spring16二、Autowired、Qualifier16(一)Autowired16(二)Qualifier17
3、三、Resource(重要、推荐)17(一)JSR-25017(二)Resource17四、Componet18五、Scope、PostConstruct、PreDestroy19六、注解对应的jar包19第七课:AOP(面向切面编程)19一、AOP概念19二、利用动态代理实现面向切面编程20第八课:Spring AOP配置选项21一、AOP配置annotation方式21(一)搭建annotation开发环境21(二)aspectJ类库22(三)AOP的annotation实例22(四)AspectJ的专业术语23(五)织入点语法23(六)Advice24(七)Pointcut26(八)an
4、notatin方式的AOP实例26二、AOP配置xml方式27三、AOP实现动态代理注意28第九课:DataSource28一、Sping配置数据源:28二、注入使用29三、dbcp.BasicDataSource29第十课 Spring整合Hiberante330一、Spring配置hibernate3的SessionFactory30(一)xml形式的SessionFactory30(二)annotation注解方式的SessionFactory30二、引入hibernate所需要使用的jar31(一)基本jar31(二)加入annotation功能的jar包31(三)搭建日志环境并配置显
5、示DDL语句jar包31三、Spring整合hibernate3事务31(一)Annotation注解方式配置事务管理31(二)Spring事务选项35(三)XML文件形式配置Spring事务管理37四、HibernateTemplate38(一)HibernateTemplate38(二)HibernateDaoSupport39第十一课:Spring整合-SSH40一、第一步:加入jar包(需要的jar包列表)40二、第二步: 首先整合Spring + Hibernate41三、第三步:再来整合Struts241四、struts的读常量:43第十二课:DTO、VO43一、DTO43二、VO
6、43第十二课:SSH整合存在的问题43一、Jsp中访问Session时,Session已经关闭43二、如果不配置事务,openSessionView出现异常44三、中文乱码问题:44第十三课:SSH整合的jar包45一、Struts245二、Hibernate3.3.245三、Spring46第一课:面向抽象编程原来什么类都是写死的,现在是先建立一个大的标准,然后再各个实体类来实现他们的功能,然后在调用的时候,使用这个标准调用,这样,你们那个来都可以被调用。实例:User实体类public class User private String username;private String pa
7、ssword;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 void save(User u);UserDao的实现User
8、DaoImplpublic 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() return userDao;public void setUserD
9、ao(UserDao userDao) this.userDao = userDao;public void add(User u)userDao.save(u);/这里可以调用任务实现了UserDao接口的save方法了。第二课:Jdom的基本使用test.xml 8G 200 1580 10G 500 3000 实例类:public class Sample1 public static void main(String args) throws Exception SAXBuilder sb=new SAXBuilder();/创建一个SAXBuilder对象Document doc=s
10、b.build(Sample1.class.getClassLoader().getResourceAsStream(test.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
11、 capacity=element.getChildText(capacity);/取disk子元素capacity的内容 String 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.ou
12、t.println(文件数:+files); System.out.println(-); 第三课:模拟Spring功能因为Spring是使用xml配置文件来实现的,所以我们首先模拟一个xml的配置文件如下:beans.xml实现的功能:当类初始化时,一、 程序会根据此配置文件初始化文件所有的bean元素所代表的类,放入一个容器中(使用Map),然后在需要时,会根据ID值,取出这个对象;1、 代码:public class ClassPathXmlApplicationContext implements BeanFactory private Map beans = new HashMap(
13、);public ClassPathXmlApplicationContext() throws ExceptionSAXBuilder sb=new SAXBuilder();/创建一个SAXBuilder对象 Document doc=sb.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(beans.xml); /构造文档对象 Element root=doc.getRootElement(); /获取根元素 /System.out.println(root.getName();
14、 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 = element.getAttributeValue(class); System.out.println(id + : + clazz); Object o = Class.forName(clazz).newInstance(); beans.put
15、(id, o); public Object getBean(String name)return beans.get(name);2、 测试:BeanFactory factory = new ClassPathXmlApplicationContext();UserService service = new UserService();/UserService service = (UserService)factory.getBean(userService);UserDao userDao = (UserDao)factory.getBean(u);/此得只需要根据ID就可以取得Bea
16、n对象来使用service.setUserDao(userDao);User u = new User();service.add(u);二、 当某一bean元素下存在property子元素时,则需要把这个子元素作为参数自动注入(使用setXXX方法)到这个bean对象中1、 代码:public class ClassPathXmlApplicationContext implements BeanFactory private Map beans = new HashMap();public ClassPathXmlApplicationContext() throws ExceptionS
17、AXBuilder 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;ilist.size();i+) Element element=(
18、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); /* 以下for循环是实现模拟spring自动装配(注入)功能 /一开始列出此bean的所有property子元素 for (Element propertyElement
19、 : (List)element.getChildren(property) /获取property子元素中 属性为name的值(也就是需要注入的参数名称) String name = propertyElement.getAttributeValue(name);/获取property子元素中 属性为bean的值 (需要注入参数的类型),此处的bean值是已经在上面初始化好了的bean的ID了。 String bean = propertyElement.getAttributeValue(bean); /因此此处获取指定ID的bean Object beanObject = beans.g
20、et(bean); /组成set方法名称:set + 第一个字母大写 + 其它的字母 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); /使用反映机制,执行
21、method方法,从而实现注入功能 m.invoke(o, beanObject); 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);/以下两
22、行代码在实现注入功能后,将不再需要,因为程序在加载时,已经帮我自动注入这个参数了。/UserDao userDao = (UserDao)factory.getBean(u);/service.setUserDao(userDao);User u = new User();service.add(u);BeanFactory接口代码:public interface BeanFactory public Object getBean(String name);第四课:搭建sping的运行环境一、 建立一个新的项目a) 建立新的项目;b) 建立需要的bean类二、 建立spring的配置文件你可
23、以在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
24、 User();service.add(u);注意:这里使用的ClassPathXmlApplicationContext和BeanFactory是spring的,如下:import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;五、 注意接口的使用:ClassPathXmlApplicationContext类实现了ApplicationContext接口,而ApplicationContext接口又
25、实现了BeanFactory接口,这样BeanFactory是根上的接口。一般建议使用ApplicationContext接口,因为:1、BeanFactory:只是完成Bean工厂的基本功能,不能完成bean的生命周期2、ApplicationContext:除了完成bean工厂的基本功能外,还完成的其它的附加功能(比如:bean的生命周期),也就是功能更强大这样上面的代码就是public void testAdd_3() throws Exception ApplicationContext factory = new ClassPathXmlApplicationContext(bean
26、s.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)自己控制,而是由容器(运行环境上下文、Spring)帮我们来控制。还是一种说法:原来我们自己控制是控制实现,
27、而现在Spring是利用接口来控制的。所以我们由原来控制实现转为springg现在来控制接口(向上反转)作用:实例化具体的bean 动态装配bean(本来是由我来控制的,现在我交给容器来控制。)DI:Dependency Injection依赖注入:一些成员属性(例如UserService中的userDao成员属性) 依赖Spring容器来注入好处:偶合性相对来降低了;另外,注入是使用配置文件来实现,这样修改来非常的方便.DI与IOC相对来说 是一样的概念。二、 编辑xml文件时,没有提示1、 window preferences myeclipse Files and Editing - x
28、ml 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.springframework.org/schema/beans/spring-bea
29、ns-2.5.xsd三、 注入类型(Injecting dependencies)1、 setter(重要)2、 构造方法(使用的非常少)3、 接口注入(可以忘记)(一) setter注入类型Setter Injection就是在bean中使用setXXX方法进行注入来在bean类中,成员属性需要setXXX方法如下:public class UserService private UserDao userDao = new UserDaoImpl();public UserDao getUserDao() return userDao;public void setUserDao(UserD
30、ao 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 UserService(UserDao userDao) super();this.userDao = userDao;publi
31、c 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,这是只是引用它。 - 使用和其子标签或进行构造方法注入当构造方法注入时,构造方法中有多个参数时,可以使用以下两种方式注入:be
32、an代码: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.String的参数注入”42”,但这个方法不适合多个参数是相同的类型。2、利用索引进行
33、区分参数xml配置文件 注意:index=0的注入到第一个参数,index=1的注入到第二个参数。构造方法的注入不方便,所以我们需要使用setter注入方式。四、 id、name注xml配置文件中标签中的属性名称如下: 或 以上标签中的属性id与name作用是一样,唯一的区别:id中不可以含有特殊字符,而name中可以有特殊字符五、 简单属性的注入当bean中存在简单属性时的注入方式:bean代码如下:public class UserDaoImpl implements UserDao private int daoId;private String daoStatus;public int
34、 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) System.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/globalsession,但也非常少用,因为其它框架已经有功能非常强