Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载

Bean的作用域

在IOC里创建对象的时候,同一个类,只会创建一个实例对象,多次获取同一个类的对象时,实际上获取的都是同一个对象,
两个对象的地址是相同的

car.java

package com.labou3g.bean.scope;
public class Car {
	private String brand;
	private double price;
	public Car() {
		System.out.println("我是构造方法....");
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car [brand=" + brand + ", price=" + price + "]";
	}	
}

情景一

bean-scope.xml



	
		
		
	

Test.java

public class Test {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml");
		
		Car car1 = (Car)ctx.getBean("car");
		Car car2 = (Car)ctx.getBean("car");
		System.out.println(car1 == car2);
	}
}

运行结果

Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载_第1张图片

情景二

bean-scope.xml




	
		
		
	

运行结果

和情景一结果一直,因为scope的默认值就是singleton

情景三-prototype

bean-scope.xml




	
		
		
	

Test.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
		
		Car car1 = (Car)ctx.getBean("car");
		Car car2 = (Car)ctx.getBean("car");
		System.out.println(car1 == car2);
	}
}

运行结果

Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载_第2张图片

结果分析

当Scope=singleton的时候,car的实例对象在	
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
就已经创建好,之后再获取,就是获取这个已经创建好的对象
当Scope=prototype的时候,car的实例对象在	
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
的时候,并不会创建对象,而是在Car car1 = (Car)ctx.getBean("car");的时候,才创建的对象,
每获取一次,就会创建一个对象。

使用外部属性文件

这里使用外部属性文件配置数据库连接,需要再导入两个jar包分别为
mysql-connector-java-5.1.47-bin.jar和c3p0jar包
mysql-connector jar包不用多说,里面有很多连接数据库需要用到的类,
主要介绍一下C3p0jar包的用处
1.c3p0是什么?
c3p0是一个库。它扩展了传统的jdbc数据库连接池,并且支持JDBC3规范和JDBC2的标准扩展。
2.为什么使用c3p0?
首先,c3p0是一种jdbc数据库连接池。那么为什么使用数据库连接池呢?
因为数据库连接是一种关键的、有限的、昂贵的资源。传统的模式(如传统的java web项目中,servlet的beans中建立数据库连接),
每次连接都需要验证用户,消耗了大量的时间和资源。而数据库连接池在系统初始化的时候,
将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,
而是从连接池中取出一个已经建立的空闲连接对象。使用完毕后,用户不关闭连接,
而是将数据库连接对象放回连接池中。数据库连接池管理数据连接的建立、断开,
同时监视数据库连接数量和使用情况。使用数据库连接池会显著提高整个应用程序的伸缩性(大大提高了连接数量)
和健壮性(能够应对大量用户频繁连接数据库,减少系统资源的消耗),提高应用程序的性能指标。
3.c3p0最新jar包下载地址
https://sourceforge.net/projects/c3p0/files/latest/download?source=files

在这里插入图片描述
Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载_第3张图片
Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载_第4张图片

情景一

beans-properties.xml



	
	
		
		
		
		
	

Test.java

package com.lanou3g.spring.dataSource;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Test {
	public static void main(String[] args) throws SQLException {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-properties.xml");
		
		DataSource dataSource = (DataSource)ctx.getBean("dataSource");
		System.out.println(dataSource.getConnection());
	}
}

运行结果

一月 01, 2019 7:26:27 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@63c12fb0: startup date [Tue Jan 01 19:26:27 CST 2019]; root of context hierarchy
一月 01, 2019 7:26:27 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans-properties.xml]
一月 01, 2019 7:26:28 下午 com.mchange.v2.log.MLog 
信息: MLog clients using java 1.4+ standard logging.
一月 01, 2019 7:26:28 下午 org.springframework.context.support.ClassPathXmlApplicationContext refresh
警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [beans-properties.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mchange.v2.c3p0.ComboPooledDataSource]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: com/mchange/v2/cfg/MConfig
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [beans-properties.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mchange.v2.c3p0.ComboPooledDataSource]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: com/mchange/v2/cfg/MConfig
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1232)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1131)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:541)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
	at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:144)
	at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:85)
	at com.lanou3g.spring.dataSource.Test.main(Test.java:13)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mchange.v2.c3p0.ComboPooledDataSource]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: com/mchange/v2/cfg/MConfig
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:182)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1224)
	... 13 more
Caused by: java.lang.NoClassDefFoundError: com/mchange/v2/cfg/MConfig
	at com.mchange.v2.c3p0.cfg.C3P0Config.findLibraryMultiPropertiesConfig(C3P0Config.java:157)
	at com.mchange.v2.c3p0.cfg.C3P0Config.(C3P0Config.java:143)
	at com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase.(PoolBackedDataSourceBase.java:54)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.(AbstractPoolBackedDataSource.java:74)
	at com.mchange.v2.c3p0.AbstractComboPooledDataSource.(AbstractComboPooledDataSource.java:142)
	at com.mchange.v2.c3p0.AbstractComboPooledDataSource.(AbstractComboPooledDataSource.java:138)
	at com.mchange.v2.c3p0.ComboPooledDataSource.(ComboPooledDataSource.java:47)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:170)
	... 15 more
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.cfg.MConfig
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 27 more

结果分析

当报这个异常时,我不断核对配置文件与测试类的内容,没有发现错误,然后有在Navicat for Mysql中
测试一下用户名和密码,发现输入的用户名和密码也都正确。之后百度错误,查询解决办法。
导入mchange-commons-java-0.2.11.jar包,版本号可能不一样。这是C3P0连接池的辅助包,
没有这个包系统启动的时候会报classnotfoundexception,这是c3p0-0.9.2版本后分离出来的包,
0.9.1的时候还是一个包就搞定的。给项目添加这个包之后问题就解决了。
1.我一开始没有导入这个mchange-commons-java-0.2.11.jar包,所以报了上面的错误
2.当我知道要导入这个包时,我导入的是mchange-commons-java-0.2.3.4.jar包,仍然报了上面的错误
3.我再次查找原因时,发现原来这个mchange-commons-java-0.2.3.4.jar包的版本比较高,与c3p0-0.9.5.2.jar包不匹配
4.此时需要使用低版本的mchange-commons包,百度发现mchange-commons-java-0.2.11.jar比较合适
5.当我在csdn寻找下载这个包时,发现都要积分,而本人办理vip充积分感觉非常浪费,不过最终还是被我找到了,
所以这里提供免费获取的方法,mvn官网里面有各种jar包都可以下载,不过都是英文,操作起来也不那么容易
https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring/4.3.2.RELEASE
使用这个链接,在里面可以直接搜索自己所需要的jar包,如下图所示,鼠标放在蓝色方框内,
可以看到下载按钮,直接下载下来即可,或者假加群16933763,群文件直接下载也行
6.重新导入mchange-commons-java-0.2.11.jar包后,运行成功

Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载_第5张图片
Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载_第6张图片
在这里插入图片描述

情景二

使用外部属性文件,此时需要建立新文件file,在新文件中写入数据库配置的详细信息

db.properties

Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载_第7张图片

beans-properies

Spring之Bean的作用域、使用外部属性文件、mchange-commons-java-0.2.11.jar下载_第8张图片



	
	
	
		
		
		
		
	

Test.java

package com.lanou3g.spring.dataSource;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
	public static void main(String[] args) throws SQLException {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-properties.xml");		
		DataSource dataSource = (DataSource)ctx.getBean("dataSource");
		System.out.println(dataSource.getConnection());
	}
}

在这里插入图片描述

你可能感兴趣的:(乐在其中)