Spring:
IOC(控制反转):
原理:
(1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,⽽不是传统实现中,由程序代码直接操控。控制权
由应⽤代码中转到了外部容器,控制权的转移是所谓反转。 对于Spring⽽⾔,就是由Spring来控制对象的⽣命周期和对象之间的
关系;IoC还有另外⼀个名字——“依赖注⼊(Dependency Injection)”。从名字上理解,所谓依赖注⼊,即组件之间的依赖关系
由容器在运⾏期决定,即由容器动态地将某种依赖关系注⼊到组件之中。
(2). 在Spring的⼯作⽅式中,所有的类都会在spring容器中登记,告诉spring这是个什么东⻄,你需要什么东⻄,然后
spring会在系统运⾏到适当的时候,把你要的东⻄主动给你,同时也把你交给其他需要你的东⻄。所有的类的创建、销毁都由
spring来控制,也就是说控制对象⽣存周期的不再是引⽤它的对象,⽽是spring。对于某个具体的对象⽽⾔,以前是它控制其他对
象,现在是所有对象都被spring控制,所以这叫控制反转。
(3). 在系统运⾏中,动态的向某个对象提供它所需要的其他对象。
(4). 依赖注⼊的思想是通过反射机制实现的,在实例化⼀个类时,它通过反射调⽤类中set⽅法将事先保存在HashMap中
的类属性注⼊到类中。 总⽽⾔之,在传统的对象创建⽅式中,通常由调⽤者来创建被调⽤者的实例,⽽在Spring中创建被调⽤者
的⼯作由Spring来完成,然后注⼊调⽤者,即所谓的依赖注⼊or控制反转。 注⼊⽅式有两种:依赖注⼊和设置注⼊; IoC的优
点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。
jdbcTemplate 组件:
概述: 是spring提供的一个模板类,底层封装jdbc,用户持久层操作,作用:使用简单方便;
- JdbcTemplate主要提供以下五类方法:
1、execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句
2、update方法:update方法用于执行新增、修改、删除等语句
3、batchUpdate方法:用于执行批处理相关语句
4、query方法及queryForXXX方法:用于执行查询相关语句
5、call方法:用于执行存储过程、函数相关语句
XML配置:
【1】IOC管理dataSource数据源的配置
<bean id="dataSource" class=
"org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--${}用于按key取得配置文件中的配置-->
<property name="driverClassName"
value="${dataSource.driverClassName}"></property>
<property name="url" value="${dataSource.url}"></property>
<property name="username" value="${dataSource.username}"></property>
<property name="password" value="${dataSource.password}"></property>
</bean>
【2】IOC管理jdbcTemplate的配置
<!--配置jdbc查询模板,注入dataSource-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
【3】加载外部配置文件
<!--读取外部根目录下资源配置文件-->
<context:property-placeholder
location="classpath:db.properties"></context:property-placeholder>
AOP(面向切面):
AOP(Aspect-OrientedProgramming,面向方面编程):使用动态代理技术,在不修改源码的情况下,对类中的方法进行增强;
利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
相关术语:
#Joinpoint(连接点):
在spring中,连接点指的都是方法(指的是那些要被增强功能的候选方法)
#Pointcut(切入点):
切入点是指我们要对哪些Joinpoint进行拦截的定义。
#Advice(通知):
通知指的是拦截到Joinpoint之后要做的事情。即增强的功能
通知类型:前置通知、后置通知、异常通知、最终通知、环绕通知
#Target(目标对象):
被代理的对象。
#Proxy(代理对象):
一个类被AOP织入增强后,即产生一个结果代理类。
#Weaving(织入):
织入指的是把增强用于目标对象。创建代理对象的过程
#Aspect(切面):
切面指的是切入点和通知的结合`
Spring七大事务传播属性 && 五大隔离级别
- 传播属性:
- PROPAGATION_REQUIRED – ⽀持当前事务,如果当前没有事务,就新建⼀个事务。这是最常⻅的选择。
- PROPAGATION_SUPPORTS – ⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏。
- PROPAGATION_MANDATORY – ⽀持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRESNEW – 新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATION_NOTSUPPORTED – 以⾮事务⽅式执⾏操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER – 以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。
- PROPAGATIONNESTED – 如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则进⾏与
PROPAGATIONREQUIRED类似的操作。
- 隔离级别:
- ISOLATION_DEFAULT 这是⼀个PlatfromTransactionManager默认的隔离级别,使⽤数据库默认的事务隔离级别.
- 另外四个与JDBC的隔离级别相对应:
- ISOLATION_READUNCOMMITTED: 这是事务最低的隔离级别,它充许别外⼀个事务可以看到这个事务未提交的数
据。这种隔离级别会产⽣脏读,不可重复读和幻读。 - ISOLATION_READCOMMITTED 保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取
该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。 - ISOLATION_REPEATABLEREAD 这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻读。它除了保证
⼀个事务不能读取另⼀个事务未提交的数据外,还保证了避免不可重复读。 - ISOLATION_SERIALIZABLE 这是花费最⾼代价但是最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏
读,不可重复读外,还避免了幻读。
SpringMVC :
Srping MVC 是一种基于Servlet的技术,它提供的核心控制组件DispatcherServlet 和相关的组件,并制定了松散的结构,已适应各种灵活的需要。
SpringMVC请求处理流程:
1、请求解析和匹配DipatcherServlet路径:客户端发出⼀个http请求给web服务器,web服务器对http请求进⾏解析,
如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.
2、匹配处理器Handler:DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http⽅法、请求报⽂头
和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。
3-4、处理器进⾏处理:DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给
Handler(Handler将具体的处理进⾏封装),再由具体的HandlerAdapter对Handler进⾏具体的调⽤。
5、处理器返回逻辑视图ModelAndView对象给DispatcherServlet:Handler对数据处理完成以后将返回⼀个
ModelAndView()对象给DispatcherServlet。
6、Dispatcher通过ViewResolver将逻辑视图转化为正式视图view:Handler返回的ModelAndView()只是⼀个逻辑视
图并不是⼀个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。
7、Dispatcher通过model解析出ModelAndView()中的参数进⾏解析最终展现出完整的view并返回给客户端。
注解汇总
【Spring-IOC相关】
注解 | xml | 说明 |
---|---|---|
@Component父注解 @Controller:用于响应层的注解 @Service:用于业务层的注解 @Repository:一般用于持久层的注解 | < bean id="" class=""> | 声明bean交于springIOC管理 |
@Scope | scope=“singleton/prototype” | 生命周期 |
@PostConstruct | init-method | 初始化方法 |
@PreDestroy | destroy-method | 销毁方法 |
【Spring-DI相关】
注解 | xml | 说明 |
---|---|---|
@Autowired、@Qualifier | ref=“类型” | 默认按照bean的类型注入数据 |
@Resource | ref=“类型” | 默认按照bean的名称注入数据 |
@Value | ref=“基础数据类型” | 给基本数据类型赋值 |
【Spring-AOP相关】
注解 | xml | 说明 |
---|---|---|
@Aspect | <aop:aspect > | 声明切面 |
@Before | <aop:before > | 前置通知 |
@AfterReturning | <aop:after-returning > | 后置正常通知 |
@AfterThrowing | <aop:after-throwing > | 后置异常通知 |
@After | <aop:after > | 最终通知 |
@Around | <aop:around > | 环绕通知 |
【Spring-TX相关】
@Transactional
@Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
【属性】
属性 | 类型 | 说明 |
---|---|---|
value | String | 可选的限定描述符,指定使用的事务管理器 |
propagation | enum: Propagation | 可选的事务传播行为设置 |
isolation | enum: Isolation | 可选的事务隔离级别设置 |
readOnly | boolean | 读写或只读事务,默认读写 |
timeout | int (in seconds granularity) | 事务超时时间设置 |
rollbackFor | Class对象数组,必须继承自Throwable | 导致事务回滚的异常类数组 |
rollbackForClassName | 类名数组,必须继承自Throwable | 导致事务回滚的异常类名字数组 |
noRollbackFor | Class对象数组,必须继承自Throwable | 不会导致事务回滚的异常类数组 |
noRollbackForClassName | 类名数组,必须继承自Throwable | 不会导致事务回滚的异常类名字数组 |
【Spring-JUNIT相关】
注解 | 说明 |
---|---|
@RunWith | 指定使用SpringJUnit4ClassRunner |
@ContextConfiguration | 指定加载配置文件 |
【Spring-MVC相关】
注解 | 说明 |
---|---|
@RequestMapping | 配置映射地址 |
@GetMapping | 配置映射地址GET:得到资源 |
@PutMapping | 配置映射地址PUT:修改整体内容 |
@PostMapping | 配置映射地址POST:新增内容 |
@DeleteMapping | 配置映射地址DELETE:删除内容 |
@PatchMapping | 配置映射地址PATCH:修改部分内容 |
@PathVariable | 绑定URL中的参数值 |
@RequestParam | 绑定单个请求数据,既可以是URL中的参数,也可以是表单提交的参数 |
@RequestBody | 请求参数格式为json |
@RestController | 注释在类上,生命一个bean,且表示此类中返回类型都是json(@Controller+@ResponseBody) |
@ResponseBody | 注解在方法上,表示此方法返回类型为json |
@ExceptionHandler | 异常处理 |
@ControllerAdvice | 对controller层进行增强 |
【配置类相关】
注解 | XML | 说明 |
---|---|---|
@Configuration | / | 声明此类为配置类 |
@EnableAspectJAutoProxy | <aop:aspectj-autoproxy > | 开启AOP |
@EnableTransactionManagement | <tx:annotation-driven > | 开启事务管理器 |
@EnableWebMvc(*) | <mvc:annotation-driven > | 开启springMVC |
@PropertySource | <context:property-placeholder > | 导入外部配置 |
@MapperScan(*) | / | mybatis的扫描配置 |
@Bean | < bean > | 声明bean |
@ComponentScan | <context:component-scan > | 扫描配置 |