精华内容
下载资源
问答
  • 那就是Spring的AOP,这才是咱们最终想出来的重点! 有了Spring的AOP后,就不用自己去写了,只需要在配置文件里进行配置,配置好后Spring按照你的配置去帮你生成代理对象,按照你的配置把增强的内容和目标方法结合...

    视频功能审核通过了,可以看视频啦!记得点关注啊~

    注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了

    记得点关注啊,视频里的wx二维码失效了,wx搜索:“聊5毛钱的java 或 扫码关注公众号,欢迎一起学习交流

    快扫码关注啦!关注可领取博主的Java学习视频+资料,保证都是干货

    SpringAOP系列,帮你了解SpringAOP的来龙去脉

    上篇介绍了一下静态代理:Java中的代理模式——静态代理以及分析静态代理的缺点

    静态代理是程序运行前,代理类的.class文件已经存在了。

    动态代理是,在程序运行时运用反射机制动态创建而成,无需手动编写代码

    也分析了一下静态代理的缺点:

    1、由于静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类

    2、如果一个Service中有很多方法需要事务(增强动作),发现代理对象的方法中还是有很多重复的代码

    3、由第一点和第二点可以得出:静态代理的重用性不强

    那怎么解决呢?

    用动态代理就可以很好的解决上述问题,本篇介绍一下:Java中的动态代理

    动态代理实现的目的和静态代理一样,都是对目标方法进行增强,而且让增强的动作和目标动作分开,达到解耦的目的

    动态代理分为JDK的动态代理和cglib动态代理

    它俩有略微的差别:JDK动态代理产生的代理类和目标类实现了相同的接口;cglib动态代理产生的代理类是目标对象的子类

    下面分别介绍JDK的动态代理(是JDK的代码实现的)和cglib动态代理(是cglib的jar包实现的)

    1、JDK的动态代理

    package com.cj.study.proxyjdk;
    
    public interface PersonService {
    	
    	public String savePerson();
    	
    	public void updatePerson();
    	
    	public void deletePerson();
    	
    }
    package com.cj.study.proxyjdk;
    
    public class PersonServiceImpl implements PersonService{
    
    	@Override
    	public String savePerson() {
    		System.out.println("添加");
    		return "保存成功!";
    	}
    
    	@Override
    	public void updatePerson() {
    		System.out.println("修改");
    	}
    
    	@Override
    	public void deletePerson() {
    		System.out.println("删除");
    	}
    
    }
    
    package com.cj.study.proxyjdk;
    
    public class MyTransaction {
    	public void beginTransaction(){
    		System.out.println("开启事务 ");
    	}
    	public void commit(){
    		System.out.println("提交事务");
    	}
    }
    

    注意:在动态代理在生成代理对象的时候需要一个拦截器 InvocationHandler 因此咱们需要写一个拦截器

    package com.cj.study.proxyjdk;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class PersonServiceInterceptor implements InvocationHandler{
    	//目标类
    	private Object target;
    	//增强类
    	private MyTransaction myTransaction;
    	//构造函数注入目标类和增强类
    	public PersonServiceInterceptor(Object target,MyTransaction myTransaction){
    		this.target = target;
    		this.myTransaction = myTransaction;
    	}
    
    	//代理类的每一个方法被调用的时候都会调用下边的这个invoke方法
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args)
    			throws Throwable {
    		this.myTransaction.beginTransaction();
    		Object returnValue = method.invoke(this.target, args);
    		this.myTransaction.commit();
    		return returnValue;
    	}
    	
    }
    

    注意:

    1、当客户端执行代理对象.方法时,进入到了拦截器的invoke方法体

    2、拦截器中invoke方法体的内容就是代理对象方法体的内容

    3、拦截器中invoke方法的method参数是在调用的时候赋值的

    package com.cj.study.proxyjdk;
    
    import java.lang.reflect.Proxy;
    import org.junit.Test;
    
    public class ProxyTest {
    	@Test
    	public void test(){
    		Object target = new PersonServiceImpl();
    		MyTransaction myTransaction = new MyTransaction();
    		PersonServiceInterceptor interceptor = new PersonServiceInterceptor(target, myTransaction);
    		PersonService personService = (PersonService)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),interceptor);
    		String returnValue = (String)personService.savePerson();
    		System.out.println(returnValue);
    	}
    }
    

    可以打断点看下

    发现生成的对象是 $Proxy4 说明返回的已经是我们的代理对象了

    最后的运行结果

    2、cglib动态代理

    首先需要导入cglib的jar包:cglib-nodep-2.1_3.jar

    package com.cj.study.proxycglib;
    
    public interface PersonService {
    	
    	public String savePerson();
    	
    	public void updatePerson();
    	
    	public void deletePerson();
    	
    }
    
    package com.cj.study.proxycglib;
    
    public class PersonServiceImpl implements PersonService{
    
    	@Override
    	public String savePerson() {
    		System.out.println("添加");
    		return "保存成功!";
    	}
    
    	@Override
    	public void updatePerson() {
    		System.out.println("修改");
    	}
    
    	@Override
    	public void deletePerson() {
    		System.out.println("删除");
    	}
    
    }
    
    package com.cj.study.proxycglib;
    
    public class MyTransaction {
    	public void beginTransaction(){
    		System.out.println("开启事务 ");
    	}
    	public void commit(){
    		System.out.println("提交事务");
    	}
    }
    
    package com.cj.study.proxycglib;
    
    import java.lang.reflect.Method;
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class PersonServiceInterceptor implements MethodInterceptor{
    	//目标类
    	private Object target;
    	//增强类
    	private MyTransaction myTransaction;
    	//构造函数注入目标类和增强类
    	public PersonServiceInterceptor(Object target,MyTransaction myTransaction){
    		this.target = target;
    		this.myTransaction = myTransaction;
    	}
    	
    	public Object createProxy(){
    		Enhancer enhancer = new Enhancer();
    		enhancer.setCallback(this);
    		enhancer.setSuperclass(this.target.getClass());
    		return enhancer.create();
    	}
    
    	@Override
    	public Object intercept(Object arg0, Method arg1, Object[] arg2,
    			MethodProxy arg3) throws Throwable {
    		myTransaction.beginTransaction();
    		Object returnValue = arg1.invoke(this.target, arg2);
    		myTransaction.commit();
    		return returnValue;
    	}
    	
    }
    
    package com.cj.study.proxycglib;
    
    import org.junit.Test;
    
    public class ProxyTest {
    	@Test
    	public void test(){
    		Object target = new PersonServiceImpl();
    		MyTransaction myTransaction = new MyTransaction();
    		PersonServiceInterceptor interceptor = new PersonServiceInterceptor(target, myTransaction);
    		PersonService personService =(PersonService) interceptor.createProxy();
    		String returnValue = (String)personService.savePerson();
    		System.out.println(returnValue);
    	}
    }
    

    最后的运行结果

    最后需要知道的点:

    1、JDK动态代理,要求目标类实现接口,但是有时候目标类直接一个单独的对象,并没有实现任何的接口,这时就得使用CGLib动态代理
    2、JDK动态代理是JDK里自带的,CGLib动态代理需要引入第三方的jar包

    3、CGLib动态代理,它是在内存中构建一个子类对象,从而实现对目标对象功能的扩展
    4、CGLib动态代理,是基于继承来实现代理,所以无法对final类、private方法和static方法进行代理

    以上就是动态代理的两种实现。

    我们用上边的做法去实现目标方法的增强,实现代码的解耦,是没有问题的,但是还是需要自己去生成代理对象,自己手写拦截器,在拦截器里自己手动的去把要增强的内容和目标方法结合起来,这用起来还是有点繁琐,有更好的解决方案吗?

    答案是:有的!那就是Spring的AOP,这才是咱们最终想引出来的重点!

    有了Spring的AOP后,就不用自己去写了,只需要在配置文件里进行配置,配置好后Spring按照你的配置去帮你生成代理对象,按照你的配置把增强的内容和目标方法结合起来。就相当于自己写代码也能实现和aop类似的功能,但是有了Spring aop以后有些事情Spring帮你做了,而且人家Spring做成了可配置化,用起来非常简单而且很灵活

    咱们上边用的JDK动态代理和cglib动态代理,这两种在Spring的AOP里都有用到,Spring是根据不同的情况去决定是使用JDK的动态代理生成代理对象,还是使用cglib去生成代理对象,具体的内容下一篇会讲到。

    下一篇我们继续:讲一下Spring中的AOP以及切入点表达式和各种通知

    铁子们,如果觉得文章对你有所帮助,可以点关注,点赞

    也可以关注下公众号:扫码或 wx搜索:“聊5毛钱的java”,欢迎一起学习交流,关注公众号可领取博主的Java学习视频+资料,保证都是干货

    3Q~

    纯手敲原创不易,如果觉得对你有帮助,可以打赏支持一下,哈哈,感谢~

               

    展开全文
  • App抓 抖音Api抓 HTTPS抓 Charles抓 提示:以抖音APP为例,仅供学习 目录App抓 抖音Api抓 HTTPS抓 Charles抓前言...入库2.读入数据总结 前言 charles作为抓工具比Fillder功能更加强大,推荐使用

    App抓包 抖音Api抓包 HTTPS抓包 Charles抓包 抖音去水印

    (2021-03-11更新)



    前言

    charles作为抓包工具比Fillder功能更加强大,支持跨平台使用,推荐使用。本文以抖音app为例,实现用PC抓包手机app请求,仅供学习,不得作为商业用途。


    一、Charles

    1.下载地址

    官网:https://www.charlesproxy.com/
    补丁:https://www.zzzmode.com/mytools/charles/

    2.证书安装

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    最后下一步安装导入证书,此时PC端能正常抓包了。

    之后为手机抓包做准备

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    到此为止,Charles设置已经全部完成
    若浏览器不能正常访问其他网站,请去掉此规则,或暂时关闭windows proxy

    二、手机设置

    1.手机代理设置

    首先获取电脑在局域网的ip地址
    在这里插入图片描述

    设置好ip地址和端口号,但是这样并不能抓https链接的包,要安装ssl证书

    2.手机安装证书

    1.charles导出证书

    在这里插入图片描述
    在这里插入图片描述

    2.手机下载证书

    手机自带浏览器(safari)输入chls.pro/ssl,下载证书

    手机打开 设置→通用→描述文件 安装证书

    手机打开 设置→关于本机→证书信任设置 信任证书

    三.效果展示

    在这里插入图片描述
    截取到抖音后台数据
    其他接口有兴趣的大家可以自己深入研究,可以获取用户信息,点赞列表,关注列表等等,有机会我再单独写个帖子

    最后

    如果觉得这篇文章帮到了您,希望您支持一下,生活困苦,且行且珍惜,大家随意!

    抖音去水印python源码下载:https://download.csdn.net/download/hjn0618/15514789

    展开全文
  • 通过介增强我们可以为目标类添加一个接口的实现即原来目标类未实现某个接口,那么通过介增强可以为目标类创建实现某接口的代理。 Spring定义了介增强接口IntroductionInterceptor,该接口没有定义任何方法 ...

    概述

    引介增强是一种比较特殊的增强类型,它不是在目标方法周围织入增强,而是为目标创建新的方法和属性,所以它的连接点是类级别的而非方法级别的。

    通过引介增强我们可以为目标类添加一个接口的实现即原来目标类未实现某个接口,那么通过引介增强可以为目标类创建实现某接口的代理。

    Spring定义了引介增强接口IntroductionInterceptor,该接口没有定义任何方法
    这里写图片描述

    Spring为该接口提供了DelegatingIntroductionInterceptor实现类,一般情况下,通过扩展该实现类定义自己的引介增强类。


    实例

    代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

    我们一直使用的性能检测的例子。 开启监控会影响业务系统的性能,我们可以设置是否启用性能监视为可控的,那我们改如何使用引介增强实现这一个诱人的功能呢?

    我们创建一个示例来演示下,步骤如下:
    创建接口类:Monitorable.java
    创建业务类:PerformanceMonitor.java
    创建增强类:ControllablePerformanceMonitor.java
    创建配置文件:conf-advice.xml
    创建增强测试类:DelegatingTest.java

    这里写图片描述

    接口类:Monitorable.java

    package com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor;
    
    public interface Monitorable {
        void setMonitorActive(boolean active);
    }
    

    该接扣仅包含一个setMonitorActive方法,我们希望通过该接口方法控制业务类性能监视功能的激活和关闭状态

    接下来创建业务类

    package com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor;
    
    public class PerformanceMonitor {
        private static ThreadLocal<MethodPerformace> performaceRecord = new ThreadLocal<MethodPerformace>();
    
        public static void begin(String method) {
            System.out.println("begin monitor...");
            MethodPerformace mp = performaceRecord.get();
            if (mp == null) {
                mp = new MethodPerformace(method);
                performaceRecord.set(mp);
            } else {
                mp.reset(method);
            }
        }
    
        public static void end() {
            System.out.println("end monitor...");
            MethodPerformace mp = performaceRecord.get();
            mp.printPerformace();
        }
    }
    

    接下来创建增强类ControllablePerformanceMonitor

    package com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor;
    
    import org.aopalliance.intercept.MethodInvocation;
    import org.springframework.aop.support.DelegatingIntroductionInterceptor;
    
    public class ControllablePerformaceMonitor extends
            DelegatingIntroductionInterceptor implements Monitorable {
    
        private static final long serialVersionUID = 1L;
        // 定义ThreadLocal类型的变量,用于保存性能监视开关状态。 为了解决单实例线程安全的问题,通过ThreadLocal
        // 让每个线程单独使用一个状态
        private ThreadLocal<Boolean> MonitorStatusMap = new ThreadLocal<Boolean>();
    
        @Override
        public void setMonitorActive(boolean active) {
            MonitorStatusMap.set(active);
        }
    
        /**
         * 拦截方法
         */
        @Override
        public Object invoke(MethodInvocation mi) throws Throwable {
            Object obj = null;
            // 对于支持新跟那个监视可控代理,通过判断其状态决定是否开启性能监控功能
            // Java5.0的自动拆包功能,get方法返回的Boolean被自动拆包为boolean类型的值
            if (MonitorStatusMap.get() != null && MonitorStatusMap.get()) {
                PerformanceMonitor.begin(mi.getClass().getName() + "."
                        + mi.getMethod().getName());
                obj = super.invoke(mi);
                PerformanceMonitor.end();
            } else {
                obj = super.invoke(mi);
            }
            return obj;
        }
    
    }
    
    

    接下来创建所要增强的方法类

    package com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor;
    
    public class ForumService {
        public void removeTopic(int topicId) {
            System.out.println("模拟删除Topic记录:" + topicId);
            try {
                Thread.currentThread().sleep((long) (Math.random() * 1000 * 20));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
    
        }
    
        public void removeForum(int forumId) {
            System.out.println("模拟删除Forum记录:" + forumId);
            try {
                Thread.currentThread().sleep((long) (Math.random() * 1000 * 20));
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
    package com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor;
    
    public class MethodPerformace {
        private long begin;
        private long end;
        private String serviceMethod;
    
        public MethodPerformace(String serviceMethod) {
            reset(serviceMethod);
        }
    
        public void printPerformace() {
            end = System.currentTimeMillis();
            long elapse = end - begin;
            System.out.println(serviceMethod + "花费" + elapse + "毫秒。");
        }
    
        public void reset(String serviceMethod) {
            this.serviceMethod = serviceMethod;
            this.begin = System.currentTimeMillis();
        }
    }
    

    创建配置文件来将所设置的代码组合起来

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="pmonitor"
            class="com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor.ControllablePerformaceMonitor" />
        <bean id="forumServiceTarget" class="com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor.ForumService" />
    
        <bean id="forumService" class="org.springframework.aop.framework.ProxyFactoryBean"
            p:interfaces="com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor.Monitorable"
            p:target-ref="forumServiceTarget" 
            p:interceptorNames="pmonitor"
            p:proxyTargetClass="true" />
    
    </beans>

    引介增强的配置和一般配置有较大的区别,

    • 首先需要指定引介增强所实现的接口 ,如 p:interfaces ,这里的引介增强实现了Monitorable接口。
    • 其次,由于只能通过为目标类创建子类的方式生成引介增强的代理,所以必须将 p:proxyTargetClass=”true”

    如果没有对ControllablePerformaceMonitor进行线程安全的处理,就必须将singleton属性设置为false, 让ProxyFactoryBean产生prototype的作用域类型的代理。 这里就带来了一个严重的性能问题,因为cglib动态创建代理的性能很低,而每次getBean方法从容器中获取作用域为prototype的Bean时都将返回一个新的代理实例,所以这种影响是巨大的,这也是为什么通过ThreadLocal对ControllablePerformaceMonitor的开关进行线程安全化处理的原因。 通过线程安全处理后,就可以使用默认的singleton Bean作用域,这样创建代理的动作仅发生一次。

    创建对应的测试类

    package com.xgj.aop.spring.advice.DelegatingIntroductionInterceptor;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class DelegatingTest {
        @Test
        public void test() {
            ApplicationContext ctx = new ClassPathXmlApplicationContext(
                    "classpath:com/xgj/aop/spring/advice/DelegatingIntroductionInterceptor/conf-advice.xml");
            ForumService forumService = (ForumService) ctx.getBean("forumService");
            forumService.removeForum(10);
            forumService.removeTopic(1022);
    
            Monitorable moniterable = (Monitorable) forumService;
            moniterable.setMonitorActive(true);
            forumService.removeForum(10);
            forumService.removeTopic(1022);
        }
    }
    

    运行结果

    这里写图片描述


    展开全文
  • Spring-AOP 自动创建代理

    千次阅读 2017-08-21 12:46:01
    Spring只能在方法级别上织入增强,Spring提供了4种类型的方法增强,分别是前置增强、后置增强、环绕增强、异常抛出增强,此外还有一种特殊的介增强。 介增强是类级别的,它为目标类织入新的接口实现。 从广义...

    导读

    Spring-AOP 自动创建代理

    Spring-AOP 自动创建代理之BeanNameAutoProxyCreator

    Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator

    Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator


    概述

    我们通过前面几篇博文的案例,我们会发现都是通过ProxyFactoryBean创建织入切面的代理,每个需要被代理的Bean都需要使用一个ProxyFactoryBean进行配置。

    幸好Spring提供了自动代理机制,让容器自动生成代理,把开发人员从繁琐的配置中解脱出来。在内部,Spring使用BeanPostProcessor自动完成这项工作


    实现类介绍

    基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化Bean时为匹配的Bean生成代理内容。

    这些代理创建器可以分为3类

    • 基于Bean配置名规则的自动代理创建器
      允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator

    • 基于Advisor匹配机制的自动代理创建器
      它会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中(为目标Bean创建代理实例),实现类为DefaultAdvisorAutoProxyCreator

    • 基于Bean中的AspectJ注解标签的自动代理创建器
      为包含AspectJ注解的Bean自动创建代理实例,实现类为AnnotationAwareAspectJAutoProxyCreator.

    自动创建代理器实现类的继承图

    这里写图片描述

    可以清楚的看到所有的自动代理器类都实现了BeanPostPorcessor,在容器实例化Bean时,BeanPostProcessor将对它进行加工处理,所以自动代理创建器有机会对满足匹配规则的bean自动创建代理对象


    BeanNameAutoProxyCreator

    请参考另外一篇博文 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator


    DefaultAdvisorAutoProxyCreator

    请参考另外一篇博文 Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator


    AnnotationAwareAspectJAutoProxyCreator

    请参考另外一篇博文 Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator


    AOP总结

    AOP是OOP的延伸,它为程序开发提供了一个崭新的思考角度,将可以重复性的横切逻辑抽取到统一的模块中,通过OOP的纵向抽象和AOP的横向抽取,程序才可以真正解决重复性代码问题。

    Spring采用JDK动态代理和CGLib动态代理技术在运行期织入增强,所以不需要装备特殊的编译器或类装载器就可以使用AOP功能。

    要使用JDK动态代理,目标类必须实现接口,而CGLib不对目标类作任何限制,它通过动态生成目标类子类的方式提供代理。

    在JDK动态代理中通过接口来实现方法拦截,所以必须确保要拦截的目标在接口中有定义,否则将无法拦截

    在CGLib动态代理中通过动态生成代理子类来实现方法拦截,所以必须确保要拦截的目标方法可以被子类访问,也就是目标方法必须定义为非final,且非私有实例方法。

    JDK在创建代理对象时的性能高于CGLib,而生成的代理对象的运行性能却比CGLib低。 如果是singleton的代理,推荐使用CGlib动态代理。

    Spring只能在方法级别上织入增强,Spring提供了4种类型的方法增强,分别是前置增强、后置增强、环绕增强、异常抛出增强,此外还有一种特殊的引介增强。 引介增强是类级别的,它为目标类织入新的接口实现。 从广义上将,增强其实是一种最简单的切面,它既包括横切代码又包括切点信息,只不过它的切点只是简单的方法相对位置信息。 所以增强一般需要和切点联合才可以表示一个更具实用性的切面。

    在Spring中,普通的切点通过目标类名和方法名描述连接点的信息。 流程切点是比较特殊的切点,它通过方法调用堆栈的运行环境来决定连接点。 有时候需要通过切点的交叉或者合并描述一个最终的切点,可以使用ComposablePointcut的复合切点

    切面是增强和切点的联合体,可以很方便的通过Spring提供的ProxyFactoryBean将切面自入不同的目标类中。 当然为每个目标类手工配置一个切面是比较繁琐的,Spring利用BeanPostProcessor可干涉Bean生命周期的机制,提供一些可以自动创建代理、自入切面的自动代理创建器,其中DefaultAdvisorAutoProxyCreator是功能强大的自动代理穿件器,它可以将容器中所有的Advisor自动织入目标Bean中。


    展开全文
  • go 关于的引入

    千次阅读 2019-03-09 20:54:26
    学习golang一个多星期了, 一直没有搞明白go的管理以及项目中引用的细节, go1.11后又有了module的概念, 写代码时只用关注import, 不用手动下载或是 go get了, 但是国内网络的原因, 如 golang.org 下的不能自动...
  • 盘点python工具并优化pip下载加速

    千次阅读 2020-08-19 22:59:25
    1、优化pip下载加速 2、vscode使用安装环境python 3、python相关工具与方法 3.1、Bilibili.com(B站)数据下载工具 开源地址:https://github.com/wolfbolin/BiliUtil 安装命令:pip install Bi
  • java静态代理与动态代理的区别

    千次阅读 2015-10-25 22:15:22
    本文动态代理部分内容大量自:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/  一、代理概念  为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在...
  • rap韵脚大全(包含各种诗词歌曲的韵脚等)

    万次阅读 多人点赞 2019-12-27 21:47:10
    坠,缀,锥 (ao篇) Bao:,保,报,宝,抱,暴,苞,褓,剥,雹,褒,堡,爆 Cao:草,操,曹 Chao:朝,抄,超,吵,巢,潮,炒,嘲, Dao:到,道,倒,刀,岛,盗,稻,悼,导,蹈,祷,捣 Gao:高,搞,告,...
  • Spring_动态代理_AOP

    千次阅读 2019-05-04 00:40:40
    Spring_动态代理_AOP
  • 框架相关jar简单介绍

    千次阅读 2012-07-24 15:41:11
    原文... 最近做spring mvc项目,期间遇到很多jar,不是多了,就是少了,做的很郁闷,为此,我上网查了一下大多数代表的意思,这样我就不用摸不到头脑了! jar 用途 axis.jar SOAP
  • --******************************************-- 使用DBMS_SHARED_POOL将对象固定到共享池--****************************************** DBMS_SHARED_POOL提供存储过程来将PL/SQL对象或SQL游标固定到Oracle ...
  • 另一種表示碼塊的方式是使用 4 個反號(“`”),然後在下一行書寫碼。 反斜杠用於轉義,以避免某個字符被當成是 Markdown 語法的一部分。例如,/**this/** 的結果是文字不會被加粗顯示。 上面的內容是 ...
  • spring框架中各种jar代表的意思

    千次阅读 2012-07-11 00:34:02
    最近做spring mvc项目,期间遇到很多jar,不是多了,就是少了,做的很郁闷,为此,我上网查了一下大多数代表的意思,这样我就不用摸不到头脑了!  jar 用途 axis.jar SOAP引擎 ...
  • 文章目录TCP\IP协议实践:wireshark抓分析之链路层与网络层从ping开始链路层之以太网封装ip首部开启ping程序,开始抓由一个ping的结果出来的两个协议ARP ICMPARP:地址解析协议原理抓结果ICMP:Internet控制...
  • Electrum钱包的使用说明详解

    万次阅读 2016-10-08 17:00:35
    关停动漫影视类QQ群 QQ群改... matlab绘图如何定义坐标轴上的... 【已公布获奖】2014年5月-6月... Matlab中几个数值积分函数的比... linux dhcp peizhi roc ...
  • PacBio三代测序专业术语解读

    千次阅读 2019-05-08 16:38:12
    PacBio三代测序专业术语解读 测序百家  • 2017年3月28日 pm3:57 •  ...仪器最右侧的隔间,包含氮入口和制冷机次模组。 tip station:  SMRT Cell和枪头抽屉中的区域,用于容纳最多6盒移液器枪头。
  • Springframework下所有jar作用简介

    千次阅读 2017-09-26 11:03:02
    感谢原作者,本文自:...Spring——jar详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spring
  • spring-aop jar需求

    千次阅读 2018-03-27 11:52:15
    SpringAop:的底层就是通过JDK动态代理"或"CGLib动态代理为技术目标织入横...org.springframework.aop.IntroductionInterceptor 介通知.在目标类中添加了一些新的方法和属性的时候,执行的业务逻辑(几乎很少使用)
  •  下面LZ先给出观察者模式标准版的定义,自百度百科。   定义:观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理...
  • 获取代理服务器ip列表的方法

    千次阅读 2019-09-27 11:14:44
    开源项目:https://github.com/SpiderClub/haipproxy,看爬代理的网址列表应该是最多的。 CRAWLER_TASKS = [ { 'name': 'mogumiao.com', 'resource': ['http://www.mogumiao.com/proxy/free/listFreeIp'...
  • RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel #构建镜像时运行shell命令,yum安装nginx的依赖 ADD nginx-1.12.1.tar.gz /tmp #拷贝文件或目录到镜像下,遇到压缩文件自动解压缩 RUN cd /tmp/nginx...
  • } } AsyncAnnotationAdvisor:和@Async有关 位于为:org.springframework.scheduling.annotation,所属jar为spring-context.jar public class AsyncAnnotationAdvisor extends AbstractPointcutAdvisor ...
  • Java常用jar用途List

    千次阅读 2013-01-24 18:02:35
    ar 用途 axis.jar SOAP引擎 commons-discovery-0.2.jar 用来发现、查找和实现可插入式接口,提供一些一般类实例化、单件的生命周期管理的常用方法. jaxrpc.jar Axis运行所需要的组件 ...
  • 引入spring整合aspectJ的jar:spring-aspects-3.2.0.RELEASE.jar 步骤二 : 引入配置文件 : Log4j 和 spring 的配置文件 步骤三 : 创建和类 : cn.green.demo5 UserDao UserDaoImpl ...
  • 对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例) 【小家Spring】Spring AOP之Advisor、PointcutAdvisor、IntroductionAdvisor、IntroductionInterceptor(介增强) 【小家Spring...
  • PRML 01 绪论:引言与

    千次阅读 2016-05-03 17:40:13
    我们可以使用一个新的数据集,入已经训练好的模型,看其误差函数的表现情况,在这里可以使用下面的误差函数,均方根(root-mean-square)来评价,其分母除以n可以得出平均的误差,因此可以比较在测试集数量不同的...
  • 代理服务器中的内容防拷贝技术

    千次阅读 2013-08-08 22:45:48
    剩下的就是细节了,比如buf结构体中的各种标记,这里将它们列出(自 http://tengine.taobao.org/book/chapter_4.html ): unsigned recycled:1; /* 内存可以被输出并回收 */ unsigned in_file:1; /* buffer的...
  • 【docker案例】项目打包部署

    千次阅读 2018-06-17 16:18:56
    如果包含特殊字符用单引号起来 布尔值(true、false、yes、no、on、off)必须用引号括起来,这样分析器会将他们解释为字符串。 compose配置文件常用字段 compose常用命令 一键部署LNMP网站...
  • httpclient导入的问题

    千次阅读 2011-07-26 10:26:28
    因为在学习Http Client有好多问题一直在困扰我,比如说下面这一个,开始的时候我们想要实现编程工具向服务器发送请求,但是导入一直不正确,按照网上下载下来的代码也会报错,后来找到老师,才在老师的帮助下解决...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,781
精华内容 13,512
关键字:

引包代