IOC容器和Bean的配置实例
实验1:
<!--实验1:通过IOC容器创建对象,并为属性赋值 -->
	<!-- 需要由IOC容器创建对象的全类名 -->
	<!-- 为了便于从IOC容器中获取book对象,声明一个一个唯一的id值 -->
	<bean id="book01" class="com.neuedu.spring.bean.Book">
		<property name="bookId" value="2001"></property>
		<property name="bookName" value="三国演义"></property>
		<property name="author" value="罗贯中"></property>
		<property name="price" value="22.5"></property>
	</bean>
@Test
		public void test01() {
			//1.创建IOC容器自身的对象
			//指定配置文件以类路径为基准的配置文件名
			ApplicationContext ioc= new ClassPathXmlApplicationContext("bean.xml");
			//2.从IOC容器中获取指定的对象
			Object bean = ioc.getBean("book01");
			System.out.println(bean);
		}
注意:
	①IOC容器本身对象创建时,会将配置文件中配置好的bean先创建出来
	②默认是单实例的,只创建bean的一个对象
	③如果设置bean的scope属性为prototype,那么创建bean的对象就是多实例的,在获取的时候创建,每次获取对象都会创建新的
	④.从IOC容器中获取对象
		①根据bean的id获取
		②根据bean的类型获取:要求容器中指定类型的bean是唯一的
实验15:配置通过静态工厂方法创建的bean[通过静态方法提供实例对象,工厂类本身不需要实例化!]
	<bean id="staticFactory" class="com.neuedu.spring.bean.StaticFactory" factory-method="getBook">
		<constructor-arg value="book01"></constructor-arg>
	</bean>
实验16:配置通过实例工厂方法创建的bean[通过实例方法提供实例对象,工厂类本身需要先创建对象!]
	<bean id="instanceFactory" class="com.neuedu.spring.bean.InstanceFactory"></bean>
	<bean id="bookFromInstanceFactory" factory-bean="instanceFactory" factory-method="getBook">
		<constructor-arg value="book02"></constructor-arg>
	</bean>
实验17:配置FactoryBean★
	public class MyFactoryBean implements FactoryBean<Book> {
@Override
		public Book getObject() throws Exception {
			return new Book(22, "无字天书", "好啊", 22.5);
		}
@Override
		public Class<?> getObjectType() {
			return Book.class;
		}
@Override
		public boolean isSingleton() {
			return false;
		}
}
实验22[补充]:测试bean的后置处理器
	①在bean的初始化方法调用前后执行操作的专门的对象
	②自定义后置处理器实现该接口:org.springframework.beans.factory.config.BeanPostProcessor
	③在springmvc中配置一下该bean对象.
	<bean class="com.neuedu.spring.bean.Book" init-method="init"></bean>
	<bean id="myBeanPostProcessor" class="com.neuedu.spring.bean.MyBeanPostProcessor"></bean>
数据库连接池:
	6) 数据库连接池
		> 数据库连接池就是存放数据库连接(Connection)的集合
		> 我们获取一个数据库连接是一个相对很麻烦的过程,
			如果我们获取一个数据库连接,使用一次以后就给它关闭了
				下一次再去使用的时候就要重新创建一个新的数据库连接。
		> 所以我们提出了一个数据库连接池的概念,数据库连接池放的都是数据库连接(Connection)
			我们在去使用数据库连接时候,不用再去重新创建数据库连接,而是直接从池中获取,
				使用完的数据库连接,也不是直接销毁,而是要放回到连接池。
		> 数据库连接池的常见的属性:
? 初始连接数量:数据连接池创建以后,保存数据库连接的数量
? 最小空闲连接数:数据库连接池最少得未使用的数据库连接的数量
最大空闲连接数:数据库连接池最大闲置连接数,当闲置连接数满了以后,将不会有其他连接进入池
? 每次增加连接数:当数据库连接都被占用以后,一次性增加的数据库连接的个数
? 最大连接数:数据库连接池的最大容量,当最大连接数饱和了,则不再创建新的数据库连接
? 最大等待时间:当数据库连接池饱和以后,等待获取数据库连接的时间
> 常见的数据库连接池
			- 所有的数据库连接池都需要实现DataSource,当使用数据库连接池是,我们便不再需要使用DriverManger获取数据库连接
				而是使用DataSource。
				 - Connection getConnection()
					- 从数据库连接池中获取数据库连接对象
1.DBCP
				- DBCP是Apache出品的一款数据库连接
				- DBCP依赖于commons-pool
				- 使用DBCP需要导入两个jar包:
					commons-dbcp-1.4.jar
					commons-pool-1.5.5.jar
				- 当我们通过数据库连接池获取数据库连接以后,我们所获取到数据库连接已经不是我们熟悉的那个Connection
					数据库连接池对Connection对象进行了包装,它修改Connection的close()方法,
						再去调用close()数据库连接将不会真的关闭,而是要放回到数据库连接池中,供其他线程使用。
				- 核心类:
					BasicDataSourceFactory
2.C3P0(重点)
				- C3P0使用的是XML作为配置文件
				- 使用c3p0需要导入一个jar包:
					c3p0-0.9.1.2.jar
				- 导入c3p0的配置文件:
					1.配置文件的名字:c3p0-cofig.xml
					2.配置文件要求放到类路径下(src)
				- 核心类:	
					ComboPooledDataSource
				- 注意:
					DataSource就相当于池子,我们的数据库连接都是从DataSource中获取的,
						如果程序中有多个DataSource的实例,那么我们说你还不如不用数据库连接池。
					所以我们的DataSource在项目中应该只有一个实例。
实验23:引用外部属性文件★
	jdbc.properties文件:
		jdbc.user=root
		jdbc.passowrd=123456
		jdbc.url=jdbc:mysql://localhost:3306/test
		jdbc.driver=com.mysql.jdbc.Driver
<context:property-placeholder location="classpath:jdbc.properties"/>
	1.在目标属性上加@Value注解
		@Value("${jdbc.user}")
		private String username;
	2.	
		<!-- 根据外部属性文件中的信息配置数据源 -->
		<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
			<property name="user" value="${jdbc.user}"></property>
			<property name="password" value="${jdbc.passowrd}"></property>
			<property name="jdbcUrl" value="${jdbc.url}"></property>
			<property name="driverClass" value="${jdbc.driver}"></property>
		</bean>
ComboPooledDataSource bean = ioc.getBean(ComboPooledDataSource.class);
		Connection connection = bean.getConnection();
		System.out.println(connection);
		Statement st = connection.createStatement();
		ResultSet rs = st.executeQuery("select * from stu");
		while(rs.next()){
			String string = rs.getString("name");
			String string2 = rs.getString("school");
			System.out.println(string+"==="+string2);
		}
实验24:基于XML的属性装配
	①手动装配
		<!-- 属性的装配:手动装配 -->
		<bean id="userService" class="com.neuedu.spring.bean.UserService"></bean>
		<bean  id="userAction" class="com.neuedu.spring.bean.UserAction">
			<property name="userService" ref="userService"></property>
		</bean>
②自动装配
		<!-- 1.按类型装配:byType -->
			<!-- 首先检测当前bean中需要装配的属性的类型 -->
			<!-- 然后在IOC容器中查找匹配这个类型的bean -->
			<!-- 如果类型匹配的bean是唯一的,那么就将这个匹配的bean注入到userAction中 -->
<bean id="userService" class="com.neuedu.spring.bean.UserService"></bean>
				<bean  id="userAction" autowire="byType" class="com.neuedu.spring.bean.UserAction"></bean>
<!-- 2.按bean的id值装配:byName -->
			<!-- 首先检测当前bean中需要装配的属性的属性名,属性名是将setXxx()方法去掉set,首字母小写得到的 -->
			<!-- 然后根据属性名作为id的值,在IOC容器中查找对应的bean -->
			<!-- 如果能够找到,则将找到bean注入进去 -->
6。SpEL简介【见WORLD文档---了解】
	Spring Expression Language,Spring表达式语言,简称SpEL。支持运行时查询并可以操作对象图。
	和JSP页面上的EL表达式、Struts2中用到的OGNL表达式一样,SpEL根据JavaBean风格的getXxx()、setXxx()方法定义的属性访问对象图,完全符合我们熟悉的操作习惯。
6.1	基本语法
		SpEL使用#{…}作为定界符,所有在大框号中的字符都将被认为是SpEL表达式。
6.2	使用字面量
		●整数:<property name="count" value="#{5}"/>
		●小数:<property name="frequency" value="#{89.7}"/>
		●科学计数法:<property name="capacity" value="#{1e4}"/>
		●String类型的字面量可以使用单引号或者双引号作为字符串的定界符号
			<property name=“name” value="#{'Chuck'}"/>
			<property name='name' value='#{"Chuck"}'/>
		●Boolean:<property name="enabled" value="#{false}"/>
8.使用注解配置bean
	①声明bean的注解
		@Component 将当前类声明为IOC容器中的一个普通的组件
		@Controller 将当前类声明为IOC容器中的一个控制器组件
		@Service 将当前类声明为IOC容器中的业务逻辑层组件
		@Repository 将当前类声明为IOC容器中的一个持久化层组件
	Spring根据上述注解其实并不能分辨当前类是否真的是一个控制器或Dao,即使标记的类和注解不对应也没有语法错误。但在实际工作中,肯定要将专门的注解标记在对应的类上面。
②使用基于注解的bean的配置,需要额外导入一个jar包:spring-aop-4.0.0.RELEASE.jar
	③需要设置自动扫描的包
		< context:component-scan base-package ="com.neuedu.ioc.bean"/>
④使用注解后,默认按照类名首字母小写作为id的值,也可以使用value属性指定id,value属性名也可以省略注解		
		注解                                           id值
@Component                                    commonComponent
		public class CommonComponent {
		}
@Controller(value="neueduBookAction" )         neueduBookAction
		public class BookAction {
}
@Service("happyService" )                     happyService
		public class BookService {
}
实验33:使用context:exclude-filter指定扫描包时不包含的类
< context:component-scan base-package ="com.neuedu.ioc.bean"/> 
	[1]base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。
	[2]当需要扫描多个包时可以使用逗号分隔,
	[3]如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:
		<context:component-scan base-package="com.neuedu.component" resource-pattern="autowire/*.class"/>
	[4]包含与排除
		●<context:include-filter>子节点表示要包含的目标类
			注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。
			即:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则
			指定的组件了。
		●<context:exclude-filter>子节点表示要排除在外的目标类
		●component-scan下可以拥有若干个include-filter和exclude-filter子节
⑤使用注解进行自动装配:@Autowired注解[好处就是:连get、set方法都不用写!]
	[1]首先检测标记了@Autowired注解的属性的类型
	[2]根据类型进行装配
	[3]如果指定类型的bean不止一个,那么根据需要被装配的属性的属性名做id的值,查找bean
	[4]如果根据id值还是没有找到bean,可以使用@Qualifier注解手动指定要装配的bean的id.
IOC容器和Bean的配置实例的更多相关文章
- IOC容器和Bean的配置
		IOC容器和Bean的配置 1 IOC和DI ①IOC(Inversion of Control):反转控制. 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取 ... 
- [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器
		本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ... 
- IOC容器中bean的生命周期
		一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ... 
- spring IOC容器实例化Bean的方式与RequestContextListener应用
		spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ... 
- Spring IOC容器中Bean的生命周期
		1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ... 
- spring-framework-中文文档一:IoC容器、介绍Spring IoC容器和bean
		5. IoC容器 5.1介绍Spring IoC容器和bean 5.2容器概述 本章介绍Spring Framework实现控制反转(IoC)[1]原理.IoC也被称为依赖注入(DI).它是一个过程, ... 
- Spring IOC容器创建bean过程浅析
		1. 背景 Spring框架本身非常庞大,源码阅读可以从Spring IOC容器的实现开始一点点了解.然而即便是IOC容器,代码仍然是非常多,短时间内全部精读完并不现实 本文分析比较浅,而完整的IOC ... 
- Spring学习-- IOC 容器中 bean 的生命周期
		Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ... 
- Spring核心技术(一)——IoC容器和Bean简介
		IoC容器和Bean简介 这章包括了Spring框架对于IoC规则的实现.Ioc也同DI(依赖注入).而对象是通过构造函数,工厂方法,或者一些Set方法来定义对象之间的依赖的.容器在创建这些Bean对 ... 
随机推荐
- openstack安装newton版本创建虚拟机(五)
			一.创建网络: 1.在控制节点上创建一个单一扁平网络(名字:flat),网络类型为flat,网络适共享的(share),网络提供者:physnet1,它是和eth0关联起来的 [root@linux- ... 
- Tensorflow版Faster RCNN源码解析(TFFRCNN) (3)推断(测试)过程使用RPN时代码运行流程
			本blog为github上CharlesShang/TFFRCNN版源码解析系列代码笔记第三篇 推断(测试)过程不使用RPN时代码运行流程 作者:Jiang Wu 原文见:https://hom ... 
- Typora--Draw Diagrams With Markdown
			Typora Typora supports some Markdown extension for diagrams, you could enable this feature from pref ... 
- linux mount命令详解(iso文件挂载)
			挂载命令: mount [-t vfstype] [-o options] device dir mount 是挂载命令 -t + 类型 -o + 属性 device iso的文件 dir 挂 ... 
- SQL Server 2017的Linked Server配置触发的bug“Exception Code    = c0000005 EXCEPTION_ACCESS_VIOLATION”
			SQL Server 2017的Linked Server配置触发的bug"Exception Code = c0000005 EXCEPTION_ACCESS_VIOLATION&q ... 
- less的使用总结
			简单执行less 一.使用npm全局安装less: npm install -g less 二.创建less文件 三.执行命令将less文件转换成css文件 lessc less/style.less ... 
- 后台登录验证(Tokens/JSON Web Tokens(JWT) 的认证机制)
			sessionid不支持跨域,浏览器也不能禁止cookie(禁止以后sessionid还有什么用) 单点登录问题,即时SessionID一样,也无法跨域获取到数据 占坑 
- uva10129 PlayOnWords(并查集,欧拉回路)
			判断无向图是否存在欧拉回路,就是看度数为奇数的点有多少个,如果有两个,那么以那分别两个点为起点和终点,可以构造出一条欧拉回路,如果没有,就任意来,否则,欧拉回路不存在. 首先用并查集判断连通,然后统计 ... 
- hd - MFM/IDE 硬盘设备
			描述 DESCRIPTION hd* 开头的设备是以裸模式(raw mode)访问MFM/IDE类型硬盘的块设备. 第一个IDE驱动控制器上的主盘(主设备号3)是 hda ;从盘是 hdb. 第二个I ... 
- 第010课_掌握ARM芯片时钟体系
			from:第010课_掌握ARM芯片时钟体系 第001节_S3C2440时钟体系结构 S3C2440是System On Chip(SOC),在芯片省不仅仅有CPU,还有一堆外设. 至于有哪些外设,可 ... 
