框架02 -- Spring
Spring
1. ORM
- ORM,即对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
- 映射的不只是对象的值还有对象之间的关系,通过 ORM 就可以把对象映射到关系型数据库中。
- 操作实体类就相当于操作数据库表,可以不再重点关注 SQL 语句。
2. 简述对于Spring的理解
- Spring是一个开源框架,主要是为简化企业级应用开发而生。可以实现EJB可以实现的功能,Spring是一个IOC和AOP容器框架。 核心是 控制反转(IOC)、 依赖注入(DI)、 面向切面编程(AOP)[介绍见下文]
2、在Spring中,所有管理的都是JavaBean对象,而BeanFactory和ApplicationContext就是Spring框架的那个IOC容器,现在一般使用ApplicationContext,其不但包括了BeanFactory的作用,同时还进行了更多的扩展。
3. 使用Spring框架的好处
4. Spring中的注解
@Controller
- 用于 Spring MVC 项目中的控制器类。@Service
- 用于服务类。@RequestMapping
- 用于在控制器处理程序方法中配置 URI 映射。- 用于将特定HTTP请求方法映射到将要处理相应请求的控制器中的特定类/方法
- 此注解可应用于两个级别:
- 类级别:映射请求的URL
- 方法级别:映射URL以及HTTP请求方法
- 此注解可应用于两个级别:
- 用于将特定HTTP请求方法映射到将要处理相应请求的控制器中的特定类/方法
@ResponseBody
- 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。@PathVariable
- 用于将动态值从 URI 映射到处理程序方法参数。@Autowired
- 用于在 spring bean 中自动装配依赖项。@Qualifier
- 配合 @Autowired 注解一起使用,以避免在存在多个 bean 类型实例时出现混淆,实现根据name注入。@Scope
- 用于配置 spring bean 的范围。@Configuration
,@ComponentScan
和@Bean
- 用于基于 java 的配置。@Aspect
,@Before
,@After
,@Around
,@Pointcut
- 用于切面编程(AOP)
5. Spring中@Autowired和@Resource的区别
- @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
- 1、共同点
- 两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
- 2、不同点
@Autowired
- @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照类型(byType)注入。
public class TestServiceImpl { // 下面两种@Autowired只要使用一种即可 @Autowired private UserDao userDao; // 用于字段上 @Autowired public void setUserDao(UserDao userDao) { // 用于属性的方法上 this.userDao = userDao; } }
- @Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
public class TestServiceImpl { @Autowired @Qualifier("userDao") //两个注解一起使用 private UserDao userDao; }
- @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照类型(byType)注入。
@Resource
- @Resource默认按照名称(ByName)自动注入,由J2EE提供,需要导入包javax.annotation.Resource。
- @Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
public class TestServiceImpl { // 下面两种@Resource只要使用一种即可 @Resource(name="userDao") //一般括号里的内容也可省略不写 private UserDao userDao; // 用于字段上 @Resource(name="userDao") public void setUserDao(UserDao userDao) { // 用于属性的setter方法上 this.userDao = userDao; } }
- 注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。
- @Resource装配顺序:
- ①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
- ②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
- ③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
- ④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
- @Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
IOC,DI
6. 简述什么是IOC
- IOC是典型的工厂模式,通过sessionfactory去注入实例
- spring的IOC容器是spring的核心
- 在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。但在spring里,创建被调用者的工作不再由调用者来完成,因此被称为控制反转(IOC [
Inversion of Control
]);创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此被称为依赖注入(DI [Dependency Injection
]),依赖注入和控制反转其实是一个概念。相对于IOC而言,依赖注入(DI)更加准确地描述了IOC的设计理念。所谓依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。
- IOC:(Inversion of Control)控制反转。利用了工厂模式,将对象交给spring容器管理,你只需要在spring配置文件中配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把他已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了
- spring ioc 初始化的过程
- 最直观的表达就是:IOC让对象的创建不用去new了,可以由spring自动生产,使用Java的反射机制,根据配置文件在运行时,动态的去创建对象以及管理对象,并调用对象的方法
- SpringIOC有三种注入方式:
- 构造器注入
- setter方法注入
- 根据注解注入
AOP
7. 简述什么是AOP
- AOP是典型的代理模式的体现
- 代理模式是Java的常用设计模式。他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类、以及时候处理消息等等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
- Spring AOP 是Spring框架的重要组成部分
- 面向切面编程(AOP)是以另一个角度来考虑程序结构,通过分析程序结构的关注点来完善面向对象编程(OOP)。OOP将应用程序分解为各个层次的对象,而AOP将程序分解为多个切面。SpringAOP只实现了方法级别的连接点
- AOP:面向切面编程(Aspect - Oriented Programming)
- AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP就显得无能为力。也就是说,OOP只适合从上到下的关系,并不适合定义从左到右的关系。
- 例如日志功能,日志代码往往水平散布在所有对象层次中,而与他所散布到的对象的核心功能毫无关系。在OOP设计中,他导致了大量代码的重复,且不利于各个模块的重用。
- AOP将程序中的交叉业务逻辑(比如安全,日志,事务等) ,封装成一个切面,然后注入到目标对象(具体的业务逻辑)中去
- 实现AOP的技术,主要分为两种:
- 一是采用动态代理的技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行
- 二是采用静态织入的方式,引入特定的语法,创建“方面”,从而使得编译器可以在编译时期织入有关“方面”的代码
- Spring AOP有三要素:
- Aspect定义切面;
- 通过通知(Advice)来指定具体做什么事情。如方法执行前做什么,方法执行后做什么,抛出异常做什么,从而实现对象行为(方法)的增强;
- 具体通过切点(PointCut)配置切点表达式(expression)来指定在哪些类的哪些方法上织入(ware)横切逻辑;被切的地方叫连接点(JoinPoint);
8. AOP中的常见名词
切面(Aspect)
:被抽取的公共模块,可能会横切多个对象。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。连接点(Join point)
:指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。通知(Advice)
:在切面的某个特定的连接点(Join point)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。切入点(Pointcut)
:切入点是指 我们要对哪些Join point进行拦截的定义。通过切入点表达式,指定拦截的方法,比如指定拦截add、search。引入(Introduction)
:(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。目标对象(Target Object)
: 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(adviced) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。织入(Weaving)
:指把增强应用到目标对象来创建新的代理对象的过程。Spring是在运行时完成织入。- 切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)。
9. AOP相关注解
@Aspect
:声明被注解的类是⼀个切⾯ Bean。标记着这是一个aop的类:切面(由切点和通知组成)- 切点(指定具体要用通知的类或者方法),切点表达式:
* cn.tedu.service..*.*(..)
,即方法返回值/包路径/子包/类名/方法名/参数列表
,*
是通配符..
标识0~n个 @Pointcut
:标注切点表达式,如@Pointcut("execution( * cn.tedu.service..*.*(..))")
- Spring框架实现了AOP面向切面,其引入了第三方AspectJ框架来具体实现。AspectJ提供了五种切入方式,术语称为通知advice。
- 五种方式分别为:
@Before
:前置通知,指在某个连接点之前执行的通知。@After
:后置通知,指某个连接点退出时执行的通知(不论正常返回还是异常退出)@Around()
:环绕通知的注解,在业务方法执行前后添加功能@AfterReturning
:返回后通知,指某连接点正常完成之后执行的通知,返回值使用returning属性接收。@AfterThrowing
:异常通知,指方法抛出异常导致退出时执行的通知,和 @AfterReturning 只会有⼀个执行,异常使用throwing属性接收。
- 五种方式分别为: