当前位置: 首页 > wzjs >正文

简约 网站株洲头条新闻

简约 网站,株洲头条新闻,找网站漏洞赚钱怎么做的,清远 网站建设一、Spring AOP与代理模式 ** 1.动态代理是Spring AOP的核心** AOP的本质是在不修改原始代码的前提下,为目标对象添加额外功能(如日志、事务、权限校验等),而动态代理正是实现这一目标的关键技术。它能在运行时动态生成代理对象,拦截对目标对象的方法调用,并在调用前后…

一、Spring AOP与代理模式

** 1.动态代理是Spring AOP的核心**

AOP的本质是在不修改原始代码的前提下,为目标对象添加额外功能(如日志、事务、权限校验等),而动态代理正是实现这一目标的关键技术。它能在运行时动态生成代理对象,拦截对目标对象的方法调用,并在调用前后插入自定义逻辑。

2.Spring AOP支持的动态代理方式

Spring根据目标对象的类型,会自动选择不同的代理实现:

  1. JDK动态代理

    • 原理:基于Java原生的java.lang.reflect.Proxy类,要求目标对象必须实现接口。
    • 示例:若目标类UserService实现了接口UserServiceInterface,则代理对象会实现相同接口,并通过InvocationHandler拦截方法调用。
    • 限制:无法代理没有接口的类。
  2. CGLIB代理

    • 原理:通过字节码生成库CGLIB,生成目标类的子类作为代理对象(基于继承)。
    • 示例:若目标类UserService没有实现接口,Spring会使用CGLIB生成UserService的子类,重写方法以实现拦截。
    • 优势:无需接口即可代理,适用于普通类。
  3. ByteBuddy(Spring 5+新增)

    • 原理:性能比CGLIB更优的字节码生成库,通过生成子类或动态修改类字节码实现代理。
    • 应用场景:当需要更高性能的代理时,Spring会自动选择ByteBuddy(需引入相关依赖)。
3.Spring AOP代理的选择机制

Spring通过ProxyFactory决定使用哪种代理方式:

  • 若目标对象实现了接口,优先使用JDK动态代理
  • 若目标对象是普通类(无接口),则使用CGLIB或ByteBuddy代理
  • 可通过配置proxy-target-class=true强制使用CGLIB/ByteBuddy代理(即使有接口)。

二、示例:JDK动态代理

1.JDK动态代理的流程如下:
  1. 定义切面(Aspect)
    通过@Aspect注解声明切面类,使用@Before@After等注解定义通知(Advice)。

  2. 创建代理对象
    Spring容器在初始化时,若检测到bean需要被AOP增强,会通过BeanPostProcessor(如AnnotationAwareAspectJAutoProxyCreator)生成代理对象。

  3. 方法拦截与通知执行

    • 当调用代理对象的方法时,JDK动态代理会将调用转发给InvocationHandler.invoke()方法。
    • invoke()中,Spring会根据切点(Pointcut)判断是否需要执行切面逻辑,按顺序调用前置、后置、环绕等通知。
  4. 返回结果或处理异常
    通知执行完毕后,将结果返回给调用方,或处理可能的异常。

2.代码示例
// 1. 定义接口
public interface UserService {void saveUser(String name);
}// 2. 实现类
@Service
public class UserServiceImpl implements UserService {@Transactional // 事务增强public void saveUser(String name) {// 数据库操作}
}// 3. 配置类(默认配置,无需显式指定proxyTargetClass=false)
@Configuration
@EnableTransactionManagement
public class AppConfig {// 配置...
}
// 4.Controller
@Controller
@Slf4j
public class UserController {@Autowiredprivate UserService userService;@PostConstructpublic void init() {// 1. 直接打印类名log.info("代理类型: " + userService.getClass().getName());// 2. 使用AopUtils判断log.info("是否为JDK代理: " + AopUtils.isJdkDynamicProxy(userService));log.info("是否为CGLIB代理: " + AopUtils.isCglibProxy(userService));// 3. 获取目标类(非代理类)Class<?> targetClass = AopProxyUtils.ultimateTargetClass(userService);log.info("目标类: " + targetClass

文章转载自:

http://kl78bhmu.LtfnL.cn
http://mLoCrgVw.LtfnL.cn
http://a2T9aEVM.LtfnL.cn
http://Wn5oByfD.LtfnL.cn
http://kK3gdQvh.LtfnL.cn
http://VI6fyUQm.LtfnL.cn
http://65siEgHF.LtfnL.cn
http://I1sqYFeP.LtfnL.cn
http://DEMWUfey.LtfnL.cn
http://dgHwkra1.LtfnL.cn
http://eRg1IZ2m.LtfnL.cn
http://kHtAZG6V.LtfnL.cn
http://RS7NKz2E.LtfnL.cn
http://tbMPKi6X.LtfnL.cn
http://bhQJGfCv.LtfnL.cn
http://5jHZfM6s.LtfnL.cn
http://suPemQPO.LtfnL.cn
http://2d233WKO.LtfnL.cn
http://DtM69yHo.LtfnL.cn
http://3xHINrtW.LtfnL.cn
http://R1bcztFD.LtfnL.cn
http://Aenz6B6W.LtfnL.cn
http://RpxU9EdJ.LtfnL.cn
http://7tE8FvYP.LtfnL.cn
http://B9spStK5.LtfnL.cn
http://y1AL7Neg.LtfnL.cn
http://5c8I9WMO.LtfnL.cn
http://0JLhG6Wx.LtfnL.cn
http://ri7w7GSb.LtfnL.cn
http://hZEdROd8.LtfnL.cn
http://www.dtcms.com/wzjs/628201.html

相关文章:

  • 成都建立网站的公司网站服装图案素材网站
  • 网站建设以及网页设计需要会什么中国建筑英才网
  • 陕西网站建设中英文网站是咋做的
  • 青岛建设局网站爱站网是干嘛的
  • 土地流转网站建设项目国家企业信息网官网查询营业执照
  • 企业网站建设的原则全国物流网站有哪些平台
  • 代运营网站app推广营销公司
  • 自己网站做虚拟币违法吗昆山建设招投标网站
  • 福建住房和城乡建设网站廊坊视频优化排名
  • 淘客网站怎么做代理魔方优化大师官网下载
  • 织梦做淘宝客网站重庆网站建设mswzjs
  • 重庆自助建站系统哪家好绵阳市建设工程质量监督站网站
  • 个人网站建设论文自适应企业网站源码
  • 营销型网站建设网站建设制作单页网站 营销
  • 淘宝做图片的网站自媒体创业计划书word
  • 企业网站要求个人网站作品欣赏
  • 旅游电子商务网站开发制作品牌设计案例
  • 有哪些育儿类网站做的比较好用asp做的一个网站实例源代码
  • 国外网站会让国内人做吗定制旅游网站建设成都
  • 平和网站建设php网站开发工程师面试
  • 2019做哪个网站赚钱南京哪个网站做物业贷
  • 黑群晖做php网站广告设计公司招聘
  • 个人电子邮箱怎么注册网站速度优化方案
  • ios网站开发深圳网站制作费用
  • 网站建设名字专业网站设计网站
  • 怎样才能有自己的网站国企网站开发
  • 国展做网站的公司丹阳翼网首页
  • 做网贷网站多少钱重庆公司有哪些
  • 长垣有做网站设计的吗最近发生的新闻事件
  • 免费企业网络推广网站佛山新网站建设