Spring学习笔记.docx_第1页
Spring学习笔记.docx_第2页
Spring学习笔记.docx_第3页
Spring学习笔记.docx_第4页
Spring学习笔记.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

Spring学习笔记IOC 控制反转控制反转:将对象实例化的工作交给Spring做。Spring实例化对象的方式以及在配置文件中的体现:1、 调用默认构造方法实例化对象。 2、 利用静态工厂方法实例化对象。3、 实例工厂方法实例化对象。 /先实例化工厂 说明:只要出现在spring的配置文件中的Bean Spring都会为其实例化。注意,抽象类是不能实例化的。Spring的单例多例情况分析(spring配置文件中bean的scop属性)1、 由于spring采用登记式单例的方式管理对象,所以由spring实例化的对象默认都是单例的。2、 通过spring配置文件中bean的scop属性,可以实例化多种情况的对象。多种情况包括:单例多例,生命周期等。Spring创建对象的时机1、 单例的情况:a) 默认启动容器就实例化所有的beanb) 可以通过配置文件按需要实例化,在spring的配置文件中有一个属性lazy-init=true/false,当取值为true时只有调用content.getBean()方法时才实例化。否则启动spring时实例化所有的Bean。可以看出该属性默认值为false。 2、 多例的情况:a) 多例时只有一种实例化情况,那就是全部的对象都在content.getBean()时创建。Spring对象的生命周期调用destroy方法调用自己的方法执行init方法Spring创建对象DI 依赖注入依赖注入:给属性赋值。 一个类中的属性都可以采用springDI的方式进行赋值,但是并不是所有的属性都适合赋值(比如有些属性就是需要自己维护)Spring的注入方式1、 通过默认的构造方法,这种方式在配置文件中的体现在bean中没有元素。2、 通过指定构造方法注入,这种方式在配置文件中的体现是bean中有元素。元素中的几种属性:a) Index 表示属性的位置,从0开始。b) Type 属性的类型。c) Value 属性的值.d) Ref为引用型变量赋值。3、 通过属性(setter方法)注入a) 在spring的配置文件中引入一个bean,并且让这个bean自动装配,那么在引用这个类的地方spring会自动调用他的setter方法为其注入。/根据名称自动装配。4、 使用注解的方式注入a) 注解的使用方法:i. 导入命名空间。在spring的配置文件中导入 xmlns:context=/schema/context /schema/context /schema/context/spring-context-2.5.xsdii. 引入注解解析器iii使用Repository 、Service、Controller将bean引入进来。中频词,你记住了吗?iii. 使用Resource为属性注入。4、注入的过程分析iv. 当启动spring容器的时候,spring容器加载了配置文件v. 在spring配置文件中,只要遇到bean的配置,就会为该bean创建对象vi. 在纳入spring容器的范围内查找所有的bean,看哪些bean的属性或者方法上加有Resourcevii. 找到Resource注解以后,判断该注解name的属性是否为(name没有写)viii. 如果没有写name属性,则会让属性的名称的值和spring中ID的值做匹配,如果匹配成功则赋值ix. 如果匹配不成功,则会按照类型进行匹配,如果匹配不成功,则报错x. 如果有name属性,则会按照name属性的值和spring的bean中ID进行匹配,匹配成功,则赋值,不成功则报错关于继承如果spring文件中的某一个bean不想实例化,那么可以可以给该bean加上abstract=”true”属性。如果要让一个bean拥有父类的属性,可以给该bean加上parent=commonDao属性。IOC和DI的意义实现了完全面前接口编程。Spring声明式事物处理声明式事物处理:声明针对的是程序员,意思是由程序员决定哪些方法需要事物,哪些方法不需要事物。事物处理spring根据程序员的声明来做事物处理。目的是让程序员不再关注事物,如图所示:开发者对数据库增删改查Spring容器开启事物提交事物回滚事物声明事物代理对象代理方法:spring管理的事物+开发者的增删改查spring声明式事务处理的步骤 1、搭建环境 2、把dao层和service层的接口和类写完 3、在spring的配置文件中,先导入dataSource 4、测试 5、导入dao和service层的bean 6、测试 7、进行AOP的配置 a)引入事务管理器 b) 进行aop的配置 b) 测试service层的类看是否是代理对象Spring 的AOPAOP:面向方面编程。Spring中的声明式事物就是用AOP实现的。使用AOP的好处,让所有的方面完全松耦合。AOP中的相关概念1、 切面:可以理解为某一个方面。比如事物、日志、安全性框架等。2、 通知:切面中的方法。3、 目标类4、 切入点:只有符合切入点,才能让通知和目标方法结合在一起。5、 织入:形成代理对象的方法的过程。AOP核心技术在spring的aop中,核心的实现使用了动态代理的技术,主要的是基于借口的动态代理。静态代理静态代理:由程序员创建源代码,并对其进行编译。在程序运行前代理类的.class文件就存在了。a) 静态代理模式的缺点:如果一个系统中有接口,则创建100个代理对象假设一个接口中有很多方法需要事务,则代理对象的方法中重复代码还是很多由第一点和第二点可以得出:proxy的重用性不强动态代理动态代理:代理类在程序运行时,使用反射机制动态生成。 1、产生的代理对象和目标对象实现了共同的接口 jdk动态代理 2、代理对象是目标对象的子类 hibernate: Person person = session.load(Person.class,1L); javassisit spring:cglib动态代理jdk的动态代理: 1、因为是用jdk的API做到的 2、代理对象是动态产生的cglib产生的代理类是目标类的子类注意事项: 1、拦截器中invoke方法体的内容就是代理对象方法体的内容 2、当客户端执行代理对象.方法时,进入到了拦截器的invoke方法体 3、拦截器中invoke方法的method参数是在调用的时候赋值的 切入点表达式Spring 通过切入点表达式找到切入点。了解方法签名方法签名与切入点表达式的对应切入点表达式的具体使用execution(public * *(.) 所有的公共方法execution(* set*(.) 以set开头的任意方法execution(* com.xyz.service.AccountService.*(.) com.xyz.service.AccountService类中的所有的方法execution(* com.xyz.service.*.*(.) com.xyz.service包中的所有的类的所有的方法execution(* com.xyz.service.*.*(.) com.xyz.service包及子包中所有的类的所有的方法execution(* cn.itcast.spring.sh.*.*(String,?,Integer) cn.itcast.spring.sh包及子包中所有的类的有三个参数 第一个参数为String,第二个参数为任意类型, 第三个参数为Integer类型的方法SpringAOP的具体加载过程 1、当spring容器启动的时候,加载了spring的配置文件 2、为配置文件中所有的bean创建对象 3、spring容器会解析aop:config的配置 1、解析切入点表达式,用切入点表达式和纳入spring容器中的bean做匹配 如果匹配成功,则会为该bean创建代理对象,代理对象的方法=目标方法+通知 如果匹配不成功,不会创建代理对象 4、在客户端利用context.getBean获取对象时,如果该对象有代理对象则返回代理对象,如果代理对象,则返回目标对象说明:如果目标类没有实现接口,则spring容器会采用cglib的方式产生代理对象,如果实现了接口,会采用jdk的方式通知 1、前置通知 1、在目标方法执行之前执行 2、无论目标方法是否抛出异常,都执行,因为在执行前置通知的时候,目标方法还没有执行,还没有遇到异常 2、后置通知 1、在目标方法执行之后执行 2、当目标方法遇到异常,后置通知将不再执行 3、后置通知可以接受目标方法的返回值,但是必须注意: 后置通知的参数的名称和配置文件中returning=var的值是一致的 3、最终通知: 1、在目标方法执行之后执行 2、无论目标方法是否抛出异常,都执行,因为相当于finally 4、异常通知 1、接受目标方法抛出的异常信息 2、步骤 在异常通知方法中有一个参数Throwable ex 在配置文件中 5、环绕通知 1、如果不在环绕通知中调用ProceedingJoinPoint的proceed,目标方法不会执行 2、环绕通知可以控制目标方法的执行Spring的数据库操作(JDBC)Spring对jdbc做了良好的封装,本人在学习时做了以下几种方式的尝试首页先来创建一个dao接口Java代码 package com.wys.dao; public interface IUserDao void save(); 第一种方式通过继承JdbcDaoSupport来获取JdbcTemplate,需要注入JdbcTemplateJava代码 package com.wys.dao.impl; import java.util.Map; import org.springframework.jdbc.core.support.JdbcDaoSupport; import com.wys.dao.IUserDao; public class UserDaoImpl extends JdbcDaoSupport implements IUserDao Override public void save() String sql = *; Map map = this.getJdbcTemplate().queryForMap(sql); System.out.println(成功!); 配置文件如下:Java代码 JdbcTemplate提供了众多的对数据库操作的方法第二种方法是组合JdbcTemplate,因为JdbcTemplate的创建需要注入DataSource,所以这里只需要直接注入DataSource就可以Java代码 package com.wys.dao.impl; import java.util.Map; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.jdbc.core.support.JdbcDaoSupport; import com.wys.dao.IUserDao; public class UserDao2Impl implements IUserDao private JdbcTemplate jdbcTemplate; Override public void save() String sql = *; Map map = this.jdbcTemplate.queryForMap(sql); System.out.println(成功!); /注入DataSource public void setDataSource(DataSource dataSource) jdbcTemplate = new JdbcTemplate(dataSource); 配置文件Java代码 第三种方法是继承SimpleJdbcDaoSupport,通过SimpleJdbcDaoSupport可以获取SimpleJdbcTemplate,SimpleJdbcTemplate里也提供了大量的操作数据库的方法,因为SimpleJdbcDaoSupport继承了JdbcDaoSupport,所有可以获得JdbcTemplate,JdbcTemplate相对SimpleJdbcTemplate提供了更多和更高级的一些操作的方法,根据需要来使用,这里只需要直接注入JdbcTemplate,因为SimpleJdbcTemplate是通过JdbcTemplate来创建的Java代码 package com.wys.dao.impl; import java.util.Map; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.jdbc.core.support.JdbcDaoSupport; import com.wys.dao.IUserDao; public class UserDao3Impl extends SimpleJdbcDaoSupport implements IUserDao Override public void save() String sql = *; Map map = this.getSimpleJdbcTemplate().queryForMap(sql);/SimpleJdbcTemplate Map map2 = this.getJdbcTemplate().queryForMap(sql);/JdbcTemplate System.out.println(成功!); 配置如下:Java代码 第四种方法直接组合SimpleJdbcTemplate,因为SimpleJdbcTemplate的创建是需要DataSource的,所以需要注入DataSourceJava代码 package com.wys.dao.impl; import java.util.Map; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.jdbc.core.support.JdbcDaoSupport; import com.wys.dao.IUserDao; public class UserDao4Impl implements IUserDao private SimpleJdbcTemplate jdbcTemplate; Override public void save() String sql = *; Map map = this.jdbcTemplate.queryForMap(sql); System.out.println(成功!); public void setDataSource(DataSource dataSource) jdbcTemplate = new SimpleJdbcTemplate(dataSource); 配置文件:Java代码 第五种方法也是组全JdbcTemplate,直接注入JdbcTemplate,而不是DataSource ,因为在JdbcTemplate中已经注入了DataSourceJava代码 package com.wys.dao.impl; import java.util.Map; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.jdbc.core.support.JdbcDaoSupport; import com.wys.dao.IUserDao; public class UserDao5Impl implements IUserDao private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) this.jdbcTemplate = jdbcTemplate; Override public void save() String sql = *; Map map = this.jdbcTemplate.queryForMap(sql); System.out.println(成功!); 配置如下Java代码 用spring整合hibernate和struts2三大框架整合原理 1、三大框架的作用 struts2是一个mvc框架 spring容器 1、利用ioc和di做到了完全的面向接口编程 2、由于spring的声明式事务处理,使程序员不再关注事务 3、dao层和service层的类是单例的,但是action层是多例 hibernate 就是一个数据库的ormapping的框架 2、整合原理 1、当tomcat启动时,做的事情 1、因为在web.xml中, org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:spring/applicationContext.xml struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* 所以在启动的时候,执行的是 ContextLoaderListener contextInitialized this.contextLoader = createContextLoader(); 加载spring的配置文件 这里有一个固定的参数con的textConfigLocation 可以指定classpath路径下的spring的配置文件 也可以任意位置指定配置文件 spring*.xml WEB-INF/任意多个任意文件夹/spring-*.xml 如果没有指定固定参数,则查找默认的加载路径:WEB-INF/applicationContext.xml this.contextLoader.initWebApplicationContext(event.getServletContext(); 启动spring容器 总结:当tomcat启动的时候,spring

温馨提示

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

评论

0/150

提交评论