Spring的AOP面向切面编程思想

一、组件扫描

1.在classpath中扫描组件

(1)组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件

(2)特定组件包括:

@Component:基本注解,标识了一个受Spring管理的组件

@Respository:标识持久层组件

@Service:标识服务层(业务层)组件

@Controller:标识表现层组件

(3)对于扫描到的组件,Spring有默认的命名策略:使用非限定类名,第一个字母小写。也可以在注解中通过value属性值标识组件的名称

2.配置组件扫描

当在组件类上使用了特定的注解之后,还需要在Spring的配置文件中声明<context:component-scan>:

(1)base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包里及其子包中的所有类

(2)当需要扫描多个包时,可以使用逗号分隔

(3)如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:

(4)<context:include-filter>子节点表示要包含的目标类

(5)<context:exclude-filter>子节点表示要排除在外的目标类

(6)<context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>子节点

3.使用注解创建bean

(1)定义UserService类,在类上加@Service注解

(2)在测试类中通过getBean方法来获取UserService的bean

4.spring执行解析注解的流程:

(1)加载配置文件

(2)读取配置文件中的扫包路径

(3)扫描该包下的所有类

(4)如果类上标注了spring的注解,则spring会给该类创建对象,存入容器

(5)对象的名字是采用该类的类名,且首字母小写

5.注解属性注入

(1)@Autowired注解自动装配具有兼容类型的单个Bean属性

构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@Autowired注解

默认情况下,所有使用@Authwired注解的属性都需要被设置。当Spring找不到匹配的Bean装配属性时,会抛出异常,若某一属性允许不被设置,可以设置@Authwired注解的required属性为false

默认情况下,当IOC容器里存在多个类型兼容的Bean时,通过类型的自动装配将无法工作。此时可以在@Qualifiter注解里提供Bean的名称。Spring允许对方法的入参标注@Qualifiter已指定注入Bean的名称

(2)@Resourse注解要求提供一个Bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为Bean的名称

Resourse注解和Autowired注解区别:

6.事务管理

在方法上增加@Transactional注解,可以让spring帮我们处理事务的问题

二、AOP面向切面编程

1.AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统OOP(Object-Oriented Programming,面向对象编程)的补充

2.AOP的主要编程对象是切面(aspect),而切面模块化横切关注点

3.在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能在哪里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化到特殊的对象(切面)里

4.AOP的好处:

(1)每个事物逻辑位于一个位置,代码不分散,便于维护和升级

(2)业务模块更简洁,只包含核心业务代码

5.问题分析

6.代码实现

7.这样实现的问题

(1)代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀。每个方法在处理核心逻辑的同时还必须兼顾其它多个关注点

(2)代码分散:以日志需求为例,只是为了满足这个单一需求,就不得不在多个模块(方法)里多次重复相同的日志代码。如果日志需求发生变化,必须修改所有模块

三、AOP术语

1.通知(Advice)

切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题

2.连接点(Join point)

连接点是在应用执行过程中能够插入切面的一个点

3.切点(Pointcut)

一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的"什么"和"何时"的话,那么切点就定义了"何处"。因此,切点其实就是定义了需要执行在哪些连接点上执行通知

4.切面(Aspect)

切面是通知和切点的结合。通过和切点共同定义了切面的全部内容------它是什么,在何时和在何处完成其功能

5.引入(Introduction)

引入允许我们向现有的类添加新方法或属性

6.织入(Weaving)

织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有很多个点可以进行织入

四、配置AOP

1.引入aop需要的jar包

配置pom.xml文件

2.在applicationContext.xml文件中配置aop

<aop:aspect j-autoproxy/>

3.了解通知机制

  • 前置通知(Before):在目标方法被调用之前调用通知功能
  • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
  • 返回通知(After-returning):在目标方法成功执行之后调用通知
  • 异常通知(After-throwing):在目标方法抛出异常后调用通知
  • 环绕通知(Around):通知包裹了被通知的方法

4.编写切面类:AspectTest1

参数JoinPoint可以用来获取方法名、方法参数等

5.在applicationContext.xml中增加aop配置

使用表达式来匹配需要被关联的方法

五、使用注解配置AOP

1.注解配置AOP

2.AOP执行顺序

对于多个切面类想要自己定义每个切面的执行顺序可以给类加上@Order注解

Order注解有value属性,该属性默认值是2147483647,值越小优先级越高

相关推荐
星沁城19 分钟前
236. 二叉树的最近公共祖先
java·数据结构·leetcode·二叉树
oliveira-time1 小时前
Java 1.8(也称为Java 8)
java·开发语言
极小狐3 小时前
如何使用极狐GitLab 软件包仓库功能托管 maven?
java·运维·数据库·安全·c#·gitlab·maven
.生产的驴3 小时前
SpringBoot 集成滑块验证码AJ-Captcha行为验证码 Redis分布式 接口限流 防爬虫
java·spring boot·redis·分布式·后端·爬虫·tomcat
野犬寒鸦5 小时前
MySQL索引使用规则详解:从设计到优化的完整指南
java·数据库·后端·sql·mysql
思考的橙子5 小时前
Springboot之会话技术
java·spring boot·后端
钰爱&5 小时前
【Linux】POSIX 线程信号量与互斥锁▲
java·开发语言·jvm
黑匣子~7 小时前
java集成telegram机器人
java·python·机器人·telegram
竹小春逢十八8 小时前
Java常用类概述
java
兆。8 小时前
电子商城后台管理平台-Flask Vue项目开发
前端·vue.js·后端·python·flask