Spring 程序设计.ppt_第1页
Spring 程序设计.ppt_第2页
Spring 程序设计.ppt_第3页
Spring 程序设计.ppt_第4页
Spring 程序设计.ppt_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Spring 程序设计,第一讲Spring概述 第二讲Spring核心技术 第三讲Spring数据访问 第四讲Spring与Web 第五讲整合,Spring 程序设计,第一讲 Spring 概述,Spring 是什么?,Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。 Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。 Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益 。,目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJ

2、B,并提供了更多的企业应用功能 范围:任何Java应用,Spring的历史,Spring的基础架构起源于2000年早期,它是Rod Johnson在一些成功的商业项目中构建的基础设施。 在2002后期,Rod Johnson发布了Expert One-on-One J2EE Design and Development一书,并随书提供了一个初步的开发框架实现interface21开发包,interface21就是书中阐述的思想的具体实现。后来,Rod Johnson 在interface21 开发包的基础之上,进行了进一步的改造和扩充,使其发展为一个更加开放、清晰、全面、高效的开发框架Spri

3、ng。 2003年2月Spring框架正式成为一个开源项目,并发布于SourceForge中,Spring的理念,J2EE应该更加容易使用。 面向对象的设计比任何实现技术(比如J2EE)都重要。 面向接口编程,而不是针对类编程。 代码应该易于测试。Spring框架会帮助你,使代码的测试更加简单。 JavaBean提供了应用程序配置的最好方法。,Spring涵盖的技术范围,MVC ORM Remote Interface IoC(DI) AoP,Spring的架构,示例1,功能代码与Spring无关 类的属性由Spring 通过读取配置文件(bean.xml)动态设置 客户代码仅仅面向接口编程,

4、而无需知道实现类的具体名称。 可以很简单的通过修改配置文件来切换具体的底层实现类,Spring 程序设计,第二讲 Spring 核心技术,本讲内容,IOC 控制反转(依赖注入)的概念 容器 BeanFactory public class UserRegister implements InjectUserDao private UserDao userDao = null;/该对象实例由容器注入 public void setUserDao(UserDao userDao) this.userDao = userDao; / UserRegister的其它业务方法 ,Type2 设值注入,p

5、ublic class PrivateCopyright implements Copyright private String msg; public String getMsg() return msg; public void setMsg(String msg) this.msg = msg; public String show() return 本软件属 + msg + 用于商业用途!; ,Type3 构造子注入,public class UserRegister private UserDao userDao = null;/由容器通过构造函数注入的实例对象 public Use

6、rRegister(UserDao userDao) this.userDao = userDao; /业务方法 ,三种方式的比较,Type1接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如其他两种注入模式,因而在IOC 的专题世界内并不被看好 Type2方式较为自然、灵活 Type3在构造期即创建一个完整、合法的对象 ,也更能体现依赖关系 Spring 以Type2方式为主,IoC容器,IoC容器是IoC的实现者 IoC容器负责容纳bean,并对bean进行管理,IoC容器的实例化,从class path加载配置文件 从文件系统加载配置文件 从输入流加

7、载配置文件 加载多个配置文件,从class path加载配置文件,ClassPathResource resource = new ClassPathResource(beans.xml); BeanFactory factory = new XmlBeanFactory(resource);,从文件系统加载配置文件,Resource resource = new FileSystemResource(beans.xml); BeanFactory factory = new XmlBeanFactory(resource);,从输入流加载配置文件,InputStream in = new F

8、ileInputStream(“bean.xml”); Resource resource = new InputStreamResource(in); BeanFactory factory = new XmlBeanFactory(resource);,加载多个配置文件,ApplicationContext context = new ClassPathXmlApplicationContext( new String applicationContext.xml, applicationContext-part2.xml); BeanFactory factory = (BeanFact

9、ory) context;,Bean Factory,BeanFactory是Spring的“心脏”。它就是Spring IoC容器的真面目。Spring使用BeanFactory根据配置文件来实例化、配置和管理Bean。但是,在大多数情况我们并不直接使用BeanFactory,而是使用ApplicationContext。它也是BeanFactory的一个实现,但是它添加了一系列“框架”的特征,比如:国际化支持、资源访问、事件传播等,通过BeanFactory创建Bean,InputStream is = new FileInputStream(bean.xml); XmlBeanFacto

10、ry factory = new XmlBeanFactory(is); Copyright copyright = (Copyright) factory.getBean(TheCopyright);,Bean实例化的方式,用构造器来实例化 使用静态工厂方法实例化 使用实例工厂方法实例化,用构造器来实例化,无参构造器: 有参构造器 ,使用静态工厂方法实例化, 注意: 静态工厂方法必须为静态类型 工厂方法不能有参数 工厂方法必须为public类型 使用稍稍受限,使用实例工厂方法实例化, 注意: 工厂方法不能有参数 工厂方法必须为public类型 使用稍稍受限,BeanFactory与Bean有

11、关的常用方法,boolean containsBean(String):如果BeanFactory包含给定名称的bean定义(或bean实例),则返回true Object getBean(String):返回以给定名字注册的bean实例。根据bean的配置情况,如果为singleton模式将返回一个共享的实例,否则将返回一个新建的实例。如果没有找到指定的bean,该方法可能会抛出BeansException异常(实际上将抛出NoSuchBeanDefinitionException异常),在对bean进行实例化和预处理时也可能抛出异常 Object getBean(String, Class

12、):返回以给定名称注册的bean实例,并转换为给定class类型的实例,如果转换失败,相应的异常(BeanNotOfRequiredTypeException)将被抛出。上面的getBean(String)方法也适用该规则。 Class getType(String name):返回给定名称的bean的Class。如果没有找到指定的bean实例,则抛出NoSuchBeanDefinitionException异常。 boolean isSingleton(String):判断给定名称的bean定义(或bean实例)是否为singleton模式,如果bean没找到,则抛出NoSuchBeanDe

13、finitionException异常。 String getAliases(String):返回给定bean名称的所有别名。,Bean 配置的内容,1 Bean 属性值及依赖关系(对其他Bean 的引用) 2 Bean 创建模式(是否Singleton 模式,即是否只针对指定类维持全局唯一的实例) 3 Bean 初始化和销毁方法 4 Bean 的依赖关系,(14) ,id: Bean的唯一标识名。它必须是合法的XML ID,在整个XML文档中唯一。 name: 用来为id创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开。 class: 用来定义类的全限定名(包名类名)

14、。只有子类Bean不用定义该属性。,parent: 子类Bean定义它所引用它的父类Bean。这时前面的class属性失效。子类Bean会继承父类Bean的所有属性,子类Bean也可以覆盖父类Bean的属性。注意:子类Bean和父类Bean是同一个Java类。 abstract(默认为”false”):用来定义Bean是否为抽象Bean。它表示这个Bean将不会被实例化,一般用于父类Bean,因为父类Bean主要是供子类Bean继承使用。 singleton(默认为“true”):定义Bean是否是Singleton(单例)。如果设为“true”,则在BeanFactory作用范围内,只维护此

15、Bean的一个实例。如果设为“flase”,Bean将是Prototype(原型)状态,BeanFactory将为每次Bean请求创建一个新的Bean实例。,lazy-init(默认为“false”):用来定义这个Bean是否实现懒初始化。如果为“false”,它将在BeanFactory启动时初始化所有的Singleton Bean。反之,如果为“true”,它只在Bean请求时才开始创建Singleton Bean。 autowire(自动装配,默认为“no”):它定义了Bean的自动装载方式。 1、“no”:不使用自动装配功能。 2、“byName”:通过Bean的属性名实现自动装配。

16、3、“byType”:通过Bean的类型实现自动装配。 4、“constructor”:类似于byType,但它是用于构造函数的参数的自动组装。 5、“autodetect”:通过对bean 检查类的内部来选择constructor或byType。如果找到一个缺省的构造函数,那么就会应用byType Rod认为开发期可以这样,但Production Server上不应该使用Autowire,dependency-check 依赖检查:它用来确保Bean组件通过JavaBean描述的所以依赖关系都得到满足。在与自动装配功能一起使用时,它特别有用。 none:不进行依赖检查。 objects:只做

17、对象间依赖的检查。 simple:只做原始类型和String类型依赖的检查 all:对所有类型的依赖进行检查。它包括了前面的objects和simple。 depends-on(依赖对象):这个Bean在初始化时依赖的对象,这个对象会在这个Bean初始化之前创建。,init-method:用来定义Bean的初始化方法,它会在Bean组装之后调用。它必须是一个无参数的方法。 destroy-method:用来定义Bean的销毁方法,它在BeanFactory关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于singleton Bean。 factory-method:定义创建该Bean对

18、象的工厂方法。它可用于下面的“factory-bean”,表示这个Bean是通过工厂方法创建。此时,“class”属性失效。 factory-bean:定义创建该Bean对象的工厂类。如果使用了“factory-bean”则“class”属性失效。,配置Bean的属性值,20 ABC 123 ABC 123 ,配置Bean的属性值, ,Ref bean 与Ref local的区别,用“bean”属性指定目标bean是最常规的形式,这允许创建索引到任何同一容器内的bean(无论是否在同一XML文件中)或者父级的容器内的bean。“bean”属性的值可以和目标bean的“id”属性相同,也可以和目

19、标bean的“name”属性内的一个值相同 使用“local”属性指定目标其实是指向同一文件内对应“id”属性值为此“local”值的索引。“local”属性的值必须和目标bean的id属性值相同。如果同一文件内没有匹配的元素,XML解析器将提示错误。同样,如果目标bean在同一XML文件内,使用“local”变量是最好的选择(为了尽可能早地知道错误)。, Spring Bean Configuration Sample HeLLo java:comp/env/jdbc/sample ,Java的Reflection 机制,Class cls = Class.forName(“test.bea

20、ns.User); Method mtd = cls.getMethod(setMsg,new ClassString.class); Object obj = (Object)cls.newInstance(); mtd.invoke(obj,new Object“Maboli); return obj;,BeanWrapper,反射机制的实际实现类 Object obj = Class.forName(test.beans.User ).newInstance(); BeanWrapper bw = new BeanWrapperImpl(obj); bw.setPropertyValue

21、(“msg, “maboli);,AOP的概念,Aspect Oriented Programming 国内大致译作“面向方面编程”,第一个示例,建立接口 建立实现类 实现拦截器 实现MethodInterceptor接口 在invoke方法中实现横切处理 配置文件 配置目标Bean和拦截器Bean 配置ProxyFactoryBean 在proxyInterfaces属性中指定接口 在interceptorNames属性中指定目标Bean和拦截器Bean,要点,建立接口 (也有其它处理方式) 建立实现类 在interceptorNames属性中指定目标Bean和拦截器Bean 拦截器必须先加

22、载,AOP 与IoC的联系与区别,相同点:都是寻求解耦 IoC关注的是对象的创建、维护职责与对象的使用权(该使用权与调用者的功能紧密相关)解耦 AOP关注的是功能本身的解耦,AOP术语,方面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。 连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点总是 代表一个方法的执行 切入点(Pointcut): 匹配连接点(Joinpoint)的断言,一系列连接点的集合。 通知(Advice): 在切面的某个特定的连接点(Joinpoint)上执行的动

23、作。通知有各种类型,其中包括“around”、“before”和“after”等通知 引入(Introduction):添加方法或字段到被通知的类 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象 AoP代理(AoP Proxy):AoP框架创建的对象 织入(Weaving):组装方面来创建一个被通知对象,(将Aspect加入到程序代码的过程),通知的类型,前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。 返回后通知(After retur

24、ning advice): 在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知。 后通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 环绕通知(Around Advice): 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。,B

25、efore通知,public interface MethodBeforeAdvice extends BeforeAdvice void before(Method m, Object args, Object target) throws Throwable; ,Throws通知 响应不同的异常,public static class CombinedThrowsAdvice implements ThrowsAdvice public void afterThrowing(RemoteException ex) throws Throwable / Do something with r

26、emote exception public void afterThrowing(Method m, Object args, Object target, ServletException ex) / Do something will all arguments ,After Returning通知,public interface AfterReturningAdvice extends Advice void afterReturning(Object returnValue, Method m, Object args, Object target) throws Throwabl

27、e; ,切入点(Pointcut),定义了Advice应用的时机(哪些方法被调用时应用通知) 在 Spring中,利用PointcutAdvisor将Pointcut和Advice关联起来,切入点的类型,静态Pointcut 名称选择Pointcut 正则表达式Pointcut 动态Pointcut,Perl5正则表达式 规则,. 任何单字符 + 前一个字符出现一次或多次 * 前一个字符零次或多次 转义字符,动态地为对象增加责任,问题: 希望为对象增加功能,但因为种种原因不希望或者不能修改对象的代码 方案 使用Introduction 使用DelegatingIntroductionInter

28、ceptor进一步简化 效果: 在不修改目标对象源代码的情况下,动态地为对象增加了功能(方法),自动代理,问题: 为每个关注点建立同样的通知很烦琐且不宜维护 解决方案: 使用自动代理,自动代理的分类,BeanNameAutoProxyCreator 与Bean的名字匹配 DefaultAdvisorAutoProxyCreator 与方法名匹配,Spring 程序设计,Spring 数据访问,本讲内容,DAO支持 使用JDBC进行数据访问 使用ORM工具进行数据访问 事务管理,Spring的DAO支持,Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技

29、术, 如JDBC,Hibernate或者JDO等。它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编码的时候不用考虑处理各种技术中特定的异常。,一致的异常层次,Spring提供了一种方便的方法,把特定于某种技术的异常,如SQLException, 转化为自己的异常,这种异常属于以DataAccessException 为根的异常层次。这些异常封装了原始异常对象,这样就不会有丢失任何错误信息的风险。 Spring包装的异常信息包括JDBC、Hibernate、JDO等。,一致的DAO支持抽象类,为了便于以一种一致的方式使用各种数据访问技术,如JDBC、JDO和Hibernate, Spr

30、ing提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,通过它们你可以获得与你当前使用的数据访问技术相关的数据源和其他配置信息。,一致的DAO支持抽象类,Dao支持类: JdbcDaoSupport - JDBC数据访问对象的基类。 需要一个DataSource,同时为子类提供 JdbcTemplate。 HibernateDaoSupport - Hibernate数据访问对象的基类。需要一个SessionFactory,同时为子类提供 HibernateTemplate。也可以选择直接通过提供一个HibernateTemplate来初始化,这样就可以重用后者的设置,例如Sessio

31、nFactory, flush模式,异常翻译器(exception translator)等等。 JdoDaoSupport - JDO数据访问对象的基类。 需要设置一个PersistenceManagerFactory, 同时为子类提供JdoTemplate。 JpaDaoSupport - JPA数据访问对象的基类。 需要一个EntityManagerFactory,同时 为子类提供JpaTemplate。,效果:一致的DAO开发模型,一致的异常层次 + 一致的DAO支持抽象类 = 一致的DAO开发模型 无论底层的数据访问技术如何,我们的DAO类总是可以从相应的DAO支持抽象类(XxxDa

32、oSupport)继承,并使用该抽象类提供的模板类(XxxTemplate)完成具体的数据操作,并对外提供一致的异常,使用Spring JDBC抽象框架,指定数据库连接参数 打开数据库连接 声明SQL语句 预编译并执行SQL语句 遍历查询结果(如果需要的话) 处理每一次遍历操作 处理抛出的任何异常 处理事务 关闭数据库连接,JdbcTemplate类,JdbcTemplate是core包的核心类。它替我们完成了资源的创建以及释放工作,从而简化了我们对JDBC的使用 JdbcTemplate 操作采用的是JDBC 默认的AutoCommit 模式,JdbcTemplate jdbcTemplat

33、e = new JdbcTemplate(dataSource); jdbcTemplate.update(UPDATE user SET age = 10 WHERE id = erica); JdbcTemplate.call (调用存储过程),JdbcTemplate 查询,查询单值 queryForInt queryForString 查询结果集 queryForList 返回List类型,其中每个元素又是Map类型,Jdbc操作的java对象化,org.springframework.jdbc.object包下的类允许用户以更加 面向对象的方式去访问数据库 RDBMS操作类 SqlQ

34、uery类 MappingSqlQuery类 SqlUpdate类 StoredProcedure类 SqlFunction类,Jdbc操作的java对象化,public class UserUpdate extends SqlUpdate public UserUpdate(DataSource dataSource) this.setDataSource(dataSource); this.setSql(update spring_user set username =?, password=? where id=?); this.declareParameter(new SqlParam

35、eter(Types.VARCHAR); this.declareParameter(new SqlParameter(Types.VARCHAR); this.declareParameter(new SqlParameter(Types.INTEGER); pile(); ,Jdbc操作的java对象化,在许多Spring开发人员中间存在有一种观点,那就是各种RDBMS操作类 (StoredProcedure类除外) 通常也可以直接使用JdbcTemplate相关的方法来替换。 相对于把一个查询操作封装成一个类而言,直接调用JdbcTemplate方法将更简单 而且更容易理解。 必须说明的

36、一点就是,这仅仅只是一种观点而已, 如果你认为你可以从直接使用RDBMS操作类中获取一些额外的好处, 你不妨根据自己的需要和喜好进行不同的选择。 讨论: java对象化的优缺点,NamedParameterJdbcTemplate类,增加了在SQL语句中使用命名参数的支持 内部包装了一个标准的JdbcTemplate类 是线程安全的,SqlParameterSource接口,用来作为NamedParameterJdbcTemplate命名参数的来源 简单实现:MapSqlParameterSource类 另一个实现BeanPropertySqlParameterSource,该类包装一个类似J

37、avaBean的对象,所需要的命名参数值将由包装对象的属性提供。通过参数名和属性名自动匹配,SimpleJdbcTemplate类,该类所提供的功能仅适用于Java 5,Spring对Hibernate的支持,资源管理 在Spring的application context中创建 SessionFactory HibernateTemplate HibernateDaoSupport,HibernateDaoSupport,无须显式声明和设置SessionFactory。 无须创建HibernateTemplate 。 我们的DAO类从HibernateDaoSupport类继承即可。,Hib

38、ernateTemplate分页,public List find(String queryString,int pageNum,int pageSize) throws DataAccessException return executeFind(new HibernateCallback() public Object doInHibernate(Session session) throws HibernateException queryObject = createQuery(session, queryString); Query queryObject = session.cre

39、ateQuery(queryString); queryObject.setMaxResults(pageSize); queryObject.setFirstResult(pageNum - 1) * pageSize); return queryObject.list(); ); ,Spring的事务管理,编程式事务管理 在代码中通过开启/关闭事务实现事务管理 声明式事务管理 在配置文件中设置事务管理 Spring通过AOP实现声明式事务管理,JdbcTemplate的事务管理,编程式事务管理 使用TransactionTemplate(推荐) 使用PlatformTransactionM

40、anager 声明式事务管理 配置TransactionManager Bean 配置TransactionProxyFactoryBean 配置事务声明(在TransactionProxyFactoryBean中) 不要在Dao中处理异常而不抛出 访问Transaction代理而不是Dao对象,HibernateTemplate的事务管理,编程式事务管理 与JdbcTemplate类似 声明式事务管理 配置TransactionManager Bean 配置TransactionProxyFactoryBean 配置事务声明(在TransactionProxyFactoryBean中) 不要

41、在Dao中处理异常而不抛出 访问Transaction代理而不是Dao对象, PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly ,事务配置说明管理,PROPAGATION_REQUIRED -支持当前的事务,如果不存在就创建一个新的。这是最常用的选择。 PROPAGATION_SUPPORTS -支持当前的事务,如果不存在就不使用事务。 PROPAGATION_MANDATORY -支持当前的事务,如果不存在就抛出异常。 PROPAGATION_REQUIRES_NEW -创建一个新的事务,并暂停当前的事务(如果存在)。 PROPAGATIO

42、N_NOT_SUPPORTED -不使用事务,并暂停当前的事务(如果存在)。 PROPAGATION_NEVER -不使用事务,如果当前存在事务就抛出异常。 PROPAGATION_NESTED -如果当前存在事务就作为嵌入事务执行,否则与PROPAGATION_REQUIRED类似,代码控制的事务一, ,代码控制的事务二,public void insertUser() TransactionTemplate tt = new TransactionTemplate(getTransactionManager(); tt.execute(new TransactionCallback() public Object doInTransaction(TransactionStatus status) JdbcTemplate jt = new

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论