Java Reflect(factory model)工厂模式的使用

本文对比分析了在Java中使用反射与不使用反射实现工厂模式的优缺点。通过具体实例展示了如何利用反射简化代码扩展性,并讨论了其可能带来的性能影响。

新年慢慢靠近,也许这一年的收获寥寥不值一提,但是相信自己,一切都会好起来。fighting,You must believe yourself.

Java Reflect model :

看看下面的实例,相信比较之下,会有很好的启发:

不使用反射来进行工厂模式:

创建父类
1:创建一个关于电脑工厂父类(BaseComputer):
2:该父类拥有所有基本的属性
3:创建相应的set、get方法
public class BaseComputer {

    private int price;
    private String CPUStyle;
    private String goodsName;
    private String CORE;

   ···//相应的get/set方法(略)
}
创建对应的子类(lenovo、mac、dell、hp)

注:一下数据属于随便乱写,不存在任何参考意义

//DellComputer

public class DellComputer extends BaseComputer {

public DellComputer() {

    setPrice(5900);
    setCORE("intel i7");
    setCPUStyle("思科处理器");
    setGoodsName("戴尔 DELL");

}

//对电脑的描述
public String Describle(){

    return "Dell 国际品牌";
}
}

//HPComputer

public class HpComputer extends BaseComputer {

public HpComputer() {

    setPrice(4900);
    setCORE("intel i5");
    setCPUStyle("思科处理器");
    setGoodsName("惠普 HP");

}

//对电脑的描述
public String Describle(){

    return "HP 国际品牌";

    }
}
创建工厂类
public class ComputerFactory {

public static BaseComputer newInstance(String className) {

    if("Dell".equals(className)){
        return new DellComputer();
    }else if("Hp".equals(className)){
        return new HpComputer();
    }
    return null;
}
}
在java方法中进行测试
 @Test
public void main(){

    HpComputer hp = (HpComputer) ComputerFactory.newInstance("Hp");

    System.out.println(hp.getCORE()+"\n"+
            hp.getGoodsName()+"\n"+
            hp.getCPUStyle()+"\n"+
            hp.getPrice()+"\n");

    System.out.println(hp.Describle());

}
结果显示:

这里写图片描述

此时:我们也可以拿到想要的数据,调用不同的关于Computer的时候,只需要传入相应的类的名称就好了。

注:在java中的向下转型和向上转型很敏感。所以在转型的过程中,需要注意,避免ANR异常。

问题:
1:如果我们的业务中需要加入 lenovo,mac或者其他品牌的电脑。
2:工厂中的项目增多,我们需要加入相应的类,还需要修改我们的工厂类。
3:我们在进行调用的时候还需要知道工程模式中判断的字段,很麻烦。

使用反射来处理工厂模式

整体来说,变化并不是很大,只是在我们的工厂类中进行修改

public class ComputerFactory {

public static BaseComputer newInstance(Class clz) {
    BaseComputer baseComputer = null;
    try {
        //异常处理
        baseComputer = (BaseComputer) clz.newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return baseComputer;
}
}

现在开始进行调用
public void main(){

    DellComputer dell = (DellComputer) ComputerFactory.newInstance(DellComputer.class);

    System.out.println(dell.getCORE()+"\n"+
            dell.getGoodsName()+"\n"+
            dell.getCPUStyle()+"\n"+
            dell.getPrice()+"\n");

    System.out.println(dell.Describle());

}

处理结果如下:

这里写图片描述

同样我们可以获取内容。实现功能。

之前有说过反射,会消耗内存,所以在能不进行使用的尽量不要使用。但是在软件架构的基础上需要频繁的扩展,不断的修改的时候,使用反射会大大节省开发成本,而且易于接受。

Debug测试,进行更深的了解。解释为什么从父类BaseComputer 强转到子类中,不会出现异常。

子类继承父类,父类转到子类中理所当然,当然不会异常。(鄙人之前的理解)

但是事实上不是这样的。

先看看下面这部分代码:
这里写图片描述

看看编译通过,但是执行中
这里写图片描述

java.lang.ClassCastException: 类转化异常ltd.xiamenwelivetechnologyco.mediaapplication.laptop.DellComputer cannot be cast to ltd.xiamenwelivetechnologyco.mediaapplication.laptop.HpComputer

at ltd.xiamenwelivetechnologyco.mediaapplication.ExampleUnitTest.main(ExampleUnitTest.java:28)

这个便无法进行转化。原因:

Debug如下:我们在ComputerFactory类中打上断点

这里写图片描述

因为我们传入的Class 是 DellComputer

这里写图片描述

所以实例化的也是DellComputer,对应baseComputer中的对象就是DellComputer

那么将父类强转为DellComouter就会正常,但是,当你转化为其他的类自然就会异常。

所以合理的强转是正常的。这个是需要注意的。

OK,这一部分问题整理到这了。待续。。。

java.sql.SQLException: unkow jdbc driver : ${vevor.jdbc.url} at com.alibaba.druid.util.JdbcUtils.getDriverClassName(JdbcUtils.java:452) at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:636) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1694) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.vevor.search.BaseTest.setUp(BaseTest.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.junit.runner.JUnitCore.run(JUnitCore.java:160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) 2025-09-25 10:18:35.028 [main] WARN o.s.c.s.ClassPathXmlApplicationContext - Exception encountered during context initialization - cancelling refresh attempt org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticConfigFactory': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private volatile com.vevor.search.datasource.mapper.SearchIndexSettingMapper com.vevor.search.config.ElasticConfigFactory.searchIndexSettingMapper; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'searchIndexSettingMapper' defined in file [D:\project\basic-soa-search\target\classes\com\vevor\search\datasource\mapper\SearchIndexSettingMapper.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [mybatis/config/dataSource.xml]: Cannot resolve reference to bean 'vevorDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vevorDataSource' defined in class path resource [mybatis/config/dataSource.xml]: Invocation of init method failed; nested exception is java.sql.SQLException: unkow jdbc driver : ${vevor.jdbc.url} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.vevor.search.BaseTest.setUp(BaseTest.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.junit.runner.JUnitCore.run(JUnitCore.java:160) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private volatile com.vevor.search.datasource.mapper.SearchIndexSettingMapper com.vevor.search.config.ElasticConfigFactory.searchIndexSettingMapper; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'searchIndexSettingMapper' defined in file [D:\project\basic-soa-search\target\classes\com\vevor\search\datasource\mapper\SearchIndexSettingMapper.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [mybatis/config/dataSource.xml]: Cannot resolve reference to bean 'vevorDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vevorDataSource' defined in class path resource [mybatis/config/dataSource.xml]: Invocation of init method failed; nested exception is java.sql.SQLException: unkow jdbc driver : ${vevor.jdbc.url} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 38 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'searchIndexSettingMapper' defined in file [D:\project\basic-soa-search\target\classes\com\vevor\search\datasource\mapper\SearchIndexSettingMapper.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [mybatis/config/dataSource.xml]: Cannot resolve reference to bean 'vevorDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vevorDataSource' defined in class path resource [mybatis/config/dataSource.xml]: Invocation of init method failed; nested exception is java.sql.SQLException: unkow jdbc driver : ${vevor.jdbc.url} at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) ... 40 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [mybatis/config/dataSource.xml]: Cannot resolve reference to bean 'vevorDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vevorDataSource' defined in class path resource [mybatis/config/dataSource.xml]: Invocation of init method failed; nested exception is java.sql.SQLException: unkow jdbc driver : ${vevor.jdbc.url} at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) ... 53 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vevorDataSource' defined in class path resource [mybatis/config/dataSource.xml]: Invocation of init method failed; nested exception is java.sql.SQLException: unkow jdbc driver : ${vevor.jdbc.url} at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) ... 63 common frames omitted Caused by: java.sql.SQLException: unkow jdbc driver : ${vevor.jdbc.url} at com.alibaba.druid.util.JdbcUtils.getDriverClassName(JdbcUtils.java:452) at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:636) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1694) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562) ... 70 common frames omitted
最新发布
09-26
Java 项目中出现 `java.sql.SQLException: unkow jdbc driver : ${vevor.jdbc.url}` 报错,通常与 JDBC 驱动的加载和使用相关,可能的原因如下: ### 驱动未加载 在使用 JDBC 连接数据库时,需要先加载相应的数据库驱动。若没有显式地加载驱动,就会出现找不到合适驱动的错误。例如,在使用 MySQL 数据库时,需要通过 `Class.forName("com.mysql.jdbc.Driver")` 来加载驱动。在某些项目中,即使不手动加载驱动也能正常工作,但在部分环境下,仍需要显式加载,否则会引发此错误[^1]。 ### 驱动依赖缺失 项目的依赖配置里没有包含所需的 JDBC 驱动。例如,使用 Maven 或 Gradle 管理项目依赖时,没有在 `pom.xml` 或 `build.gradle` 文件中添加相应的数据库驱动依赖。以 MySQL 为例,在 `pom.xml` 中需添加如下依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> ``` ### 配置文件问题 报错信息中的 `${vevor.jdbc.url}` 是一个占位符,这表明项目可能使用了配置文件(如 `.properties` 或 `.xml` 文件)来管理数据库连接信息,且在运行时没有正确替换这些占位符。可能是配置文件加载失败,或者配置文件中的占位符没有被正确解析。例如,在 Spring 项目中,使用 `PropertySourcesPlaceholderConfigurer` 来解析占位符,若配置不正确,就会导致占位符无法替换,从而出现此错误。 ### 驱动版本不兼容 使用的 JDBC 驱动版本与数据库版本不兼容。不同版本的数据库可能需要特定版本的 JDBC 驱动,若版本不匹配,可能会导致驱动无法正常工作。例如,MySQL 8.0 及以上版本需要使用 `mysql-connector-java` 8.x 版本的驱动,使用旧版本的驱动就可能出现找不到合适驱动的错误。 ### 类路径问题 即使添加了驱动依赖,若驱动的 JAR 文件没有正确添加到项目的类路径中,也会导致无法找到驱动。在使用 IDE 开发时,IDE 通常会自动处理类路径问题,但在手动部署项目时,需要确保 JAR 文件被正确放置在类路径下。 ### 代码示例 以下是一个简单的 JDBC 连接示例,展示了如何加载驱动和获取数据库连接: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class JdbcExample { public static void main(String[] args) { try { // 加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 获取数据库连接 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password"); System.out.println("连接成功"); } catch (ClassNotFoundException e) { System.out.println("找不到驱动类: " + e.getMessage()); } catch (SQLException e) { System.out.println("数据库连接错误: " + e.getMessage()); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值