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;}@Overridepublic String toString() {return "Car [brand=" + brand + ", price=" + price + "]";}
}

情景一

bean-scope.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"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="car" class="com.labou3g.bean.scope.Car"><property name="brand" value="赤兔马"></property><property name="price" value="1000"></property></bean>
</beans>

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);}
}

运行结果

情景二

bean-scope.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"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="car" class="com.labou3g.bean.scope.Car" scope="singleton"><property name="brand" value="赤兔马"></property><property name="price" value="1000"></property></bean>
</beans>

运行结果

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

情景三-prototype

bean-scope.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"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="car" class="com.labou3g.bean.scope.Car" scope="prototype"><property name="brand" value="赤兔马"></property><property name="price" value="1000"></property></bean>
</beans>

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);}
}

运行结果

结果分析

当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



情景一

beans-properties.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"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="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="root"></property><property name="password" value="123456"></property><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/world"></property></bean>
</beans>

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 <clinit>
信息: 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/MConfigat 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.<init>(ClassPathXmlApplicationContext.java:144)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(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/MConfigat 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/MConfigat com.mchange.v2.c3p0.cfg.C3P0Config.findLibraryMultiPropertiesConfig(C3P0Config.java:157)at com.mchange.v2.c3p0.cfg.C3P0Config.<clinit>(C3P0Config.java:143)at com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase.<init>(PoolBackedDataSourceBase.java:54)at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.<init>(AbstractPoolBackedDataSource.java:74)at com.mchange.v2.c3p0.AbstractComboPooledDataSource.<init>(AbstractComboPooledDataSource.java:142)at com.mchange.v2.c3p0.AbstractComboPooledDataSource.<init>(AbstractComboPooledDataSource.java:138)at com.mchange.v2.c3p0.ComboPooledDataSource.<init>(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.MConfigat 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包后,运行成功



情景二

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

db.properties

beans-properies

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><context:property-placeholder location="classpath:db.properties" /><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="${user}"></property><property name="password" value="${password}"></property><property name="driverClass" value="${driverclass}"></property><property name="jdbcUrl" value="${jdbcurl}"></property></bean>
</beans>

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());}
}

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

  1. [Spring5]IOC容器_Bean管理XML方式_外部属性文件

    IOC操作Bean管理(外部属性文件) 1.直接配置数据库信息 (1)配置德鲁伊druid连接池 (2)引入德鲁伊druid连接池依赖jar包 <!--直接配置连接池--><bean ...

  2. Spring_Bean的作用域---和使用外部属性文件

    <!-- 使用 bean的scope属性来配置bean的作用域 singleton:默认值.容器初始时创建bean实例,在整个容器的生命周期内只创建这一个bean单例 prototype:原型的 ...

  3. spring容器bean的作用域 spring容器是否是单例的一些问题

    Spring容器中Bean的作用域 当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleto ...

  4. IOC操作Bean管理XML方式(外部属性文件)

    目录 IOC操作Bean管理XML方式(外部属性文件) 前情引入: 实验演示: 1.直接配置数据库信息 (1)配置德鲁伊连接池 (2)引入德鲁伊连接池jar包 (3)创建一个bean6.xml配置文件 ...

  5. 8.Spring学习笔记_使用外部属性文件(by尚硅谷_佟刚)

    使用外部属性文件 在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离 S ...

  6. Spring【Bean的作用域与生命周期】

    Spring[Bean的作用域与生命周期]

  7. 实验12:引用外部属性文件★(spring管理连接池);

    实验12:引用外部属性文件★ dbconfig.properties 文件

  8. Spring-使用外部属性文件01

    导读 概述 PropertyPlaceholderConfigurer属性文件 实例 使用PropertyPlaceholderConfigurer属性文件 PropertyPlacerholderC ...

  9. Spring-Bean配置-使用外部属性文件(转)

    Spring-Bean配置-使用外部属性文件 所以可以通过@value注解获取配置文件的key-value,生成一个配置文件bean.用以在代码中直接使用bean的方式. •在配置文件里配置Bean时 ...

  10. Spring使用外部属性文件

    一.在 Spring Config 文件中配置 Bean 时,有时候需要在 Bean 的配置里添加 系统部署的细节信息, 如文件路径,数据源配置信息.而这些部署细节实际上需要在配置文件外部来定义. 二 ...

最新文章

  1. webpack url-loader limit 转换部分资源为base64格式 其余不转换
  2. Python Inotify 监视LINUX文件系统事件
  3. C#中的继承与多态还有接口
  4. 每日英语:Apple Unveils New iPads
  5. Java 7:使用NIO.2进行文件过滤-第1部分
  6. qq浏览器如何进入私密 qq浏览器怎样进入私密
  7. hadoop2.4.2集群搭建及hive与mysql集成文档记录
  8. python两个字符串数据可以复制吗_无论如何,是否要将Python pandas数据框中的单个数据中的数据复制到字符串或列表中以进行进一步处理?...
  9. 【转】linux下安装ssh服务器端及ssh的安全配置
  10. php 检测键名,【PHP教学|带你学习用PHP检测键名是否位于数组中,方法已经告诉你了,如果你想学就赶紧】- 环球网校...
  11. 20200225:最小路径和(leetcode64)
  12. js多个物体运动问题2
  13. python中的排序方法都有哪些_有没有办法在python中对列表进行排序,直到找到第一个排序的k元素?...
  14. Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论
  15. 阿里云SDK实现短信发送
  16. matlab矩阵倒数,求解:用MATLAB生成空间距离倒数矩阵后面板分析出现下面的几句警告...
  17. kappa一致性检验教程_Kappa一致性分析
  18. 数据可视化(全彩)(十二五国家重点图书出版规划项目)
  19. 迅捷OCR文字识别软件的功能介绍
  20. 全网最详细的Linux下载安装教程,Windows11 Windows10安装Linux详细教程

热门文章

  1. ubuntu 22.04 安装网易云音乐
  2. 社交网络分析——信息传播模型(附带三个模型的python实现)
  3. 算法导论答案网Solutions to Introduction to Algorithms Third Edition_开源免费完整
  4. GPS里集成的指南针一般叫做外置罗盘是1#,飞控里面的指南针叫内置罗盘是2#
  5. 常用の工具(update 22.11.11)
  6. 一键修改分辨率bat_设置分辨率的批处理 | 学步园
  7. mmdetection源码笔记(二):创建网络模型之registry.py和builder.py解读(上)
  8. 后渗透篇:清理windows入侵痕迹总结【详细】
  9. foobar2000播放器简单配置 [李园7舍_404]
  10. DataParallel使用