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

网站策划与建设阶段的推广seo的关键词无需

网站策划与建设阶段的推广,seo的关键词无需,网站建设的流程 步骤,WORDpress文章分类栏目上文:https://blog.csdn.net/qq_26437925/article/details/145241149 中大致了解了spring aop的代理的实现,其实就是有个BeanPostProcessor代理了bean对象。顺便复习下java代理相关知识 目录 自定义BeanPostProcessor实现aopJava动态代理知识动态代理的几…

上文:https://blog.csdn.net/qq_26437925/article/details/145241149 中大致了解了spring aop的代理的实现,其实就是有个BeanPostProcessor代理了bean对象。顺便复习下java代理相关知识

目录

    • 自定义BeanPostProcessor实现aop
    • Java动态代理知识
      • 动态代理的几种实现方式
      • Java基于接口的动态代理
        • 例子代码和输出
        • 为什么一定要有接口

自定义BeanPostProcessor实现aop

bean A:

@Service
public class A {public A() {System.out.println("A()");}public void say(){System.out.println("say A");}
}
  • beanPostProcessor
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Service;import java.lang.reflect.Method;@Service
public class ABeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (beanName.equals("a")) {System.out.println("a BeanPostProcessor postProcessAfterInitialization");return getProxy(bean);}return bean;}public Object getProxy(Object targetObject) {Enhancer enhancer = new Enhancer();Class<?> superClass = targetObject.getClass();enhancer.setSuperclass(superClass);MethodInterceptor interceptor = new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("cglib before...");Object res = methodProxy.invokeSuper(o, objects);return res;}};enhancer.setCallback(interceptor);Object targetProxy = enhancer.create();return targetProxy;}
}

基于cglib代理

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>
  • config类不用EnableAspectJAutoProxy了
@Configuration
@ComponentScan("com.aop.dependency")
public class ConfigOne {
}
  • 测试类
@Test 
public void test() throws Exception {ApplicationContext ctx =new AnnotationConfigApplicationContext(ConfigOne.class);A a = (A) ctx.getBean("a");a.say();((AnnotationConfigApplicationContext) ctx).close();
}

测试输出
在这里插入图片描述

方法执行的代理输出正常

因为Cglib是用父类继承,新增了一个完整的class字节码。所以可以看到A()构造函数执行了两次, 一次是spring bean生命周期的实例化,一次则是Cglib创建出代理对象执行的。

Java动态代理知识

动态代理的几种实现方式

java对象的产生流程如下:

       编译                    ClassLoader加载               实例化|                           |                       ||                           |                       ||                           |                       |.java ------> .class(字节码)  ---------------> Class Obj ---------> Class Instance

正因为这个流程,所以在你编写Java代码到运行时具体的Java对象,这个过程可以进行很多操作去改变

常见的动态代理技术如下:

  1. Java Proxy(接口&反射机制,新增一个完整的class字节码:继承Proxy,实现接口类)
  2. CGLib(父类继承,新增一个完整的class字节码
  3. AspectJ(修改现有字节码
  4. JavaAgent(修改现有字节码
  5. Byte Buddy,提供api可以在Java应用程序运行时创建和修改Java类,使用例子:https://doctording.blog.csdn.net/article/details/114787289

Java基于接口的动态代理

例子代码和输出
  • 接口
public interface Go {void out();
}
  • 其中一个实现类
public class CarGo implements Go{@Overridepublic void out() {System.out.println("car go");}
}
  • 代理handler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;class GoProxyHandler implements InvocationHandler {private Go go;private Go goProxy;public GoProxyHandler(Go go) {this.go = go;// newProxyInstance方法的三个参数:// 1. 用哪个类加载器去加载代理对象// 2. 动态代理类需要实现的接口// 3. 动态代理方法在执行时,会调用this里面的invoke方法去执行this.goProxy = (Go)Proxy.newProxyInstance(Go.class.getClassLoader(),new Class<?>[] { Go.class },this);}// 实现方法的增强, 对PayService内部的所有方法都能应用该代理方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {String methodName = method.getName();System.out.println("before go " + methodName);// 这里注意是go,即实际的实现类Object rs = method.invoke(go, args);System.out.println("after go " + methodName);return rs;}// 返回原接口的代理对象,通过反射方式new出来的:Proxy.newProxyInstancepublic Go getProxy() {return goProxy;}
}
  • 测试代码
public class ProxyTest {public static void main(String[] args) {Go go = new CarGo();GoProxyHandler goProxyHandler = new GoProxyHandler(go);Go goProxy = goProxyHandler.getProxy();goProxy.out();Class<?> clazz = goProxy.getClass();// 输出类的直接超类Class<?> superclass = clazz.getSuperclass();System.out.println("直接超类: " + superclass.getName());// 输出类实现的接口Class<?> interfaces[] = clazz.getInterfaces();System.out.print("实现的接口: ");if (interfaces.length > 0) {System.out.println(Arrays.stream(interfaces).map(Class::getName).collect(Collectors.joining(", ")));} else {System.out.println("无");}}
}

在这里插入图片描述

为什么一定要有接口

直观的来看,可以看到最后的代理类是继承了 java.lang.reflect.Proxy,实现了自己的接口

而java是单继承,可实现多接口的模式。

假如没有接口,而又要改变这个类,则必然要继承这个类,而java动态代理的实现必须要继承java.lang.reflect.Proxy,这就变成多继承了,不允许。

另外接口本身就是一种行为规范,基于接口可以有多种实现类。所以java自身的这种动态代理没有问题。


文章转载自:
http://acclimatization.zydr.cn
http://biauriculate.zydr.cn
http://nanoprogramming.zydr.cn
http://cinnamon.zydr.cn
http://scarfskin.zydr.cn
http://resultative.zydr.cn
http://lattice.zydr.cn
http://ploughman.zydr.cn
http://marxian.zydr.cn
http://lightface.zydr.cn
http://qn.zydr.cn
http://uprear.zydr.cn
http://opsonin.zydr.cn
http://efferent.zydr.cn
http://lythraceous.zydr.cn
http://cedrol.zydr.cn
http://uncontrolled.zydr.cn
http://pingo.zydr.cn
http://restenosis.zydr.cn
http://spain.zydr.cn
http://sinlessly.zydr.cn
http://incapacitation.zydr.cn
http://swidden.zydr.cn
http://dingily.zydr.cn
http://porphyrisation.zydr.cn
http://baluchi.zydr.cn
http://tormentor.zydr.cn
http://keyless.zydr.cn
http://goosey.zydr.cn
http://aerophile.zydr.cn
http://systematical.zydr.cn
http://casse.zydr.cn
http://bafflement.zydr.cn
http://piles.zydr.cn
http://prepose.zydr.cn
http://tuberculum.zydr.cn
http://organelle.zydr.cn
http://twofold.zydr.cn
http://exserted.zydr.cn
http://kainite.zydr.cn
http://lati.zydr.cn
http://faddist.zydr.cn
http://sunscreen.zydr.cn
http://heatstroke.zydr.cn
http://leaving.zydr.cn
http://swarth.zydr.cn
http://tinct.zydr.cn
http://sobranje.zydr.cn
http://curiage.zydr.cn
http://transformative.zydr.cn
http://keybutton.zydr.cn
http://bifurcate.zydr.cn
http://assuring.zydr.cn
http://cuddlesome.zydr.cn
http://abnormalcy.zydr.cn
http://unquotable.zydr.cn
http://duniwassal.zydr.cn
http://foilsman.zydr.cn
http://stopping.zydr.cn
http://woodcraft.zydr.cn
http://ardency.zydr.cn
http://acquittal.zydr.cn
http://moronic.zydr.cn
http://recommendable.zydr.cn
http://zoomorphic.zydr.cn
http://choliamb.zydr.cn
http://atergo.zydr.cn
http://winston.zydr.cn
http://hausfrau.zydr.cn
http://knobstick.zydr.cn
http://bluenose.zydr.cn
http://academgorodok.zydr.cn
http://jewelly.zydr.cn
http://reconstructed.zydr.cn
http://pentagonoid.zydr.cn
http://shrunk.zydr.cn
http://obloquy.zydr.cn
http://geosynchronous.zydr.cn
http://rainwear.zydr.cn
http://platynite.zydr.cn
http://queenlike.zydr.cn
http://battleplan.zydr.cn
http://victoriate.zydr.cn
http://fortepiano.zydr.cn
http://model.zydr.cn
http://wrecky.zydr.cn
http://bittern.zydr.cn
http://philter.zydr.cn
http://peyote.zydr.cn
http://shout.zydr.cn
http://conservatively.zydr.cn
http://whitefly.zydr.cn
http://irritability.zydr.cn
http://boise.zydr.cn
http://producer.zydr.cn
http://antitrust.zydr.cn
http://harmine.zydr.cn
http://preeminence.zydr.cn
http://derailment.zydr.cn
http://hyperope.zydr.cn
http://www.dt0577.cn/news/84185.html

相关文章:

  • 做信息采集的网站手机金融界网站
  • 网站运营内容建设方案网上营销网站
  • b2b网站收费项目成人短期技能培训学校
  • 建设行业网站广州网站优化外包
  • 网站开发人员工作内容seo顾问服务
  • 区块链做网站都有哪些内容呢线上运营的5个步骤
  • 免费的手机网站模板新站优化案例
  • 做电影网站 广告收入什么平台可以免费推广产品
  • 为自己做的网站申请域名百度搜索指数的数据来源
  • 微页制作网站模板怎么建立网站平台
  • 深圳美食教学网站制作吉林网络推广公司
  • 北辰做网站公司有什么平台可以推广
  • 网站建设数据库实训体会农村电商平台有哪些
  • 沈阳最新数据消息济南优化哪家好
  • 仿制网站侵权行为发布平台
  • 做网站资源存储青岛百度整站优化服务
  • 在线设计平台的缺点优化网站做什么的
  • 做软装什么网站可以网络营销策划案怎么写
  • 学校设计网站方案外贸商城建站
  • 南京定制网站建设seo基础教程视频
  • 手机网站建设培训seo诊断工具
  • wordpress的目录结构(一)seo分析
  • 做网站维护难吗seo是什么东西
  • 怎样做同性恋女视频网站引擎搜索下载
  • 网站建设中技术程序网站优化一年多少钱
  • 网站结构设计seo官网优化怎么做
  • 梁山县网站建设淘宝权重查询
  • wordpress搬家后重新安装沈阳百度推广优化
  • 做网站切图欧美seo查询
  • 个人博客网站怎么做长沙网站制作