谈到Spring,必然是它的核心两大功能,IOC和AOP.
AOP:面向切面,其原理就是通过动态代理,代理类做一系列的切面处理。
动态代理有两种方式,JDK原生的和CG。(boot2之后用的就是CG)
这里注意,JDK原生的的本质是其通过接口的方式生成的代理类,而CG是通过子类继承父类的方式生成的代理类,如果是final不可继承的肯定是生成不了代理类。
AOP的运用场景:很多小白还不了解在什么时候用过AOP。
首先,事务的运用就是AOP,翻开Dao层的注解是不是有个@Transactional,你把@Transactional这个类加上final,你看事务还能生效不。
其次就是权限这块,举一个简单的例子。一个用户名和密码进来,看看他有没有权限做这件事
思想:自定义一个注解,controller所有被这个注解标注过的方法都进行权限处理。
①:自定义一个注解:(也可以不用自定义注解,在切面类里直接切要权限认证的方法)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface AnthCheck {
}
②:controller啥也不用写
@RestController
public class PersonControllerImpl implements PersonController {
@AnthCheck
@Override
public String checkUp(UserEntity userEntity) {
return null;
}
}
③:编写切面类:
@Aspect
@Component
public class aaaAOP {
//拦截所有被注解AuthCheck标注的方法
@Pointcut("@annotation(com.syan.cloudbiz2.aop.AnthCheck)")
private void pointAll(){}
@Before(value="pointAll()&&args(userEntity)")
public void beforemethed(JoinPoint joinPoint,UserEntity userEntity){
/*这部分写具体查数据库或者查缓存,看是否有权限*/
}
}
这里只是演示一下可能运用的场景,实际开发过程当中,肯定有许多逻辑可以写。