AOP介绍及实现

AOP

  • AOP:面向切面(方面)编程
  • 比如说核心代码在不可更改的情况下,如何让核心代码的功能变强?
  • 使用AOP编程,AOP思想的核心就是代理,核心代码就是一个普通人,如何才能让普通人变的万人敌,这个人的本质改变不了,只能穿额外的装备。额外的装备就是“切面”
  • 没有AOP的业务代码,使用分层思想创建一个添加用户的功能:
    • service业务服务层
      • 作用:业务增强
        • 数据加密、事务控制、中文转码、数据解析
      • 业务接口和实现类
      • UserService接口和UserServiceImpl实现类
    • dao数据操作层
      • 作用:和数据库打交道
      • dao接口和实现类
      • UserDao接口和UserDaoImpl实现类
    • models模型层
      • 实体类(和数据表对应的java类)
      • User类

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 );
    }
}

执行步骤:

  1. Test是程序的入口
  2. service层进行数据加密,自己无法完成数据库的操作,要依赖dao
  3. 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*(..)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值