Spring学习二
-
概念
-
面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率
-
通俗描述:不通过修改源代码方式,在主干功能里面添加新功能
-
-
AOP底层使用动态代理
-
有两种情况动态代理
-
第一种:有接口情况,使用JDK动态代理
-
-
public class SpringTest {
public static void main(String[] args) {
Class[] interfaces = {UserDao.class};
UserDao userDao = new UserDaoImpl();
UserDao userDao1 = (UserDao)Proxy.newProxyInstance(SpringConfig.class.getClassLoader(), interfaces, new UserProxy(userDao));
userDao1.say();
}
}
class UserProxy implements InvocationHandler{
private Object obj;
public UserProxy(Object o){
this.obj = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法执行之前>>>>>");
method.invoke(obj);
System.out.println("方法执行之后");
return UserDao.class;
}
}
-
-
第二种:没有接口情况,使用CGLIB动态代理
-
创建子类的代理对象,增强类的方法
-
-
-
//AOP 术语解释
public class User {
//增
public int add(){ return 0; };
//删
public int del(){ return 0; };
//改
public int update(){ return 0; };
//查
public int select(){ return 0; };
/**
* 在一个类中 哪些方法可以被增强 那这些方法就叫连接点
* add、del、update、select方法都可以做连接点
*/
/**
* 实际被真正增加的方法 叫做切入点
*/
/**
* 实际增强的逻辑部分称为通知(增强)
* 前置通知
* 后置通知
* 环绕通知
* 异常通知
* 最终通知
*/
/**
* 把通知应用到切入点的过程 叫做 切面
*/
} -
切入点表达式
-
execution([权限修饰符][返回类型][类全路径][方法名称][参数列表])
列如:execution(* com.dao.User.add(..)) 对add方法增强
列如:execution(* com.dao.User.*(..)) 对User类里面所有方法进行增强
-
-
springmvc的配置文件中加入AOP的配置,即扫描AOP的包以及让AOP生效
-
<!-- AOP 注解方式 ;定义Aspect -->
<!-- 激活组件扫描功能,在包"com.example.aop及其子包下面自动扫描通过注解配置的组件-->
<context:component-scan base-package="com.example.aop"/>
<!-- 启动AspectJ支持 只对扫描过的bean有效-->
<aop:aspectj-autoproxy proxy-target-class="true" /> -
AOP逻辑处理类
package com.example.aop;
import java.util.Arrays;
import java.util.List;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
-