springboot 2.x 开始已经默认的代理模式已经更改为 cglib代理;
还有一种是jdk代理,这个要求必须实现接口才可以使用的一种代理模式;
1 为什么使用代理?
可以简化暴露的facade,从而更容易被调用程序使用,通过动态代理,可以对目标类加入通知或者[拦截器]从而可以提供切面功能,或者提供灵活的可配置的参数;
一句话 为了增强原有对象;
2 spring中的动态代理模式选择
如果目标对象实现了接口,则默认采用JDK动态代理
如果目标对象没有实现接口,则采用[Cglib]进行动态代理
如果目标对象实现了接口,且强制Cglib,则使用cglib代理
一句话 jdk 只能代理实现了接口的类
cglib代理 既可以代理 实现了接口的类 也可以代理 没有实现接口的类
3 今天遇到一个问题 springboot集成了shiro后,会导致aop失效!!!
问题分析:
shiro 的默认代理是jdk, 基于接口的,因为要实现那个 usersheaml 那个接口
aop默认的 的就是cglib 所以二者冲突
那么这里面就会有两次代理,导致相应bean出现问题;
一般是由于在引入shiro的时候, 在shiro的配置类中加入了 DefaultAdvisorAutoProxyCreator 导致Spring AOP失效,所有@Service @Component的类都不是动态代理对象
解决办法就是由于已经是在spring中集成,所以我无需配置aop代理;
其次可以再配置文件中强制使用cglib代理:
.properties写法
spring.aop.proxy-target-class=true
还有 LifecycleBeanPostProcessor 其实也是如此,所以shior的配置类中 就不要加入这些乱七八糟的东西了!!!