logo资料库

马士兵Spring课堂笔记(详细版).doc

第1页 / 共31页
第2页 / 共31页
第3页 / 共31页
第4页 / 共31页
第5页 / 共31页
第6页 / 共31页
第7页 / 共31页
第8页 / 共31页
资料共31页,剩余部分请下载后查看
课程内容
面向接口编程(面向抽象编程)
什么是IOC(DI),有什么好处
Spring简介
Spring IOC配置与应用
什么是AOP
Spring AOP配置与应用
Spring AOP的底层实现技术---JDK动态代理
Spring整合Hibernate
Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2
课程内容 1. 面向接口(抽象)编程的概念与好处 2. IOC/DI 的概念与好处 a) b) dependency injection inversion of control 3. AOP 的概念与好处 4. Spring 简介 5. Spring 应用 IOC/DI(重要) a) xml b) annotation 6. Spring 应用 AOP(重要) a) xml b) annotation 7. Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2 整合(重要) a) opensessionInviewfilter(记住,解决什么问题,怎么解决) 8. Spring JDBC 面向接口编程(面向抽象编程) 1. 场景:用户添加 2. Spring_0100_AbstractOrientedProgramming a) 不是 AOP:Aspect Oriented Programming 3. 好处:灵活 什么是 IOC(DI),有什么好处 1. 把自己 new 的东西改为由容器提供 a) 初始化具体值 b) 装配 - (class 是个类。Id 就等于构造了一个对象) (把u 这个对象注入到UserService 这个类的一个userDAO 的一个属性里) - 2. 好处:灵活装配
Spring 简介 1. 项目名称:Spring_0200_IOC_Introduction 2. 环境搭建 a) 只用 IOC i. spring.jar , jarkata-commons/commons-loggin.jar 3. IOC 容器 a) 实例化具体 bean b) 动态装配 4. AOP 支持 a) 安全检查 b) 管理 transaction Spring IOC 配置与应用 1. FAQ:不给提示: a) window – preferences – myeclipse – xml – xml catalog b) User Specified Entries – add i. ii. iii. iv. Location:D:\share\0900_Spring\soft\spring-framework-2.5.6\dist\resources\spring-beans-2.5.xsd URI: file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd Key Type: Key: Schema Location http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 2. 注入类型 a) Spring_0300_IOC_Injection_Type b) setter(重要) c) 构造方法(可以忘记) d) 接口注入(可以忘记) id vs. Name(可以把 Id 换成 name,没什么区别!) a) Spring_0400_IOC_Id_Name b) name 可以用特殊字符 3. 4. 简单属性的注入 a) Spring_0500_IOC_SimpleProperty b) 在配置文件里直接赋值!(在此简单属性为 int 和 string,会自动转换) 5.
b) singleton 单例(无论去多少次都是同一个 bean) c) proptotype 每次创建新的对象 6. 集合注入 a) Spring_0700_IOC_Collections
b) 很少用,不重要!参考程序 7. 自动装配 a) Spring_0800_IOC_AutoWire b) byName c) byType d) 如果所有的 bean 都用同一种,可以使用 beans 的属性:default-autowire - (这里会报错,因为有两个userDAO 和UserDAO2 都是int 类型!) (如果说byname 则会显示第一个的内容“1”!,因为UserService 类里面的userDAO 属性与第一个的名字一 样!) 8. 生命周期 lazy-init (不重要) init-method 与 destroy-methd 不要和 prototype 一起用(了解) a) Spring_0900_IOC_Life_Cycle b) c) class="com.bjsxt.service.UserService" id="userService" scope="prototype" 9. Annotation 第一步: a) 修改 xml 文件,参考文档 b) 默认按类型 by type c) 如果想用 byName,使用@Qulifier d) 写在 private field(第三种注入形式)(不建议,破坏封装) e) 如果写在 set 上,@qualifier 需要写在参数上
f) 10. @Resource(重要) a) 加入:j2ee/common-annotations.jar b) 默认按名称,名称找不到,按类型 c) 可以指定特定名称 d) 推荐使用 e) 不足:如果没有源码,就无法运用 annotation,只能使用 xml 11. @Component @Service @Controller @Repository(四个一样的功能!!) a) 初始化的名字默认为类名首字母小写 b) 可以指定初始化 bean 的名字 首先先加载 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 即 读beans.xml 里面的内容,然后通过 找从com.bjsxt 开始“scan”含@component 的类, 找到之后就初始化对象,结果在 其一个属相的set 方法上找到一个源为“u”的一个bean,于是就加载那个bean! 12. @Scope 13. @PostConstruct = init-method;(在构造对象后执行此方法) @PreDestroy = destroy-method;(在容器销毁前执行此方法)
什么是 AOP 1. 面向切面编程 Aspect-Oriented-Programming a) 是对面向对象的思维方式的有力补充 2. Spring_1400_AOP_Introduction 3. 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码 a) Filter b) Struts2 的 interceptor 4. 概念: a) JoinPoint 释意:切面与原方法交接点 即 切入点 b) PointCut 释意:切入点集合 是com.xyz.someapp.service.下面的任何类,任何方法,任何返回值的一个切入点的集合。 c) Aspect(切面)释意:可理解为代理类前说明(简单的理解为夹在类的新的业务逻辑,就是业务逻辑类) d) Advice 释意:可理解为代理方法前说明 例如@Before(即加在切面上的说明) e) Target 释意:被代理对象 被织入对象 f) Weave 释意:织入 Spring AOP 配置与应用 SpringAOP的底层实现技术---JDK动态代理 2008-06-1210:38:54
JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚推出动态代理时,还很难 想象它有多大的实际用途,现在我们终于发现动态代理是实现AOP的绝好底层技术。 JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler 是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在 一起。 而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。这样讲一定很抽象,我们马上着手动用 Proxy和InvocationHandler这两个魔法戒对上一节中的性能监视代码进行AOP式的改造。 首先,我们从业务类ForumServiceImpl中删除性能监视的横切代码,使ForumServiceImpl只负责具体的业务逻辑, 如所示: 代码清单5ForumServiceImpl:移除性能监视横切代码 packagecom.baobaotao.proxy; publicclassForumServiceImplimplementsForumService{ publicvoidremoveTopic(inttopicId){ ① System.out.println("模拟删除Topic记录:"+topicId); try{ Thread.currentThread().sleep(20); }catch(Exceptione){ thrownewRuntimeException(e); } ②
} publicvoidremoveForum(intforumId){ ① System.out.println("模拟删除Forum记录:"+forumId); try{ Thread.currentThread().sleep(40); }catch(Exceptione){ thrownewRuntimeException(e); } ② } } 在代码清单5中的①和②处,原来的性能监视代码被移除了,我们只保留了真正的业务逻辑。 从业务类中移除的横切代码当然还得找到一个寄居之所,InvocationHandler就是横切代码的家园乐土,我们将性能监 视的代码安置在PerformaceHandler中,如代码清单6所示: 代码清单6PerformaceHandler packagecom.baobaotao.proxy; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; publicclassPerformaceHandlerimplementsInvocationHandler{ privateObjecttarget;一般的都有一个object对象,object是被代理对象! publicPerformaceHandler(Objecttarget){//①target为目标的业务类 this.target=target;
分享到:
收藏