今天是学习基于maven的Spring框架的第五天。学习了Spring的两大核心之一的Spring AOP ;其中学习了什么是AOP,相关注解、入门案例及底层分析。下面就是今天的学习笔记了。
一、概述
AOP:全称是Aspect Oriented Programing 即:面向切面编程。
面向切面编程:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术;简单来说就是使用代理技术,在不修改代码的基础上,对已有方法进行增强。
二、注解
注解 | 作用 |
@EnableAspectJAutoProxy | 开启AOP编程(配置类中) |
@Aspect | 切面编程注解(切面类中) |
@Before | 前置通知(初始化、加载配置文件 ) |
@AfterReturning | 后置通知(处理数据(Java对象 --> JSON字符串) ) |
三、入门案例
1、需求:
编写service接口,提供insert、update方法
编写切面类,对两个方法进行事务管理(开始事务、结束事务)
2、分析:
3、实现:
service接口:
public interface UserService {
//添加方法
void insert();
//更新方法
void update();
}
service实现类:
@Service
public class UserServiceImpl implements UserService {
@Override
public void insert() {
System.out.println("添加方法");
}
@Override
public void update() {
System.out.println("更新方法");
}
}
配置类:
@Configuration //声明配置类
//扫描被加载类的包
@ComponentScan(basePackages = {"com.czxy.demo14_aop_interface.service","com.czxy.demo14_aop_interface.aop"})
@EnableAspectJAutoProxy //开启AOP
public class Demo14Configuration {
}
切面类:
@Component //添加到Spring容器
@Aspect //支持AOP
public class MyAspect {
@Before("execution(* com.czxy.demo14_aop_interface.service..*.*())")
public void start(){//开启事务
System.out.println("--------");
System.out.println("开启事务");
}
@AfterReturning("execution(* com.czxy.demo14_aop_interface.service..*.*())")
public void commit(){//结束事务
System.out.println("结束事务");
}
}
测试类:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = Demo14Configuration.class) //加载配置类
public class TestDemo14 {
//依赖注入
@Resource
private UserService userService;
@Test
public void run (){
userService.insert();
userService.update();
}
}
运行结果:
四、底层分析
-
AOP的底层采用代理方式
-
接口+实现类方案,采用JDK 动态代理。
-
仅实现类方案,采用cglib代理,生成实现类的子类,从而对实现类进行增强操作。