AOP
- AOP:面向切面(方面)编程
- 比如说核心代码在不可更改的情况下,如何让核心代码的功能变强?
- 使用AOP编程,AOP思想的核心就是代理,核心代码就是一个普通人,如何才能让普通人变的万人敌,这个人的本质改变不了,只能穿额外的装备。额外的装备就是“切面”
- 没有AOP的业务代码,使用分层思想创建一个添加用户的功能:
- service业务服务层
- 作用:业务增强
- 数据加密、事务控制、中文转码、数据解析
- 业务接口和实现类
- UserService接口和UserServiceImpl实现类
- 作用:业务增强
- dao数据操作层
- 作用:和数据库打交道
- dao接口和实现类
- UserDao接口和UserDaoImpl实现类
- models模型层
- 实体类(和数据表对应的java类)
- User类
- service业务服务层
User.java
public class User implements Serializable {
private int id;
private String name;
// 构造和getset省略
}
UserDao.java
public interface UserDao {
void add( User user );
}
UserDaoImpl.java
public class UserServiceImpl implements UserService {
// 依赖dao,要生成get和set
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void add(User user) {
System.out.println("业务层,数据使用MD5和SHA1加密!");
userDao.add(user);
}
}
UserService.java
public interface UserService {
void add(User user);
}
UserServiceImpl.java
public class UserServiceImpl implements UserService {
@Override
public void add(User user) {
System.out.println("业务层,数据使用MD5和SHA1加密!");
UserDao ud = new UserDaoImpl();
ud.add(user);
}
}
Test.java
public class Test {
public static void main(String[] args) {
UserService us = new UserServiceImpl();
User u = new User(1,"张三");
us.add(u );
}
}
执行步骤:
- Test是程序的入口
- service层进行数据加密,自己无法完成数据库的操作,要依赖dao
- dao层进行数据库的操作
配置AOP
- 创建一个增强类(墙)
Before.java
package aop;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
* @BelongsProject: spring-AOP
* @Author: GuoAn.Sun
* @CreateTime: 2020-06-30 10:29
* @Description: 前置增强
*/
public class Before implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("前--------墙----------");
}
}
切入点表达式
具体的add方法
public boolean add(models.User)
返回值和参数随便的add方法
public * add(..)
匹配service.impl层中的所有类的所有方法,参数随便
* service.impl.*.*(..)
servive.impl.A.x(int i)
匹配service.impl层中的子包下的所有类的所有方法,参数随便
* service.impl..*.*(..)
servive.impl.test.A.x(int i)
任何一个名字以add开头的方法,返回值和参数随便
* add*(..)