Spring知识整理(学习资料)
来源:互联网 发布:windows whistler2542 编辑:程序博客网 时间:2024/05/17 03:50
Spring知识整理
- Spring的核心机制
- 依赖注入
- Spring容器中的Bean
- 容器中Bean的作用域
- 使用自动装配注入合作者Bean
- 创建Bean的3种方式
- Annotation标注Spring Bean
- Spring的AOP
- JDBC抽象和DAO模块
- 对象/关系映射集成模块
- 不同方式的自动装配
- 基于注解的容器配置
- DispatcherServlet
- WebApplicationContext
- 控制器
Spring的核心机制
管理Bean
程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下三个实现类:
ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。
FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
WebXmlApplicationContext:从容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。
Spring优点
轻量:Spring 是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合。
面向切面编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
依赖注入
理解依赖注入
当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,传统模式下通常有两种做法:调用者主动创建被依赖对象,然后再调用被依赖对象的方法;调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。
使用Spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可,Spring容器负责将被依赖对象赋值给调用者的成员变量。
设值注入
设值注入是指IoC容器通过成员变量的setter方法来注入被依赖对象。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。
构造注入
利用构造器来设置依赖关系的方式,被称为构造注入。通俗来说,就是驱动Spring在底层以反射方式执行带指定参数的构造器,当执行带参数的构造器时,就可利用构造器参数对成员变量执行初始化——这就是构造注入的本质。
两种注入方式的对比
设值注入有如下优点:
与传统的JavaBean的写法更相似,程序开发人员更容易理解、接受。通过setter方法设定依赖关系显得更加直观、自然。
复杂的依赖关系,采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设值注入,则能避免这些问题。
构造注入优势如下:
构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。
对于依赖关系无需变化的Bean,构造注入更有用处。因为没有setter方法,所有的依赖关系全部在构造器内设定,无须担心后续的代码对依赖关系产生破坏。
依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系,对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。
注意:建议采用设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他依赖关系的注入,则考虑采用设值注入。
Spring容器中的Bean
对于开发者来说,开发者使用Spring框架主要是做两件事:①开发Bean;②配置Bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成”依赖注入”——这就是所谓IoC的本质。
容器中Bean的作用域
Singleton
单例模式,在整个Spring IoC容器中,singleton作用域的Bean将只生成一个实例。
Prototype
每次通过容器的getBean()方法获取prototype作用域的Bean时,都将产生一个新的Bean实例。
Request
对于一次HTTP请求,request作用域的Bean将只生成一个实例,这意味着,在同一次HTTP请求内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效。
Session
对于一次HTTP会话,session作用域的Bean将只生成一个实例,这意味着,在同一次HTTP会话内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效。
Global session
每个全局的HTTP Session对应一个Bean实例。在典型的情况下,仅在使用portlet context的时候有效,同样只在Web应用中有效。
如果不指定Bean的作用域,Spring默认使用singleton作用域。
5使用自动装配注入合作者Bean
Spring能自动装配Bean与Bean之间的依赖关系,即无须显式指定依赖Bean,而是由Spring容器检查XML配置文件内容,根据某种规则,为调用者Bean注入被依赖的Bean。Spring自动装配可通过元素的default-autowire属性指定,该属性对配置文件中所有的Bean起作用;也可通过对元素的autowire属性指定,该属性只对该Bean起作用。
创建Bean的3种方式
构造器创建Bean实例
采用默认构造器创建Bean实例,Spring对Bean实例的所有属性执行默认初始化,即所有的基本类型的值初始化为0或false;所有的引用类型的值初始化为null。
使用静态工厂方法创建Bean
使用静态工厂方法创建Bean实例时, ss属性class属性也必须指定,但此时cla并不是指定Bean实例的实现类,而是静态工厂类,Spring通过该属性知道由哪个工厂类来创建Bean实例。
除此之外,还需要使用factory-method属性来指定静态工厂方法,Spring将调用静态工厂方法返回一个Bean实例,一旦获得了指定Bean实例,Spring后面的处理步骤与采用普通方法创建Bean实例完全一样。如果静态工厂方法需要参数,则使用
调用实例工厂方法创建Bean
实例工厂方法与静态工厂方法只有一个不同:调用静态工厂方法只需使用工厂类即可,而调用实例工厂方法则需要工厂实例。采用实例工厂方法创建Bean的
Annotation标注Spring Bean
@Component
标注一个普通的Spring Bean类
@Controller
标注一个控制器组件类
@Service
标注一个业务逻辑组件类
@Repository
标注一个DAO组件类
在Spring配置文件中配置,指定自动扫描的包。
@Resource配置依赖
使用@Resource与
@PostConstruct和@PreDestroy定制生命周期行为
@PostConstruct和@PreDestroy同样位于javax.annotation包下,也是来自JavaEE规范的两个Annotation,Spring直接借鉴了它们,用于定制Spring容器中Bean的生命周期行为。它们都用于修饰方法,无须任何属性。其中前者修饰的方法是Bean的初始化方法;而后者修饰的方法是Bean销毁之前的方法。
Spring4.0增强的自动装配和精确装配
Spring提供了@Autowired注解来指定自动装配,@Autowired可以修饰setter方法、普通方法、实例变量和构造器等。当使用@Autowired标注setter方法时,默认采用byType自动装配策略。在这种策略下,符合自动装配类型的候选Bean实例常常有多个,这个时候就可能引起异常,为了实现精确的自动装配,Spring提供了@Qualifier注解,通过使用@Qualifier,允许根据Bean的id来执行自动装配。
Spring的AOP
AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题。在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。
使用AspectJ实现AOP
AspectJ是一个基于Java语言的AOP框架,提供了强大的AOP功能,其他很多AOP框架都借鉴或采纳其中的一些思想。其主要包括两个部分:一个部分定义了如何表达、定义AOP编程中的语法规范,通过这套语法规范,可以方便地用AOP来解决Java语言中存在的交叉关注点的问题;另一个部分是工具部分,包括编译、调试工具等。
AOP的基本概念
切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。
连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。
增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有”around”、”before”和”after”等类型
切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。
Spring的AOP支持
为了在应用中使用@AspectJ支持,Spring需要添加三个库:
aspectjweaver.jar
aspectjrt.jar
aopalliance.jar
并在Spring配置文件中做如下配置:
JDBC抽象和DAO模块
通过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用Spring的AOP 模块给Spring应用中的对象提供事务管理服务。
对象/关系映射集成模块
Spring 通过提供ORM模块,支持我们在直接JDBC之上使用一个对象/关系映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS SQL Maps。Spring的事务管理同样支持以上所有ORM框架及JDBC。
不同方式的自动装配
有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。
No
默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
byname
通过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
byType
通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
Constructor
这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
Autodetect
首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。
基于注解的容器配置
开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。
开启注解装配
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 元素。
@Required 注解
表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出bean初始化失败的异常。
@Autowired 注解
@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样。
DispatcherServlet
Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。
WebApplicationContext
WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。
控制器
控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。
@Controller 注解
该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。
@RequestMapping 注解
该注解是用来映射一个URL到一个类或一个特定的方处理法上。
- Spring知识整理(学习资料)
- Spring MVC学习资料整理
- Spring学习——Spring IOC 学习整理资料整理
- 【资料整理】Spring.Net框架学习(2)
- STRUTS+Hibernatre+Spring 组学习资料整理
- spring-boot-mybatis 学习资料整理
- Spring学习篇:AOP知识整理
- Spring学习篇:AOP知识整理
- Spring学习篇:AOP知识整理
- 学习资料整理(转)
- Vim学习资料(整理)
- 算法学习(资料整理)
- Spring Security 资料整理
- spring资料整理
- TransE 知识图谱资料整理
- Spring知识整理
- Spring知识整理
- Spring知识整理
- Sublime Text 3改变插件包安装位置
- dubbo入门
- SQL SERVER 2008用Select操作处理数据(四)——Where条件
- 2018科大讯飞校招---足球队
- pat1008
- Spring知识整理(学习资料)
- MyBatis的flushCache和useCache的使用
- 2018科大讯飞校招---争吵
- 每日一题--n个骰子的点数
- [笔记] 次小生成树
- 网络DHCP基本实验
- Numpy基本操作
- leetcode---decode-ways--dp
- Mysql性能优化