spring AOP 动态代理 jkd动态代理和cglib动态代理 hibernate使用cglib延迟加载

本文介绍了Spring AOP中使用JDK动态代理和CGLIB动态代理的基本原理及实现方式,并通过实例展示了如何利用这两种代理机制来增强目标类的功能。

spring 的AOP 实现 可以使用jdk的动态代理,也可以使用cglib的动态代理 先说下两者区别:
静态代理:代理之前就已经知道了代理者和被代理者
动态代理:代理之前并不清楚,在运行时使用反射机制动态生成代理类的字节码 无需我们手动编写它的源代码
jdk动态代理:java.lang.reflect 包中的Proxy类,InvocationHandler 接口提供了生成动态代理类的能力。它必须有被代理对象的接口和实现类,ciglib不需要接口,简单的说 jkd动态代理针对接口,而cglib动态代理针对的是类 比JDK快,但加载cglib的时间比jdk反射的时间长,开发的过程中,如果是反复动态生成新的代理类推荐用 JDK 自身的反射,反之用 cglib。

spring AOP的实现 既可以编写接口使用jdk动态代理实现,也可以使用cglib来进行实现

对于hibernate使用cglib延迟加载,在load()的时候,cglib会生成一个数据库实体类的代理类,此代理类开始的时候里面的属性值是null,只有当真正请求数据,如user.getName()的时候,这个代理类就会去数据库里查询出具体的值(通过cglib的回调机制),然后加载到代理类对应的属性中,最后返回给给调用者。

以下为一个转载的实例:

/**
*使用类
*/
public class MyClass { 
public void method() { 
        System.out.println("MyClass.method()"); 
    } 
public void method2() { 
        System.out.println("MyClass.method2()"); 
    } 
}
/**
*使用代理
*/
import java.lang.reflect.Method; 
import net.sf.cglib.proxy.Enhancer; 
import net.sf.cglib.proxy.MethodProxy; 
import net.sf.cglib.proxy.MethodInterceptor; 
public class Main { 
public static void main(String[] args) { 
        Enhancer enhancer = new Enhancer(); 
//在这代理了 
        enhancer.setSuperclass(MyClass.class); 
        enhancer.setCallback( new MethodInterceptorImpl() ); 
// 创造 代理 (动态扩展了MyClass类) 
        MyClass my = (MyClass)enhancer.create(); 
        my.method(); 
    } 
private static class MethodInterceptorImpl implements MethodInterceptor { 
public Object intercept(Object obj,  
                                Method method,  
                                Object[] args,  
                                MethodProxy proxy) throws Throwable { 
            System.out.println(method); 
            proxy.invokeSuper(obj, args); 
return null; 
        } 
    } 
}
/**
*添加方法过滤
*/
import java.lang.reflect.Method; 
import net.sf.cglib.proxy.Enhancer; 
import net.sf.cglib.proxy.MethodProxy; 
import net.sf.cglib.proxy.MethodInterceptor; 
import net.sf.cglib.proxy.NoOp; 
import net.sf.cglib.proxy.Callback; 
import net.sf.cglib.proxy.CallbackFilter; 
public class Main2 { 
public static void main(String[] args) { 
        Callback[] callbacks = 
new Callback[] { new MethodInterceptorImpl(),  NoOp.INSTANCE }; 
        Enhancer enhancer = new Enhancer(); 
        enhancer.setSuperclass(MyClass.class); 
        enhancer.setCallbacks( callbacks ); 
//添加 方法过滤器  返回1为不运行 2 为运行 
        enhancer.setCallbackFilter( new CallbackFilterImpl() ); 
        MyClass my = (MyClass)enhancer.create(); 
        my.method(); 
        my.method2(); 
    } 
private static class CallbackFilterImpl implements CallbackFilter { 
public int accept(Method method) { 
if ( method.getName().equals("method2") ) { 
return 1; 
            } else { 
return 0; 
            } 
        } 
    } 
private static class MethodInterceptorImpl implements MethodInterceptor { 
public Object intercept(Object obj,  
                                Method method,  
                                Object[] args,  
                                MethodProxy proxy) throws Throwable { 
            System.out.println(method); 
return proxy.invokeSuper(obj, args); 
        } 
    } 
}

下面贴下在imooc上自己写的几个小例子:
具体可点击:

jdk动态代理的简单实现:

package proxy.dynamicProxy.jdk;

import java.util.Random;

/**
 * 需要代理的具体类继承接口
 */
public class Car implements Moveable {

    @Override
    public void move() {
        //实现开车
        try {
            Thread.sleep(new Random().nextInt(1000));
            System.out.println("汽车行驶中....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
########################################
package proxy.dynamicProxy.jdk;

/**
 *jdk实现动态代理模式,必须使用接口
 */
public interface Moveable {
    void move();
}
########################################
package proxy.dynamicProxy.jdk;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 代理者,必须集成InvocationHandler 实现invoke方法
 */
public class TimeHandler implements InvocationHandler {

    public TimeHandler(Object target) {
        super();
        this.target = target;
    }

    //代理对象
    private Object target;

    /*
     * 只能代理实现了接口的类,没有实现接口的类不能实现JDK动态代理
     * 参数:
     * proxy  被代理对象
     * method  被代理对象的方法
     * args 方法的参数
     * 
     * 返回值:
     * Object  方法的返回值
     * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        long starttime = System.currentTimeMillis();
        System.out.println("汽车开始行驶....");
        method.invoke(target);
        long endtime = System.currentTimeMillis();
        System.out.println("汽车结束行驶....  汽车行驶时间:" 
                + (endtime - starttime) + "毫秒!");
        return null;
    }

}
#####################################
package proxy.dynamicProxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;


public class Test {

    /**
     * JDK动态代理测试类
     */
    public static void main(String[] args) {
        Car car = new Car();
        InvocationHandler h = new TimeHandler(car);
        Class<?> cls = car.getClass();
        /**
         * loader  类加载器
         * interfaces  实现接口
         * h InvocationHandler 调用处理者
         */
        Moveable m = (Moveable)Proxy.newProxyInstance(cls.getClassLoader(),
                                                cls.getInterfaces(), h);
        m.move();
    }

}

cglib动态代理简单实现:

package proxy.dynamicProxy.cglib;

public class Train {

    public void move(){
        System.out.println("火车行驶中...");
    }
}
##########################################
package proxy.dynamicProxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibProxy implements MethodInterceptor {

    private Enhancer enhancer = new Enhancer();//实例化强化剂对象

    public Object getProxy(Class clazz){
        //设置创建子类的类
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);

        return enhancer.create();
    }

    /**
     * 针对类来实现代理,先为目标类生产一个子类,通过方法拦截技术拦截所有父类方法的调用
     * 拦截所有目标类(父类)方法的调用
     * obj  目标类的实例
     * m   目标方法的反射对象
     * args  方法的参数
     * proxy代理类的实例
     */
    @Override
    public Object intercept(Object obj, Method m, Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("日志开始...");
        //代理类调用父类的方法
        proxy.invokeSuper(obj, args);
        System.out.println("日志结束...");
        return null;
    }

}
##################################
package proxy.dynamicProxy.cglib;

import proxy.dynamicProxy.cglib.CglibProxy;

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {

        CglibProxy proxy = new CglibProxy();
        Train t = (Train)proxy.getProxy(Train.class);
        t.move();
    }

}

D:\jkd17\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:E:\idea\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar=57906:E:\idea\IntelliJ IDEA 2021.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-launcher\1.12.2\junit-platform-launcher-1.12.2.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-engine\1.12.2\junit-platform-engine-1.12.2.jar;C:\Users\Administrator\.m2\repository\org\opentest4j\opentest4j\1.3.0\opentest4j-1.3.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-commons\1.12.2\junit-platform-commons-1.12.2.jar;C:\Users\Administrator\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;E:\idea\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar;E:\idea\IntelliJ IDEA 2021.3.3\plugins\junit\lib\junit5-rt.jar;E:\idea\IntelliJ IDEA 2021.3.3\plugins\junit\lib\junit-rt.jar;E:\ruoyi\gulimall-01\gulimall-product\target\test-classes;E:\ruoyi\gulimall-01\gulimall-product\target\classes;E:\ruoyi\gulimall-01\gulimall-common\target\classes;D:\Maven\crmrepo\org\projectlombok\lombok\1.18.38\lombok-1.18.38.jar;D:\Maven\crmrepo\com\baomidou\mybatis-plus-boot-starter\3.3.1.tmp\mybatis-plus-boot-starter-3.3.1.tmp.jar;D:\Maven\crmrepo\com\baomidou\mybatis-plus\3.3.1.tmp\mybatis-plus-3.3.1.tmp.jar;D:\Maven\crmrepo\com\baomidou\mybatis-plus-extension\3.3.1.tmp\mybatis-plus-extension-3.3.1.tmp.jar;D:\Maven\crmrepo\com\baomidou\mybatis-plus-core\3.3.1.tmp\mybatis-plus-core-3.3.1.tmp.jar;D:\Maven\crmrepo\com\baomidou\mybatis-plus-annotation\3.3.1.tmp\mybatis-plus-annotation-3.3.1.tmp.jar;D:\Maven\crmrepo\com\github\jsqlparser\jsqlparser\3.1\jsqlparser-3.1.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-autoconfigure\3.5.4\spring-boot-autoconfigure-3.5.4.jar;D:\Maven\crmrepo\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;D:\Maven\crmrepo\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\Maven\crmrepo\com\mysql\mysql-connector-j\9.3.0\mysql-connector-j-9.3.0.jar;D:\Maven\crmrepo\jakarta\validation\jakarta.validation-api\3.0.2\jakarta.validation-api-3.0.2.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-starter-web\3.5.4\spring-boot-starter-web-3.5.4.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-starter\3.5.4\spring-boot-starter-3.5.4.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot\3.5.4\spring-boot-3.5.4.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-starter-logging\3.5.4\spring-boot-starter-logging-3.5.4.jar;D:\Maven\crmrepo\ch\qos\logback\logback-classic\1.5.18\logback-classic-1.5.18.jar;D:\Maven\crmrepo\ch\qos\logback\logback-core\1.5.18\logback-core-1.5.18.jar;D:\Maven\crmrepo\org\apache\logging\log4j\log4j-to-slf4j\2.24.3\log4j-to-slf4j-2.24.3.jar;D:\Maven\crmrepo\org\apache\logging\log4j\log4j-api\2.24.3\log4j-api-2.24.3.jar;D:\Maven\crmrepo\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;D:\Maven\crmrepo\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;D:\Maven\crmrepo\org\yaml\snakeyaml\2.4\snakeyaml-2.4.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-starter-json\3.5.4\spring-boot-starter-json-3.5.4.jar;D:\Maven\crmrepo\com\fasterxml\jackson\core\jackson-databind\2.19.2\jackson-databind-2.19.2.jar;D:\Maven\crmrepo\com\fasterxml\jackson\core\jackson-annotations\2.19.2\jackson-annotations-2.19.2.jar;D:\Maven\crmrepo\com\fasterxml\jackson\core\jackson-core\2.19.2\jackson-core-2.19.2.jar;D:\Maven\crmrepo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.19.2\jackson-datatype-jdk8-2.19.2.jar;D:\Maven\crmrepo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.19.2\jackson-datatype-jsr310-2.19.2.jar;D:\Maven\crmrepo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.19.2\jackson-module-parameter-names-2.19.2.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-starter-tomcat\3.5.4\spring-boot-starter-tomcat-3.5.4.jar;D:\Maven\crmrepo\org\apache\tomcat\embed\tomcat-embed-core\10.1.43\tomcat-embed-core-10.1.43.jar;D:\Maven\crmrepo\org\apache\tomcat\embed\tomcat-embed-el\10.1.43\tomcat-embed-el-10.1.43.jar;D:\Maven\crmrepo\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.43\tomcat-embed-websocket-10.1.43.jar;D:\Maven\crmrepo\org\springframework\spring-web\6.2.9\spring-web-6.2.9.jar;D:\Maven\crmrepo\org\springframework\spring-beans\6.2.9\spring-beans-6.2.9.jar;D:\Maven\crmrepo\io\micrometer\micrometer-observation\1.15.2\micrometer-observation-1.15.2.jar;D:\Maven\crmrepo\io\micrometer\micrometer-commons\1.15.2\micrometer-commons-1.15.2.jar;D:\Maven\crmrepo\org\springframework\spring-webmvc\6.2.9\spring-webmvc-6.2.9.jar;D:\Maven\crmrepo\org\springframework\spring-aop\6.2.9\spring-aop-6.2.9.jar;D:\Maven\crmrepo\org\springframework\spring-context\6.2.9\spring-context-6.2.9.jar;D:\Maven\crmrepo\org\springframework\spring-expression\6.2.9\spring-expression-6.2.9.jar;D:\Maven\crmrepo\org\springframework\cloud\spring-cloud-starter-openfeign\4.3.0\spring-cloud-starter-openfeign-4.3.0.jar;D:\Maven\crmrepo\org\springframework\cloud\spring-cloud-starter\4.3.0\spring-cloud-starter-4.3.0.jar;D:\Maven\crmrepo\org\springframework\cloud\spring-cloud-context\4.3.0\spring-cloud-context-4.3.0.jar;D:\Maven\crmrepo\org\bouncycastle\bcprov-jdk18on\1.80\bcprov-jdk18on-1.80.jar;D:\Maven\crmrepo\org\springframework\cloud\spring-cloud-openfeign-core\4.3.0\spring-cloud-openfeign-core-4.3.0.jar;D:\Maven\crmrepo\io\github\openfeign\feign-form-spring\13.6\feign-form-spring-13.6.jar;D:\Maven\crmrepo\org\apache\commons\commons-text\1.13.0\commons-text-1.13.0.jar;D:\Maven\crmrepo\org\apache\commons\commons-lang3\3.17.0\commons-lang3-3.17.0.jar;D:\Maven\crmrepo\io\github\openfeign\feign-form\13.6\feign-form-13.6.jar;D:\Maven\crmrepo\commons-fileupload\commons-fileupload\1.5\commons-fileupload-1.5.jar;D:\Maven\crmrepo\org\springframework\cloud\spring-cloud-commons\4.3.0\spring-cloud-commons-4.3.0.jar;D:\Maven\crmrepo\org\springframework\security\spring-security-crypto\6.5.2\spring-security-crypto-6.5.2.jar;D:\Maven\crmrepo\io\github\openfeign\feign-core\13.6\feign-core-13.6.jar;D:\Maven\crmrepo\io\github\openfeign\feign-slf4j\13.6\feign-slf4j-13.6.jar;D:\Maven\crmrepo\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;D:\Maven\crmrepo\org\mybatis\spring\boot\mybatis-spring-boot-starter\3.0.3\mybatis-spring-boot-starter-3.0.3.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-starter-jdbc\3.5.4\spring-boot-starter-jdbc-3.5.4.jar;D:\Maven\crmrepo\com\zaxxer\HikariCP\6.3.1\HikariCP-6.3.1.jar;D:\Maven\crmrepo\org\springframework\spring-jdbc\6.2.9\spring-jdbc-6.2.9.jar;D:\Maven\crmrepo\org\springframework\spring-tx\6.2.9\spring-tx-6.2.9.jar;D:\Maven\crmrepo\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\3.0.3\mybatis-spring-boot-autoconfigure-3.0.3.jar;D:\Maven\crmrepo\org\mybatis\mybatis\3.5.14\mybatis-3.5.14.jar;D:\Maven\crmrepo\org\mybatis\mybatis-spring\3.0.3\mybatis-spring-3.0.3.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-starter-test\3.5.4\spring-boot-starter-test-3.5.4.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-test\3.5.4\spring-boot-test-3.5.4.jar;D:\Maven\crmrepo\org\springframework\boot\spring-boot-test-autoconfigure\3.5.4\spring-boot-test-autoconfigure-3.5.4.jar;D:\Maven\crmrepo\com\jayway\jsonpath\json-path\2.9.0\json-path-2.9.0.jar;D:\Maven\crmrepo\jakarta\xml\bind\jakarta.xml.bind-api\4.0.2\jakarta.xml.bind-api-4.0.2.jar;D:\Maven\crmrepo\jakarta\activation\jakarta.activation-api\2.1.3\jakarta.activation-api-2.1.3.jar;D:\Maven\crmrepo\net\minidev\json-smart\2.5.2\json-smart-2.5.2.jar;D:\Maven\crmrepo\net\minidev\accessors-smart\2.5.2\accessors-smart-2.5.2.jar;D:\Maven\crmrepo\org\ow2\asm\asm\9.7.1\asm-9.7.1.jar;D:\Maven\crmrepo\org\assertj\assertj-core\3.27.3\assertj-core-3.27.3.jar;D:\Maven\crmrepo\net\bytebuddy\byte-buddy\1.17.6\byte-buddy-1.17.6.jar;D:\Maven\crmrepo\org\awaitility\awaitility\4.2.2\awaitility-4.2.2.jar;D:\Maven\crmrepo\org\hamcrest\hamcrest\3.0\hamcrest-3.0.jar;D:\Maven\crmrepo\org\junit\jupiter\junit-jupiter\5.12.2\junit-jupiter-5.12.2.jar;D:\Maven\crmrepo\org\junit\jupiter\junit-jupiter-api\5.12.2\junit-jupiter-api-5.12.2.jar;D:\Maven\crmrepo\org\opentest4j\opentest4j\1.3.0\opentest4j-1.3.0.jar;D:\Maven\crmrepo\org\junit\platform\junit-platform-commons\1.12.2\junit-platform-commons-1.12.2.jar;D:\Maven\crmrepo\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;D:\Maven\crmrepo\org\junit\jupiter\junit-jupiter-params\5.12.2\junit-jupiter-params-5.12.2.jar;D:\Maven\crmrepo\org\junit\jupiter\junit-jupiter-engine\5.12.2\junit-jupiter-engine-5.12.2.jar;D:\Maven\crmrepo\org\junit\platform\junit-platform-engine\1.12.2\junit-platform-engine-1.12.2.jar;D:\Maven\crmrepo\org\mockito\mockito-core\5.17.0\mockito-core-5.17.0.jar;D:\Maven\crmrepo\net\bytebuddy\byte-buddy-agent\1.17.6\byte-buddy-agent-1.17.6.jar;D:\Maven\crmrepo\org\objenesis\objenesis\3.3\objenesis-3.3.jar;D:\Maven\crmrepo\org\mockito\mockito-junit-jupiter\5.17.0\mockito-junit-jupiter-5.17.0.jar;D:\Maven\crmrepo\org\skyscreamer\jsonassert\1.5.3\jsonassert-1.5.3.jar;D:\Maven\crmrepo\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;D:\Maven\crmrepo\org\springframework\spring-core\6.2.9\spring-core-6.2.9.jar;D:\Maven\crmrepo\org\springframework\spring-jcl\6.2.9\spring-jcl-6.2.9.jar;D:\Maven\crmrepo\org\springframework\spring-test\6.2.9\spring-test-6.2.9.jar;D:\Maven\crmrepo\org\xmlunit\xmlunit-core\2.10.3\xmlunit-core-2.10.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 com.mqt.gulimall.product.GulimallProductApplicationTests,testSaveBrandEntity1 08:57:36.263 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.mqt.gulimall.product.GulimallProductApplicationTests]: GulimallProductApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 08:57:36.466 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.mqt.gulimall.product.GulimallProductApplication for test class com.mqt.gulimall.product.GulimallProductApplicationTests . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.5.4) 2025-08-16T08:57:37.963+08:00 INFO 2708 --- [ main] c.m.g.p.GulimallProductApplicationTests : Starting GulimallProductApplicationTests using Java 17.0.16 with PID 2708 (started by Administrator in E:\ruoyi\gulimall-01\gulimall-product) 2025-08-16T08:57:37.965+08:00 INFO 2708 --- [ main] c.m.g.p.GulimallProductApplicationTests : No active profile set, falling back to 1 default profile: "default" 2025-08-16T08:57:39.841+08:00 INFO 2708 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=b9e0ec63-ed6c-34d9-b3e4-ff50d76ad705 2025-08-16T08:57:40.861+08:00 INFO 2708 --- [ main] o.s.v.b.OptionalValidatorFactoryBean : Failed to set up a Bean Validation provider: jakarta.validation.NoProviderFoundException: Unable to create a Configuration, because no Jakarta Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath. 2025-08-16T08:57:41.619+08:00 INFO 2708 --- [ main] c.m.g.p.GulimallProductApplicationTests : Started GulimallProductApplicationTests in 4.37 seconds (process running for 6.674) OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended java.lang.RuntimeException: 保存品牌实体失败 at com.mqt.gulimall.product.service.impl.BrandServiceImpl.saveone(BrandServiceImpl.java:47) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:724) at com.mqt.gulimall.product.service.impl.BrandServiceImpl$$SpringCGLIB$$0.saveone(<generated>) at com.mqt.gulimall.product.GulimallProductApplicationTests.testSaveBrandEntity1(GulimallProductApplicationTests.java:26) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mqt.gulimall.product.dao.BrandDao.insertinto at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:229) at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53) at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:96) at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:36) at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) at jdk.proxy2/jdk.proxy2.$Proxy73.insertinto(Unknown Source) at com.mqt.gulimall.product.service.impl.BrandServiceImpl.saveone(BrandServiceImpl.java:43) ... 11 more Process finished with exit code -1
最新发布
08-17
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值