《2022年spring框架学习笔记.pdf》由会员分享,可在线阅读,更多相关《2022年spring框架学习笔记.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、spring 1.这个框架并不像hibernate 或 struts 那样为了完成特定的功能 (操作数据库、处理Http 请求 ),它只是用来优化我们的工程的结果、提升设计、降低耦合度。2.核心 : 应用上下文ApplicationContext 它就是用来管理工程中无数类型的核心, 一般通过 xml 文件或者注解来管理。它在启动时载入xml 文件或注解中的类、 类之间关系的信息,在使用时通过一些方式将管理的类型或对象取出使用。3.(下载 spring.zip,这里面包含了相应的jar 包,以及文档 ) 第一个 spring 的应用 : 1、导入 jar 包到工程中2、在 src 下创建一个叫
2、applicationContext.xml 的配置文件 比如通过上述方式,我们就通过配置文件将,两个类Hello 和 Bye 分别注册管理,其代号分别为hello 和 bye。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 14 页 - - - - - - - - - - 通过这两个代号,我们之后就能取出这个两个类的实例,并进行使用。 (相应的类要Hello,Bye 事先自己定义好) 3、使用 ClassPathXmlApplicationContext来加载上一步中的 xml 文件,以及获
3、取其中的某个bean ApplicationContext ctx = new ClassPathXmlApplicationContext(applicationContext.xml);加载 xml 文件中的配置信息,两个类就被spring 管理起来了 Hello h = (Hello)ctx.getBean(hello); 注意 :取出 bean时可以用多态4.开闭原则 : 对扩展开放,对修改关闭需求变更时, 尽量扩展一个类, 不要去修改原来的类;这样可以避免在原来正确的类上产生新的bug。5.spring 不但可以动态创建类的实例,也可以通过配置文件动态初始化实例的属性值1、私有属性要
4、有对应的setter 方法2、 在 bean中定义 property 属性, 对应类中私有属性,*可以通过配置进行属性的自动设置。 在猫的 bean 中注册 name属性,值为TOM 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 14 页 - - - - - - - - - - 注册 age 属性,值为10,Tom 和 10 两个值会自动注入到猫的实例中去 *也可以通过构造方法来进行动态初始化1、在类中定义需要自动调用的构造方法2、在配置文件的bean中定义 来使用构造方法进行属性值的初始化
5、 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 14 页 - - - - - - - - - - *可以和 xxx.properties 格式的配置文件结合使用1、先要在配置文件中注册,载入一个 xxx.properties 文件的信息 2、 可以在其他的bean 中使用这个xxx.properties 中定义的信息,比如 : 这种 spring 的 xml 配置文件读取传统的xxx.properties配置文件的方式,将在以后数据源配置中经常使用,jdbc.properties 中全是数据
6、源配置参数,而 spring 的上下读取这个 jdbc.properties,然后将其中的参数值,在bean中使用。这样两者各司其职,jdbc.properties 负责 jdbc 的数据信息, spring 的 xml 文件负责处理bean的注册及 bean之间的关系。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 14 页 - - - - - - - - - - 5.spring 管理的类,属性的类型完全可以是自定义类型。这种情况下就设计到类和类之间的装配。如果是自定义类型的装配,那么pr
7、operty 标签不再用value 了,而用ref,比如 : class Keyboard class Computer private Keyboard keyboard; /setter. *自动装配:这个 autowire=bytype 表示会自动扫描上下文中的类,如果有符合 Tool 这个类型的就自动装配如果一个都不符合或有多个符合就会报异常 如果有多个匹配就会报异常,可以用 autowire-candidate=false来将某些 bean排除 : 1.AOP 面向切面编程是一种思想 ,struts 有,spring 也有2.如何用 spring 实现 ? 1、导入相关的jar 包2
8、、先定义一个目标类(其中有核心的逻辑,但共同的逻辑将会通过切面在切入点切入)3、再定义一个切面Aspect 操作类,在里面写上要重复切入到目标的逻辑4、写配置文件,关键要配置, 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 14 页 - - - - - - - - - - after-returning 和 after 类似 ,after 是在方法逻辑执行完执行,after-returning 是在方法返回后执行,核心区别是如果在方法中产生了异常,after 是不会执行的,但after-re
9、turning 会。after-throwing 是在遇到异常时执行method 中的方法 定义一个方法,有参数ProceedingJoinPoint,在里面写上前置、后置的逻辑, 并在之间调用jp.proceed(),也可以灵活的通过条件判断决定是否要调用jp.proceed(). proceed()的返回值就是方法的返回值精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 14 页 - - - - - - - - - - jp.getArgs() 返回一个 Object 数组,就是被代理的方法
10、的参数值(如果根本没有参数,就返回一个长度为0 的数组 ) 注解 AOP *在配置文件中 激活自动代理 *在切面类 (比如刚才那个例子中就是FileOperation) 的类定义上面写上 Aspect 注解 ,然后在这个切面类的方法上定义注解, 前置注解 Before, 后置注解 After, 环绕注解 Around 。在这些注解里面还可以定义切入点point-cut, 并写上类似execution(* com.oracleoaec.*.*() 表达式。AOP 的基石 -动态代理模式代理模式一、静态代理被代理类 (目标类 ) 代理类1、目标类和代理类具有相同的接口精品资料 - - - 欢迎下载
11、 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 14 页 - - - - - - - - - - 2、代理类中定义有一个属性,类型就是目标类(或者说代理类持有一个目标类对象的引用) 3、代理类的接口方法中会调用目标类的接口方法,并在其基础上添加一定的额外功能静态代理必须事先知道目标类,才能再定义代理类二、动态代理1、JDK 自带动态代理功能,InvocationHandler 接口、 Proxy a、定义一个类实现InvocationHandler, 并实现其抽象方法, 并传入被代理的对象(目标对象 ) b、Proxy.n
12、ewProxyInstance(.)创建代理对象所谓动态代理,就是在定义代理逻辑时,根本不需要知道未来被代理的是什么类,什么方法而静态代理必须事先知道一些信息注意: JDK 的动态代理的目标类,必须实现接口2、cglib 动态代理,目标类完全可以不实现任何接口a、定义一个类实现MethodInterceptor 接口,实现其抽象方法b、创建一个Enhancer 对象调用其 setSuperClass方法,传入被代理的目标类精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 14 页 - - - -
13、 - - - - - - 调用 setCallback 方法,传入 a 中定义的类的实例,也就是要回调的代理逻辑c、调用这个Enhancer 对象的 create方法,产生一个代理对象1.spring 和数据库spring 可以用 bean 的方式配置数据源datasource dbcp、c3p0、纯 jdbc(也勉强可以算一种数据源,只是没有连接池而已 ) 配置完后,可以像之前普通类一样通过getBean 取出连接池对象。再用getConnection() 获取连接 . spring 提供了默认的模板JdbcTemplate来处理大量重复的jdbc 操作,这个JdbcTemplate也可以注
14、册在applicationContext.xml 文件中,注册成一个bean,而这个JdbcTemplate的 bean内部又要包含一个DataSource的 bean,比如类似 : . 以上标签就将数据源装配jdbc 的模板上。2.模板包含数据源,而一般Dao 包含模板对象 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 14 页 - - - - - - - - - - ref 中的 jdbcTemplate 表示上下文中定义的模板bean 的 id name中的 jdbcTemplate
15、 表示这个 Dao 类中定义的属性名,要一致dao 一般注入业务层、service、biz。可以使用spring 的依赖注入,在 Service 中定义一个private 的 dao 属性和 public 的setter方法,在 xml 中声明,让其自动注入。spring 声明式事务(不用编码,只用配置文件或者注解就自动进行事务控制)默认的事务处理逻辑,只要遇到运行时异常就会自动回滚,没有遇到任何异常,会自动提交。 通过 rollback-for 可以配置遇到什么异常回滚propagation 事务传播机制精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名
16、师归纳 - - - - - - - - - -第 12 页,共 14 页 - - - - - - - - - - REQUIRED 需要事务,如果当前存在事务,就使用当前事务,如果不存在就自动开启事务REQUIRES_NEW 每次都会开启一个新事务NOT_SUPPORTED 不需要事务,如果没有事务,就直接执行;原来就有事务的话就挂起原来的事务,执行完这段逻辑再恢复NEVER 从不,如果没有事务,就正常执行;如果有,就抛异常一般最常用的是REQUIRED ,保证有且只有一个事务运行如果是纯查询的话,可以使用NOT_SUPPORTED 结合READ-ONLY=true 注解事务首先要在 xml 文件中声明 打开注解驱动的事务管理接下来就可以在需要自动事务管理的方法上,加上Transactional 进行事务控制精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 13 页,共 14 页 - - - - - - - - - - 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 14 页,共 14 页 - - - - - - - - - -