AOP:面向切面编程,是OOP(面向对象编程)的延续。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码。
aop底层使用动态代理实现
- 第一种情况,有接口情况,使用动态代理创建接口实现类代理对象。
- 没有接口情况,使用动态代理创建类的子类代理对象
AOP的操作术语
Joinpoint(连接点):指类里面可以被增强的方法,这些方法被称为连接点
Pointcut(切入点):指在类里面被实际增强的方法
Advice(增强/通知):增强到具体切入点的逻辑,比如扩展日志功能,这个日志功能被称为增强。其中通知可分为
- 前置通知:在方法之前执行
- 后置通知:在方法之后执行
- 异常通知:方法出现异常
- 环绕通知:在方法之前后之后执行
- 最终通知:在后置之后执行
spring的AOP操作
在spring里面进行AOP操作,使用aspectj实现,注意:
1.aspectj不是spring的一部分,它和spring一起使用进行aop操作
2.使用aspectj有两种操作手段,一是基于aspectj的xml配置,二是基于aspectj的注解方式
AOP的操作准备
-
除了导入基本的jar包之外,还需导入aop相关的jar包,具体如下
image.png
2.创建spring核心配置文件,引入aop约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLo3cation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
2.创建2个JavaBean
bean
package cn.sxj.spring.bean;
public class Book {
public void read() {
System.out.println("读书好");
}
}
package cn.sxj.spring.bean;
public class MyBook {
public void add() {
System.out.println("添加这个功能到Book的read方法");
}
}
3.然后就可以在配置文件里面进行ao'p操作了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置对象 -->
<bean name="book" class="cn.sxj.spring.bean.Book"></bean>
<bean name="myBook" class="cn.sxj.spring.bean.MyBook"></bean>
<!-- 配置aop操作 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* cn.sxj.spring.bean.Book.*(..))" id="pointcut1"/>
<!-- 配置切面,把增强用到方法上面 -->
<aop:aspect ref="myBook">
<!-- 配置增强类型 -->
<aop:before method="add" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
</beans>
最后我们写一个测试文件测试一下
package cn.sxj.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.sxj.spring.bean.Book;
public class Test01 {
@Test
public void testService() {
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Book book = (Book) context.getBean("book");
book.read();
}
}
测试结果
从测试结果我们可以发现,add方法成功添加到了read方法
网友评论