2. Spring 简介 与 Hibernate 、 Struts 一样, Spring 也是一个开源项目,它的作者是 Rod Johnson ,官方网站是 http://www.springframework.org/ 。 Spring 的基础思想来源于 Rod Johnson 的一本著名的 j2ee 书籍: Expert One-on-One J2EE Design and Development 。在这本书中, Rod Johnson 列举 EJB 的种种问题,并提出了相应的解决办法。 从那时起,人们对于 EJB 的狂热追捧才算结束,转而进入更理性的时代。
3. Spring 简介 Rod Johnson 是悉尼大学博士, 猜猜他的专业是什么? Rod Johnson 在开发出 Spring 之前,主要从事项目开发咨询 与培训工作。在 Spring 被广泛认可之后,创办了 interface21 公司,致力于 Spring 咨询与培训 Rod Johnson 还是 JDO2.0 和 Servlet2.4 专家组成员。
4. Spring 简介 Spring 核心技术包括两个方面,一是控制反转( Inversion of Control, IoC ),另一个是面向方面编程( Aspect Oriented Programming, AOP )。 Spring 囊括了十分丰富的内容,包括表述层、数据层,它提供了许多原来只有 EJB 才能提供的功能(如宣称式的事务管理),但 Spring 又无须运行在 EJB 容器上。 无论 Spring 涉足到哪一个领域,使用的都是简单的 JavaBean ,一般无须再实现复杂的接口。
7. Spring 技术基础 Spring 的核心是 IoC 和 AOP ,它们都是由 Java 原有技术发展而来的。 IoC 技术是通过 Java 的反射机制以及 JavaBean 的自省机制实现的 AOP 技术是依赖代理模式实现的, JFC 中提供了对代理模式的内在支持, Spring 也是通过这种技术实现的。 为了能够理解 Spring 的 IoC 机制,下面对反射机制和自省机制做简单介绍。
10. 反射机制 使用时指明类名和方法名: class SomeToBeInvoke { public int calculate(int i) { return i*i; } } ReflectDemo demo = new ReflectDemo(); Object obj = demo.myInvoke("SomeToBeInvoke", "calculate", new Object[]{new Integer(6)}); System.out.println(obj);
11. Class 类 java.lang.Class 代表一个类,可以通过三种方式得到 Class 的实例: Object.getClass() Class.forName() 直接用类名点 class ,如: A.class Class 的实例代表的是类,不代表类的实例。即 Class c = A.class , c 是类而不是实例。如果创建实例,可以调用 newInstance() 方法。
72. AOP 快速入门-创建目标 public class J2eeCourse implements Course { String name; public J2eeCourse(String name) { this.name = name; } public void process(Teacher teacher) { System.out.println(name + " is in process, and the teacher is “ + teacher.getName()); teacher.giveClass(); } public String getName() { return name; } }
73. AOP 快速入门-创建目标 使用 Java 动态代理机制实现的 AOP 必须要将目标对象中的方法声明在一个接口中: public interface Course { public void process(Teacher teacher); public String getName(); }
74. AOP 快速入门-创建通知 此处创建的是前置通知: public class CourseAdvice implements MethodBeforeAdvice { public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable { Course course = (Course)arg2; Teacher teacher = (Teacher) arg1[0]; System.out.println("hi, teacher " + teacher.getName() + ", there is a " + course.getName()+ ", do you have time to listener this class?"); } }
100. JdbcTemplate 查询 依据模板回调原则, Spring 定义了以下查询方法: Object query(PreparedStatementCreator psc, ResultSetExtractor rse) List query(PreparedStatementCreator psc, RowCallbackHandler rch) List query(PreparedStatementCreator psc, RowMapper rowMapper) 以上几个方法中,第一个参数用于生成语句,第二个参数则用于处理结果,它们都用于在运行时回调
101. JdbcTemplate 查询 Spring 提供了一些简便的查询方法: 1. temp. queryForList ("select * from building"); 返回 List ,内部元素为 Map ,键对象为列名,值对象为列值。 2. temp. queryForMap ("select * from building where id=3"); 返回 Map ,键对象为列名,值对象为列值,所以要求必须返回单一行。 3. temp. queryForObject ("select building_name from building where id=1", String.class) 返回对象,依据指定的类型决定返回对象的类型,仅针对单行单列 4. 此外还有 queryForInt 及 queryForLong 等等。
102. JdbcTemplate 更新 依据模板回调原则, Spring 定义了以下更新方法: int update(PreparedStatementCreator psc) int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) int update(PreparedStatementCreator psc, PreparedStatementSetter pss) 以上参数也均为方法提供了运行回调接口。
103. JdbcTemplate 更新 为了方便, Spring 同样定义更新使用的方法: int update(String sql) int update(String sql, Object[] args) int update(String sql, Object[] args, int[] argTypes) int update(String sql, PreparedStatementSetter pss) 用法参照 API