案例:百度网盘密码数据兼容处理

1. 需求和分析

例如下面的百度网盘分享链接

链接:https://pan.baidu.com/s/1xUQ1Zg3GqKLZXrME9y81cw?pwd=1fi8
提取码:1fi8
--来自百度网盘超级会员V6的分享

有同学肯定会说,害,直接在函数里对字符串处理呗,但是随着业务的增多,不止获取网盘资源要去除这个空格,当还有其他业务要进行这样的操作的时候,我们还得再写一遍代码非常的麻烦,所以,用AOP就能很好的完成这个需求

通知中实现的步骤:

  1. 在业务方法执行之前对所有的输入参数进行格式处理——trim()
  2. 使用处理后的参数调用原始方法——环绕通知中存在对原始方法的调用

涉及数据操作,一般用环绕

2. 代码实现

模拟环境准备

//-------------service层代码-----------------------
public interface ResourcesService {
    public boolean openURL(String url ,String password);
}
@Service
public class ResourcesServiceImpl implements ResourcesService {
    @Autowired
    private ResourcesDao resourcesDao;

    public boolean openURL(String url, String password) {
        return resourcesDao.readResources(url,password);
    }
}


//-------------dao层代码-----------------------
public interface ResourcesDao {
    boolean readResources(String url, String password);
}
@Repository
public class ResourcesDaoImpl implements ResourcesDao {
    public boolean readResources(String url, String password) {
        System.out.println(password.length());
        //模拟校验
        return password.equals("root");
    }
}

编写通知类

@Component
@Aspect
public class DataAdvice {

    @Pointcut("execution(boolean com.yyl.service.*Service.*(*,*))")
    private void servicePt(){}

    @Around("DataAdvice.servicePt()")
    public Object trimStr(ProceedingJoinPoint pjp) throws Throwable {
        Object[] args = pjp.getArgs();
        for (int i = 0; i < args.length; i++) {
            //判断参数是不是字符串
            if(args[i].getClass().equals(String.class)){
                args[i] = args[i].toString().trim();
            }
        }
        Object ret = pjp.proceed(args);
        return ret;
    }
}

在SpringConfig配置类上开启AOP注解功能

@Configuration
@ComponentScan("com.yyl")
@EnableAspectJAutoProxy
public class SpringConfig {
}

运行测试类,查看结果

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        ResourcesService resourcesService = ctx.getBean(ResourcesService.class);
        boolean flag = resourcesService.openURL("http://pan.baidu.com/dongqilai", "root ");
        System.out.println(flag);
    }
}

运行结果如下:
Spring AOP实战:百度网盘密码数据兼容处理-LMLPHP
说明处理成功了
Spring AOP实战:百度网盘密码数据兼容处理-LMLPHP

07-24 17:31