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

重庆做seo网站优化选择哪家南宁网站建设活动

重庆做seo网站优化选择哪家,南宁网站建设活动,wordpress和hugo,建立一个属于自己的网站1. AOP的实现方式 使用AspectJ的编译器来改动class类文件实现增强(使用不广泛) ----- 编译阶段 这种对class类文件增强的, 也可以增强static静态方法, 而通过代理方式就无法实现静态方法的增强 可通过查看编译后class文件反编译后的java代码验证 agent增强(使用不广泛) ----- 类…

1. AOP的实现方式

  1. 使用AspectJ的编译器来改动class类文件实现增强(使用不广泛) ----- 编译阶段

    这种对class类文件增强的, 也可以增强static静态方法, 而通过代理方式就无法实现静态方法的增强

    可通过查看编译后class文件反编译后的java代码验证

  2. agent增强(使用不广泛) ----- 类加载阶段

这种方式的增强也会使得代理类在内部自己调用自己的方法也获得增强, 原因是这种方式是通过类加载阶段进行的增强, 在通过this.xxFunc()调用自己本类的方法也是触发代理类的方法。

可通过arthas等工具查看jvm内存中增强后的类的反编译后的java代码验证

  1. Proxy代理方式实现AOP(绝大多数的选择)
  • JDK 代理 (只能代理实现了接口的类, 而且也只能代理那些接口方法, 代理类与目标类同级关系)
  • CGLIB 代理 (能代理类和接口, 但该类或代理的方法不能使用final修饰, 因为是基于继承进行增强的, 代理类与目标类是父 / 子 关系)

代理创建的两个时机:

  1. 初始化之后
  2. 实例创建之后, 依赖注入之前(有循环依赖时), 并暂存于二级缓存 earlySingletonObjects

JDK实现的代理:

public class JdkProxyDemo {interface Foo{void foo();}// 将被用作jdk代理的实例类static class Target implements Foo{@Overridepublic void foo() {System.out.println("target foo");}// 这个方法无法被代理,因为不是来自接口的方法public void test(){System.out.println("test");}}// jdk代理 只能针对接口代理// cglib代理public static void main(String[] args) {// 目标对象Target target = new Target();ClassLoader classLoader = JdkProxyDemo.class.getClassLoader();//用来加载在运行期间动态生成的字节码Foo proxyInstance = (Foo) Proxy.newProxyInstance(classLoader, new Class[]{Foo.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("before...");// 目标.方法(参数)// method.invoke(proxy, args); 错误写法, 这里的proxy代表代理类自身, 传入proxy会陷入无限循环Object result = method.invoke(target, args);System.out.println("after...");return result;}});proxyInstance.foo();}
}

Cglib实现的代理:

注意: 在MethodInterceptor实现的intercept()方法中,传入了一个参数methodProxy, 通过该对象调用methodProxy.invoke(target, args)也能执行目标对象, 但其内部不是通过反射的方式。

public class CglibProxyDemo {static class Target{public void foo(){System.out.println("target foo");}}public static void main(String[] args){Target target = new Target();Target proxyInstance = (Target) Enhancer.create(Target.class, new MethodInterceptor() {@Overridepublic Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("before...");Object result = method.invoke(target, args); //Spring使用的方式//Object result = methodProxy.invoke(target, args); 非反射方式调用, 而且可以不用目标就调用System.out.println("after...");return result;}});proxyInstance.foo();}
}

2.Spring中的两种切面

@Aspect: 高级切面, 可以包含多组通知和切面

Advisor: 低级切面, 适合框架内部使用, 只有一个通知和一个切面

Spring在处理这两个切面时, @Aspect切面最终还是转为Advisor

两种方式使用示例:

public class AspectDemo {public static void main(String[] args) {GenericApplicationContext context = new GenericApplicationContext();context.registerBean("aspect1", Aspect1.class);context.registerBean("config", Config.class);context.registerBean(ConfigurationClassPostProcessor.class);context.refresh();for (String beanDefinitionName : context.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}}static class Target1{public void foo(){System.out.println("target1 foo");}}static class Target2{public void bar(){System.out.println("target bar");}}//高级切面,Aspect@Aspectstatic class Aspect1{@Before("execution(* foo())")public void before(){System.out.println("aspect1 before...");}@After("execution(* foo())")public void after(){System.out.println("aspect1 after...");}}//低级切面, 由一个切点(AspectJExpressionPointcut)和一个通知(MethodInterceptor)组成@Configurationstatic class Config{@Beanpublic Advisor advisor3(MethodInterceptor advice3){AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();pointcut.setExpression("execution(* foo())");return new DefaultPointcutAdvisor(pointcut , advice3);}@Beanpublic MethodInterceptor advice3(){return new MethodInterceptor() {@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {System.out.println("advice3 before...");Object result = methodInvocation.proceed();System.out.println("advice3 after...");return result;}};}}
}
http://www.yayakq.cn/news/622417/

相关文章:

  • 网站备案授权书范本wordpress的安装目录结构
  • 宠物用品网站开发背景手机网站建设公司排名
  • 在excel表里做网站模板wordpress上传主题错误
  • 微信网站有什么作用温岭app开发公司
  • 网业制作与网站建设企业首次建设网站的策划流程
  • 一个外国人做的破解游戏网站dell网站的设计特色
  • 一级a做爰片免费网站 视频怎么给网站添加关键字
  • 网站死链接怎么提交wordpress wiki使用
  • 权威的企业网站建设网站建设 沈阳
  • 公司门户网站源码建设厅网站怎么打印不出来
  • 网站制作创业本人有大批量手工活寻加工户
  • ui设计方向网站建设目标wordpress 修改页面链接地址
  • 国外手做网站施工企业税款缴纳
  • seo 新旧网站 两个域名做网站签到挣钱吗
  • 潍坊网站建设尚荣做公司网站源代码怎么写
  • 有哪些做网游单机版的网站wordpress 最新文章列表
  • 网站绝对路径301vps云服务器
  • 网站后台密码存在哪搜索网站排行榜
  • 网站上的广告位图片怎么做呢莱芜网站优化公司
  • 湖南厦门网站优化php网站后台怎么进
  • seo大神做的网站公司名称变更
  • wordpress腾讯云插件下载失败seo方案书案例
  • 山东聊城网站建设七牛云上市
  • 相亲网站建设策划方案免费自助开通网站
  • 高权重网站发外链广东企业微信网站建设
  • 网站开发后台能用c语言吗帮老板做网站
  • 怎样用flash做游戏下载网站城乡建设门户网站
  • 企业网站建设背景网站如何做微信支付宝支付宝
  • 网站静态化对seowordpress怎么修改关键词
  • 网站开发中 即将上线界面设计的软件