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

网站策划与建设阶段的推广百度网址是多少 百度知道

网站策划与建设阶段的推广,百度网址是多少 百度知道,郑州seo费用,如何上国外购物网站上文: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://www.yidumall.com/news/98945.html

相关文章:

  • 百度公司网站怎么建设目前最好的营销模式
  • 医疗网站怎么做seo网络销售都是诈骗公司吗
  • 域名和主机有了怎么做网站站长工具seo优化
  • 免费做网站怎么做网站吗2百度百科怎么创建自己
  • 河源哪有做网站如何优化搜索引擎的搜索功能
  • wordpress整合百度站内搜索我要软文网
  • 安徽网站建设怎么样seo关键词软件
  • 政府网站建设的执行标准编号百度指数数据分析报告
  • 天津百度优化公司站长工具seo综合查询推广
  • app软件做得比较好的公司排名长沙seo优化公司
  • 太平洋手机网seo sem是什么职位
  • 北京机建网站成都网络推广运营公司
  • wordpress企业仿站视频教程百度销售系统登录
  • 山东食品行业网站开发想做电商怎么入手
  • 网站空间的参数通州优化公司
  • 建设银行网网站在线智能识图
  • 网站alexa流量查询关键词免费网站
  • 建设银行网上银行网站网站注册地址查询
  • 小程序前后端开发电脑系统优化软件
  • 微山做网站临沂seo
  • 商城网站建设浩森宇特如何添加百度指数
  • 如何让网站做成移动版大地seo
  • 威客做的好的网站视频号广告推广
  • 做兼职哪个网站好网络营销的推广方法有哪些
  • phpadmin wordpressseo关键词排名优化方法
  • wordpress 把账号名改成昵称外贸网站建设优化推广
  • 设计与制作网站b站网页入口
  • 现在网站如何做优化网站关键词优化推广哪家好
  • 网站版面设计方案十大seo免费软件
  • 前端如何兼职做网站如何做网销