关于spring:SpringAop重难点分析

5次阅读

共计 2437 个字符,预计需要花费 7 分钟才能阅读完成。

重难点剖析

AOP 是什么,解决了什么问题,利用场景?

是什么?

AOP: 面向切面编程,可能在不扭转原有代码的状况下对代码的性能进行加强。

解决了什么问题?

AOP 次要用来解决:在不扭转原有业务逻辑的状况下,加强横切逻辑代码,基本上解耦合,防止横切逻辑代码反复。
可能解决 代码的臃肿问题 ,进步代码的 可维护性

利用场景?

次要利用于:日志记录,事务管制,性能统计,安全控制,异样解决等。

AOP 编程根本步骤及实现过程(以基于 AspectJ 框架实现为例)。

1. 增加依赖

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2. 创立日志切面类对象(以日志为例)

package com.cy.pj.common.aspect;
@Aspect// 示意此类对象为一个切面
@Slf4j
@Component// 将此类交给 spring 治理
public class SysLogAspect {@Pointcut("bean(sysUserServiceImpl)")// 切入点
         public void logPointCut() {}
         @Around("logPointCut()")// 盘绕告诉,示意此办法在外围业务执行之前和之后执行
         public Object around(ProceedingJoinPoint jp)
         throws Throwable{
                 try {log.info("start:{}"+System.currentTimeMillis());
                   Object result=jp.proceed();// 最终会调用指标办法
                   log.info("after:{}"+System.currentTimeMillis());
                   return result;
                 }catch(Throwable e) {log.error("after:{}",e.getMessage());
                   throw e;
                 }
         }
}

3. 测试

@SpringBootTest
public class AopTests {
         @Autowired
         private SysUserService userService;
         @Test
         public void testSysUserService() {   PageObject<SysUserDeptVo>po=userService.findPageObjects("admin",1);
          System.out.println("rowCount:"+po.getRowCount());
         }
}

AOP 编程中的外围对象及利用关系。

Aspect:切面,由一系列切点、加强和引入组成的模块对象,可定义优先级,从而影响加强和引入的执行程序。事务管理(Transaction management)在 java 企业应用中就是一个很好的切面样例。

Join point:接入点,程序执行期的一个点,例如办法执行、类初始化、异样解决。在 Spring AOP 中,接入点始终示意办法执行。

Advice:加强,切面在特定接入点的执行动作,包含“around,”“before”and “after” 等多种类型。蕴含 Spring 在内的许多 AOP 框架,通常会应用拦截器来实现加强,围绕着接入点保护着一个拦截器链。

Pointcut:切点,用来匹配特定接入点的谓词(表达式),加强将会与切点表达式产生关联,并运行在任何切点匹配到的接入点上。通过切点表达式匹配接入点是 AOP 的外围,Spring 默认应用 AspectJ 的切点表达式。

Introduction:引入,为某个 type 申明额定的办法和字段。Spring AOP 容许你引入任何接口以及它的默认实现到被加强对象上。
Target object:指标对象,被一个或多个切面加强的对象。也叫作被加强对象。既然 Spring AOP 应用运行时代理(runtime proxies),那么指标对象就总是代理对象。

AOP proxy:AOP 代理,为了实现切面性能一个对象会被 AOP 框架创立进去。在 Spring 框架中 AOP 代理的默认形式是:有接口,就应用基于接口的 JDK 动静代理,否则应用基于类的 CGLIB 动静代理。然而咱们能够通过设置 proxy-target-class=”true”,齐全应用 CGLIB 动静代理。

Weaving:织入,将一个或多个切面与类或对象链接在一起创立一个被加强对象。织入能产生在编译时(compile time)(应用 AspectJ 编译器),加载时(load time),或运行时(runtime)。Spring AOP 默认就是运行时织入,能够通过枚举 AdviceMode 来设置。

AOP 思维在 Spring 中的实现原理剖析。
AOP 编程中基于注解形式的配置实现。(@Aspect,@PointCut,@Around,…)
AOP 编程中基于注解形式的事务管制。(@Transactional)
AOP 编程中异步操作的实现?(@EnableAsync,@Async)
AOP 编程中的缓存利用?(@EnableCaching,@Cacheable,@CacheEvict)

FAQ 剖析

什么是 OCP 准则(开闭准则)?
什么是 DIP 准则 (依赖倒置)?
什么是繁多职责准则 (SRP)?
Spring 中 AOP 的有哪些配置形式?(XML, 注解)
Spring 中 AOP 的告诉有哪些根本类型?(5 种)
Spring 中 AOP 是如何为 Bean 对象创立代理对象的?(JDK,CGLIB)
Spring 中 AOP 切面的执行程序如何指定?(@Order)
Spring 单体架构我的项目中事务的管制要通过 Connection 对象实现,?
Spring 如何保障一个线程一个 Connection 对象? 借助 ThreadLocal 实现.?
多个事务并发执行时可能会呈现什么问题?(脏读,不可反复读,幻影读)
理解事务的隔离级别吗?晓得具体的利用场景吗?

正文完
 0