前言
一、Aop的介绍
二、自定义的Aop如何使用
三、Aop的使用场景
总结
前言
本编章主要介绍一下spring中的Aop如何使用自定义的方法来进行切入使用
一、Aop的介绍
首先,我们大家都知道,spring有俩大核心ioc和aop;今天我们主要来聊一下Aop,它也被称为“面向切面编程”,什么意思呢,按我个人的理解,它就是一个公家的东西,谁需要它,就配置一下相关参数,然后就可以使用它了,按我个人的学习习惯,我不是很喜欢像其他博主一样,讲一大堆的概念,然后你花了很多时间和精力去看,然后看到后面,又感觉啥都没领悟到,然后你出去面试,面试官叫你讲解一下Aop,你只会生硬套概念,无法通俗易懂地表达出来。
看百度全科的解释是这样的:
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
其实,对于初学者来说,这个百度的解释,说了跟没说一样,压根不懂。那么对于作者来说,我个人认为呀,其实,敲代码来得痛快点,从代码中去理解,然后从代码中去表达出来,是最快最好的入门方法。
这是本人上篇的开章介绍,接下来呢,主要介绍一下如何自定义自己的方法,来进行切入,来实现Aop的效果。
二、自定义的Aop如何使用
1.首先,这是目录结构,这次主要要使用definition这个包下的Definition类,以及service包下的CustomerService接口和CustomerServiceImpl实现类,以及配置文件applicationContext.xml
接下来,先把代码展示出来和稍微讲解一下,
首先,是Definition类
package com.myy.definition;
public class Definition {
public void before() {
System.out.println("===方法开始前====");
}
public void after(){
System.out.println("===方法完成后===");
}
}
Definition类,它是自己定义的类,我想在这个类中加了俩个方法分别是before()和after(),目的是在后面的测试类MyTest中分别切入这个俩个方法。这个就是自定义了,比如在以后的开发中,遇到比如有安全校验的业务需求时,可以使用这种方法,比如你前端访问后端中的好几个接口,但是你总不能每个接口都写一套安全校验的逻辑方法吧,这样的话,有几个接口,那你就要写好几个安全校验的方法,这样代码就重复了,且不优雅,所以,这时你就可以直接使用Aop嘛,自定义一个安全类,里面写好安全校验的方法,那这样,你就可以几个接口公用这个安全类嘛,这就省功夫了,且代码优雅。
然后呢,接下来是CustomerService接口
package com.myy.service;
public interface CustomerService {
void buy();
void eat();
void select();
}
还有就是CustomerServiceImpl实现类
package com.myy.service;
public class CustomerServiceImpl implements CustomerService{
@Override
public void buy() {
System.out.println("购买了一个面包");
}
@Override
public void eat() {
System.out.println("吃了一个面包");
}
@Override
public void select() {
System.out.println("选择了一款面包");
}
}
接下来是配置文件
<!-- 第2种方式:自定义的-->
<!-- 第1步,先注册bean,将实体类进行注册,注意,不是接口注册哈-->
<bean id="customerServiceImpl" class="com.myy.service.CustomerServiceImpl"></bean>
<bean id="definition" class="com.myy.definition.Definition"></bean>
<!-- 第2步,配置Aop切面-->
<aop:config>
<aop:aspect ref="definition">
<aop:pointcut id="point" expression="execution(* com.myy.service.CustomerServiceImpl.*(..))"/>
<!-- pointcut切入点 expression作为表达式,参数为切入的位置,CustomerServiceImpl.*表示类中所有方法都切入,.*(..)俩个点表示不指定参数-->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
<!-- method表示指定的类中definition的自定义的方法,aop:after代表后置-->
</aop:aspect>
</aop:config>
在这里,我主要讲解一下这个配置文件,它是在applicationContext.xml文件中进行配置的,
第一步,先注册bean,将实体类注册,注意哈,那个是实现类CustomerServiceImpl进行注册哈,不是这个CustomerService接口哈。
第二步,配置Aop切面
第一行中,ref="definition"对应上面实体类
第二行中,pointcut切入点 expression作为表达式,参数为切入的位置,CustomerServiceImpl.*表示类中所有方法都切入,.*(..)俩个点表示不指定参数
第三行中,就是自定义的方法,<aop:before method="before" pointcut-ref="point"/>
第四行中,也是自定义的方法,<aop:after method="after" pointcut-ref="point"/>
就这样,就可以使用了
最后是测试类
package com.myy.test;
import com.myy.service.CustomerService;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args){
// 1.第一步,加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2.第二步,通过目标的bean id,获得代理对象
CustomerService proxy = (CustomerService)context.getBean("customerServiceImpl");
// System.out.println("顾客接口调用吃的方法====");
proxy.eat();
}
}
测试效果图:
三、Aop的使用场景
1.数据加密验签
比如登录时的个人信息验证,可以通过一个"拦截器"对手机号,身份证号这种敏感信息做这种特殊处理。
2.日志打印
这个在开发中也是比较常见的了。
3.切换多个数据源
可以在执行不同的方法时,根据需要定义,判断切换连接不同的数据源
4.性能统计
5.同步数据
6.权限控制
等等
总结
本文主要是想介绍一下,以后在开发过程,在考虑到多处地方,需要切入自己自定义方法来实现相关业务时,该如何使用,这个例子只是一个非常简单的举例,但到了真正开发时,需要结合你们的业务参考来实现。