一、容器概述
ApplicationContext是Spring ioc容器实现的代表,它主要负责实例化、配置和组装Bean。容器通过读取配置元数据获取有关实例化、配置和组装哪些对象的说明。配置元数据可以使用XML、Java注解或Java代码来实现/它允许你处理应用程序的对象与其他对象之间的相互依赖关系。
// 加载spring容器
//ApplicationContext spring的顶层核心接口
// ClassPathXmlApplicationContext 根据项目路径的xml配置来实例化spring容器
// FileSystemXmlApplicationContext 根据磁盘路径的xml配置来实例化spring容器/
/ AnnotationConfigApplicationContext 根据javaconfig 来配置实例化spring容器
// 在容器实例化的时候 就会加载所有的bean// 创建Spring的上下文,加载所有的bean
ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc.xml", "services.xml");
容器的实例化:对象在Spring容器创建完成的时候就已经创建完成了,不是需要用的时候才创建的。
二、bean的概述
2.1 获取bean:
1.2.1 通过类来获取bean eg. User user = ioc.getBean(User.class);
1.2.2 通过bean的名字或id来获取bean。eg. User user = (User)ioc.getBean("User"); 【由于getBean里的参数是字符串形式的,Spring并不知道应该将结果转换成什么类型,所以这里需要进行一下强转】
1.2.3 通过名字+类型获取bean。eg. User user = ioc.getBean("user", User.class);【这种方式与第一种还是有一定区别的如果当该类型不止配了一个bean,如果使用第一种方式的话,就会报错,因为他不知道找到的几个bean里要使用哪一个,这个时候就可以使用name+类型的形式了】
2.2 bean的别名
// 给bean起别名有两种方式:
// 1、 使用name设置别名,该方式还可以设置多个别名,每个别名之间可以使用空格、分号、逗号中任意作为间隔
<bean class="com.engine.beans.User" id="user" name="user2 user3,user4;user5">
<description>用来描述一个Bean是干嘛的</description>
</bean>//2、一个设置bean别名的标签,alias有别名、化名的意思,name是bean的名字,alias是给这个bean取得别名。
<alias name="user" alias="engine"></alias>
三、依赖
3.1 依赖注入
基于setter方法的依赖注入
<!-- 注: name属性对应的是set方法的名字 比如 setId -> name="id" setPassword -> name="password" -->
<bean class="cn.engine.beans.User" id="user">
<property name="id" value="1"></property>
<property name="username" value="弼马温"></property>
<property name="realname" value="孙悟空"></property>
</bean>
基于构造方法的依赖注入
1、基于name属性设置构造函数的参数
2、可以只有value值,忽略name属性和其他属性。
但是,如果省略name属性的话,一定要注意参数顺序,如果顺序与构造方法中的不一致,会造成赋值错误的情况。
当然也是有解决办法的:
2.1 使用name属性
2.2 使用index属性,构造方法中的参数从0开始依次排序,在bean里按照这个顺序注入。
2.3 使用type属性,该类型只对错乱顺序的参数为类型不一致的情况有效,如果两个参数一致,则该属性解决不了。
当然,我们最常用的还是name属性了,其他方式了解即可。
<bean class="cn.engine.beans.User" id="user">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="username" value="齐天大圣"></constructor-arg>
<constructor-arg name="realname" value="孙悟空"></constructor-arg>
</bean>
3.2 依赖和配置的细节
<!--复杂数据类型的依赖注入-->
<bean class="cn.engine.beans.Person" id="person">
<property name="id" value="1"></property>
<!--设置null-->
<property name="name"> <null></null> </property>
<property name="gender" value=""></property>
<!--引用外部Bean-->
<property name="wife" ref="wife"></property>
<!--使用内部bean 依赖注入其他bean-->
<property name="wife">
<bean class="cn.engine.beans.Wife">
<property name="age" value="18"></property>
<property name="name" value="古力娜扎"></property>
</bean>
</property>
<!--list 注入: 如果泛型是基本数据类型<value> 如果泛型是bean <bean>-->
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
<!--map 注入 如果value是基本数据类型 <entry key="1" value="Java"></entry> ,如果value是bean value-ref-->
<property name="course">
<map>
<entry key="1" value="Java"></entry>
<entry key="2" value="数据库"></entry>
</map>
</property>
</bean>
3.3 使用 depends-on 属性
作用:控制加载顺序,当一个bean想让另一个bean在它之前加载的时候,可以设置depends-on,例如:
<bean class="cn.engine.beans.User" id="user" depends-on="book"></bean>
<bean class="cn.engine.beans.Wife" id="book"></bean>
//这样,book就是在user之前加载的
3.4 懒加载bean
作用:让当前的bean不再Spring容器加载的时候就加载,而是在使用的时候才去加载该bean。
lazy-init="true",加上该属性即可。
<bean class="cn.engine.beans.Wife" id="wife" lazy-init="true"></bean>
4、bean的作用域
前两种是bean中比较常用的作用域,后四种需要结合web项目的时候才能使用。
作用域属性:scope
singleton 默认值 同一个id始终只会创建一次bean
prototype 多例(原型) 每一次使用都会创建一个bean
<bean class="cn.engine.beans.Person" id="book" scope="prototype" ></bean>