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

源码搭建网站流程南京网站流量优化

源码搭建网站流程,南京网站流量优化,珠海市网站建设分站怎么样,wordpress cos存储目录 什么是AOP Spring AOP有如下概念 补充#xff1a; AOP是如何实现的 Spring AOP 是通过代理模式实现的。 Spring AOP默认使用标准的JDK动态代理进行AOP代理。 什么是AOP AOP(Aspect-Oriented Programming)#xff0c;即面向切面编程#xff0c;用人话说就是把公共的… 目录 什么是AOP Spring AOP有如下概念 补充 AOP是如何实现的 Spring AOP 是通过代理模式实现的。 Spring AOP默认使用标准的JDK动态代理进行AOP代理。 什么是AOP AOP(Aspect-Oriented Programming)即面向切面编程用人话说就是把公共的逻辑抽出来让开发者可以更专注于业务逻辑开发。 和IOC一样AOP也指的是一种思想。AOP思想是OOPObject-Oriented Programming的补充。OOP是面向类和对象的但是AOP则是面向不同切面的。一个切面可以横跨多个类和对象去操作极大的丰富了开发者的使用方式提高了开发效率。 譬如一个订单的创建可能需要以下步骤 权限校验事务管理创建订单日志打印 如果使用AOP思想我们就可以把这四步当成四个“切面”让业务人员专注开发第三个切面业务其他三个切面则是基础的通用逻辑统一交给AOP封装和管理。 Spring AOP有如下概念 对于通知类型来说 补充 AOP是如何实现的 从Bean的初始化流程中来讲Spring的AOP会在bean实例的实例化已完成进行初始化后置处理时创建代理对象即下面代码中的applyBeanPostProcessorsAfterInitialization部分。 protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {//...//检查AwareinvokeAwareMethods(beanName, bean);//调用BeanPostProcessor的前置处理方法Object wrappedBean bean;if (mbd null || !mbd.isSynthetic()) {wrappedBean applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}//调用InitializingBean的afterPropertiesSet方法或自定义的初始化方法及自定义init-method方法try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd ! null ? mbd.getResourceDescription() : null),beanName, Invocation of init method failed, ex);}//调用BeanPostProcessor的后置处理方法if (mbd null || !mbd.isSynthetic()) {wrappedBean applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean; } applyBeanPostProcessorsAfterInitialization中会遍历所有BeanPostProcessor然后 调用其postProcessAfterInitialization方法而AOP代理对象的创建就是AbstractAutoProxyCreator这个类的postProcessAfterInitialization方法中 Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean ! null) {Object cacheKey getCacheKey(bean.getClass(), beanName);if (this.earlyProxyReferences.remove(cacheKey) ! bean) {return wrapIfNecessary(bean, beanName, cacheKey);}}return bean; }这里面最重要的就是wrapIfNecessary方法了 /*** 如果需要对bean进行包装。** param bean 要包装的目标对象* param beanName bean的名称* param cacheKey 缓存键* return 包装后的对象可能是原始对象或代理对象*/ protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {// 如果beanName不为null且在目标源bean集合中则直接返回原始对象if (beanName ! null this.targetSourcedBeans.contains(beanName)) {return bean;}// 如果缓存键对应的值为Boolean.FALSE则直接返回原始对象if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {return bean;}// 如果bean的类型为基础设施类或者应跳过该类型的代理则将缓存键对应的值设置为Boolean.FALSE并返回原始对象if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {this.advisedBeans.put(cacheKey, Boolean.FALSE);return bean;}// 如果存在advice为bean创建代理对象Object[] specificInterceptors getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);if (specificInterceptors ! DO_NOT_PROXY) {// 将缓存键对应的值设置为Boolean.TRUEthis.advisedBeans.put(cacheKey, Boolean.TRUE);// 创建代理对象Object proxy createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));// 将代理对象的类型与缓存键关联起来this.proxyTypes.put(cacheKey, proxy.getClass());return proxy;}// 如果没有advice将缓存键对应的值设置为Boolean.FALSE并返回原始对象this.advisedBeans.put(cacheKey, Boolean.FALSE);return bean; }createProxy的主要作用是根据给定的bean类、bean名称、特定拦截器和目标源创建代理对象 /*** 根据给定的bean类、bean名称、特定拦截器和目标源创建代理对象。** param beanClass 要代理的目标对象的类* param beanName bean的名称* param specificInterceptors 特定的拦截器数组* param targetSource 目标源* return 创建的代理对象*/ protected Object createProxy(Class? beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) {// 如果beanFactory是ConfigurableListableBeanFactory的实例将目标类暴露给它if (this.beanFactory instanceof ConfigurableListableBeanFactory) {AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass);}// 创建ProxyFactory实例并从当前代理创建器复制配置ProxyFactory proxyFactory new ProxyFactory();proxyFactory.copyFrom(this);// 如果不强制使用CGLIB代理目标类根据条件决定是否使用CGLIB代理if (!proxyFactory.isProxyTargetClass()) {if (shouldProxyTargetClass(beanClass, beanName)) {proxyFactory.setProxyTargetClass(true);} else {// 根据bean类评估代理接口evaluateProxyInterfaces(beanClass, proxyFactory);}}// 构建advisor数组Advisor[] advisors buildAdvisors(beanName, specificInterceptors);// 将advisors添加到ProxyFactory中proxyFactory.addAdvisors(advisors);// 设置目标源proxyFactory.setTargetSource(targetSource);// 定制ProxyFactorycustomizeProxyFactory(proxyFactory);// 设置代理是否冻结proxyFactory.setFrozen(this.freezeProxy);// 如果advisors已经预过滤则设置ProxyFactory为预过滤状态if (advisorsPreFiltered()) {proxyFactory.setPreFiltered(true);}// 获取代理对象并使用指定的类加载器return proxyFactory.getProxy(getProxyClassLoader()); }Spring AOP 是通过代理模式实现的。 具体有两种实现方式一种是基于Java原生的动态代理一种是基于cglib的动态代理。对应到代码中就是这里面的Proxy有两种实现分别是CglibAopProxy和JdkDynamicAopProxy。 Spring AOP默认使用标准的JDK动态代理进行AOP代理。 这使得任何接口可以被代理。但是JDK动态代理有一个缺点就是它不能代理没有接口的类。 所以Spring AOP就使用CGLIB代理没有接口的类。
http://www.pierceye.com/news/860864/

相关文章:

  • 系网站建设工作总结大庆建设网站表格下载
  • 免费建站网站seo长春专业网站制作
  • 做网站公司哪家正规公司网站如何更改内容
  • 广州黄埔区建设局网站局wordpress怎么看访问量
  • 佛山找人做网站国家建设免费论文网站
  • 网站内容建设ppt网站建设header
  • 图书馆网站建设费用青海省住房建设厅网站
  • 重庆网站供奉战犯wordpress 关键字链接
  • 给个2021站你们懂得不花钱的深圳手机网站建设
  • 织梦图片自适应网站源码php企业网站源码推荐
  • 网站建网站建设网页微信头像logo在线制作
  • 微网站模板怎么做买了域名如何做网站
  • 新华美玉官方网站在线做维护一个网站要多少钱
  • 网站内容由什么组成部分网页网站设计价格
  • wordpress方框里面打勾两个域名同一个网站做优化
  • 个人怎么做公司网站闲置电脑做网站服务器
  • 有没有什么 网站能够做试卷wordpress写 a href
  • 西安 北郊网站建设网站上传图片加水印
  • 沈阳网站制作哪家好包头爱出行app最新版本
  • 怎么用IP做网站地址网站如何投放广告
  • 试述电子商务网站的建设流程太原建站的模板
  • 微信群投票网站怎么做的企业门户网站怎么做
  • 建网站平台 优帮云嘉兴营销型网站
  • 建筑类专业做教育的网站ui设计app
  • 郑州做营销型网站的公司什么叫社交电商平台
  • 外国做问卷可以赚钱的网站做中国菜的外国网站
  • 青岛市建设厅网站快递网站建设
  • 昆明网站WordPress文章怎么折叠
  • 拖拽建站系统源码企业主题展厅设计公司
  • asp.net网站的数据库配置张家港网站 设计制作