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

政府网站建设分类深圳网页搜索排名提升

政府网站建设分类,深圳网页搜索排名提升,建站wordpress 基础,徐州网站开发哪个好薇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.tj-hxxt.cn/news/122534.html

相关文章:

  • 单位网站建设典型材料公司官网制作开发
  • 做淘宝网站销售怎么样外贸全网营销推广
  • ae做的动效怎么放在网站上东莞做网站公司
  • 珠海网站开发哪家好上海抖音推广
  • 网站建设数据库代码营业推广策划方案
  • 建站工具免费南平seo
  • 河南网站建设首选公司十大软件培训机构
  • 怎么备案网站空间seo优化推荐
  • 政府网站建设的保障青岛网站建设与设计制作
  • 陕西十二建设有限公司网站东莞百度搜索优化
  • 网站开发图片文字促销方法100种
  • 想采集某类型网站怎么做在百度上怎么发布广告
  • 广告公司推广渠道企业网站seo优化公司
  • 深圳移动网站建设微网站
  • 泉州市住房和城乡建设局官方网站建立网站步骤
  • 做网站的那些事全网热搜关键词排行榜
  • 驻马店网站建设网络广告投放公司
  • 网站解决方案个人怎么在百度上打广告
  • 仙游有人做网站百青藤广告联盟
  • 自己做网站原始代码百度精准搜索
  • 2023西安疫情最新公布江门百度seo公司
  • 腾虎网络广州网站建设百度提交入口地址在哪
  • 力洋深圳做网站公司营销推广手段有什么
  • 西安公司网站如何建立百度竞价优化
  • 济南品牌网站建设定制seo系统优化
  • 兰州最大的装修公司郑州seo排名扣费
  • 前端静态网站开发优搜云seo
  • 做电影网站需要什么条件兰州seo优化入门
  • 昆明企业为什么要做网站百度指数分析大数据
  • python做网站多么济南网络推广网络营销