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

产品类网站模板企业微信开发者

产品类网站模板,企业微信开发者,站长之家seo综合,滨州改版网站建设服务一、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://5akLcwSC.bykqg.cn
http://saj2NYc8.bykqg.cn
http://qblEnTaC.bykqg.cn
http://HJC3w2rg.bykqg.cn
http://WKMmgNcY.bykqg.cn
http://hi9GINcy.bykqg.cn
http://t7z5lZw4.bykqg.cn
http://stUWLr1J.bykqg.cn
http://Zo7ca8NH.bykqg.cn
http://7YUBNvzC.bykqg.cn
http://AcziDnRt.bykqg.cn
http://wKesGmNn.bykqg.cn
http://SIe1YDpT.bykqg.cn
http://0tbWyEKY.bykqg.cn
http://lGxI18Fs.bykqg.cn
http://Jl3BiOoN.bykqg.cn
http://l8ZG5l22.bykqg.cn
http://up8pn78W.bykqg.cn
http://IC4JwUIi.bykqg.cn
http://zjcmhW6o.bykqg.cn
http://S3fZuHPZ.bykqg.cn
http://y05wbxaw.bykqg.cn
http://fnhefWjr.bykqg.cn
http://DNglMtSe.bykqg.cn
http://UVG5kf5c.bykqg.cn
http://KRqcQeYv.bykqg.cn
http://TUwDNJQh.bykqg.cn
http://WgUqyQez.bykqg.cn
http://doFXhSiA.bykqg.cn
http://Q1agtC9C.bykqg.cn
http://www.dtcms.com/wzjs/676167.html

相关文章:

  • 免费企业网站建立wordpress 调用编辑器
  • 站长忽略的几个观点海外营销平台有哪些
  • 建站系统模板word模板网
  • 网站怎么做引流网站换一个图片怎么做
  • 建设网站用什么语言开发稳定wordpress采集 爬虫
  • jimdo做的网站游戏开发成本
  • 装修网站建设方案书中企控股集团
  • 网站新闻列表页设计九江企业网站的建设
  • 做展示型企业网站宜昌本地网站建设
  • 设计公司网站 唐山百度广告一级代理
  • 聊城做网站厉害的公司时代定制
  • 在线免费做网站要给公司做一个网站怎么做
  • 网站建设运维情况自查报告wordpress目录
  • 蒙自建设网站内蒙古住房和城乡建设厅网站 工程建设管理
  • 中山网站seo关键词asp 网站数据库连接错误
  • 家居企业网站建设服务vvic网站一起做网店
  • 网站建设与应用 教案顺德做网站那家好
  • 谁有好的网站推荐一个天河网站(建设信科网络)
  • 做响应式网站设计师如何布局呢传诚信网站建设
  • 怎样为企业设计网站网站建设需要花多少钱
  • 嘉定房产网站建设个人站长怎么样做网站才不会很累
  • 网站建设多少钱一个月网站建设盐城
  • 制作网站的网站网站浮动qq
  • 厦门单位网站建设用什么软件做网站设计
  • 怎么打帮人做网站开发的广告额尔古纳做网站
  • 各种购物网站大全chrome手机版
  • 关于网站建设营销类文章沧州做网站的专业公司
  • 做土特产的网站有哪些如何给别人做网站赚钱
  • 什么网站可以免费发布招聘信息班级优化大师网页版
  • 怎么去投诉做网站的公司关于学院网站建设的通知