代理实现程序功能的统一维护的一种技术。
AOP
的作用:不修改源码的情况下,程序运行期间对方法进行功能增强
好处:
1
、减少代码的重复,提高开发效率,便于维护。
2
、专注核心业务的开发。
核心业务和服务性代码混合在一起
开发中:各自做自己擅长的事情,运行的时候将服务性代码织入到核心业务中。
通过
spring
工厂自动实现将服务性代码以切面的方式加入到核心业务代码中。
代理模式
代理:自己不做,找人帮你做。
代理模式:在一个原有功能的基础上添加新的功能。
分类:静态代理和动态代理。
首先,新建一个service包,作为业务层,业务层新建代码UserService
package com.lr.spring.service;
public interface UserService {
void insert();
}
再新建一个staticProxy(静态的代理服务器)包,写UserService的实现类放在staticProxy包里
1.代码逻辑
目标对象
package com.lr.spring.staticProxy;
import com.lr.spring.service.UserService;
//目标对象
public class UserServiceImpl implements UserService {
@Override
public void insert() {
System.out.println("目标对象的方法:插入一个User对象");
}
}
代理对象
package com.lr.spring.staticProxy;
import com.lr.spring.service.UserService;
//代理对象
public class UserServiceProxy implements UserService {
//1.注入目标对象,底层我们依然需要去调用目标对象中接口的方法
private UserService userService;
//构造方法
public UserServiceProxy(UserService userService) {
this.userService = userService;
}
//2.需要对目标对象的特定方法进行增强(加上事务),调用目标对象的方法
@Override
public void insert() {
try{
System.out.println("开启事务");
userService.insert();//调用目标对象的方法
System.out.println("提交事务");
}catch (Exception e){
System.out.println("回滚事务");
}finally {
System.out.println("最终操作");
}
}
}
测试目标对象与代理对象
@Test
public void test01() {
//目标对象
UserService userService = new UserServiceImpl();
userService.insert();
System.out.println("..................");
//代理对象
UserServiceProxy userServiceProxy = new UserServiceProxy(userService);
userServiceProxy.insert();
}
面向切面编程思想
AOP
为
Aspect Oriented Programming
的缩写,意思为
面向切面编程
,是通过预编译方式和运行期动态 代理实现程序