IOC和DI
IOC:控制反转
对象的创建权交给spring
DI:依赖注入 把类的属性注入
面向对象时想利用别的类的属性实现的方法:
不能面向接口编程,
spring
只需加入property标签
编写测试
2.Spring 工厂
BeanFactory :老版本的工厂类
ApplicationContext :新版本的工厂类
BeanFactory :老版本的工厂类
BeanFactory:调用getBean的时候,才会生成类的实例。
ApplicationContext :新版本的工厂类
ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。
ApplicationContext有两个实现类
ClassPathXmlApplicationContext :加载类路径下的配置文件
FileSystemXmlApplicationContext :加载文件系统下的配置文件
Spring的配置
(1)Schema的配置
、
步骤1:找到preferences
3.Bean的相关的配置
<bean>标签的id和name的配置
id :使用了约束中的唯一约束。里面不能出现特殊字符的。
name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
spring在加载配置的时候不知道加载哪个bean就出错了
Spring和Struts1框架整合的时候
<bean name=”/user” class=””/>
4.Bean的生命周期的配置(了解)
init-method :Bean被初始化的时候执行的方法
destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
与配置的方法名必须相同
工厂关闭 单例模式创建实例
创建销毁方法(配置中也要写)
5.Bean的作用范围的配置(重点)
<scope> :Bean的作用范围
singleton :默认的,Spring会采用单例模式创建这个对象。
无论多少程序调用,只会new一次,每次用的都是同一个对象实例
prototype :多例模式。(Struts2和Spring整合一定会用到)
用一次new一次
Action是多例的,Action交给spring管理必须配置成多例模式
否则spring在创建action实例的时候,值栈就会出错(有个action实例就会有个值栈)
很多请求用一个值栈会出问题 这边保存的数据保存到值栈,另一个修改的也保存到该值栈,最后想取出来的值都是乱的
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。(request域)
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
例如百度,当我们登录了百度之后,其旗下的应用可以直接登录如百度地图,在我们登录了百度之后,我们就可以直接登录其百度地图不用做新的认证
单例:
多例:
这里并没有被销毁。因为内存中 有多高对象,不知道销毁哪个。
6.Spring的Bean的实例化方式
Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式:
(1)无参构造
(2)静态工厂
(3)实例工厂实例化
无参构造:
类中创建无参构造
静态工厂
方法加static+配置factory-method配置
(3)实例工厂实例化
7.属性注入(DI)
类的属性赋值
(1)构造方法
(2)set方法设置
(3)接口注入
但spring支持前两种方法
构造方法:
set方法设置
接口注入:spring不支持
spring进行注入:
name和price属性和值
set方法
配置:
上面注入的都是普通类型
下面是注入对象(引用类型)(构造和set相同)
也要用ref
给Employ注入Car2(上面的Car2)
8.P名称空间的属性注入(Spring2.5以后)
通过引入p名称空间完成属性的注入:
写法:
普通属性 p:属性名=”值”
对象属性 p:属性名-ref=”值”
P名称空间的引入 前提
普通类型:
引用类型:
9.SpEL注入
引用类型注入:
引用其他类型的属性和方法;
10.复杂类型的注入(数组或集合)
集合一般是框架内部使用
数组:
List集合
set方法
<!-- Spring的集合属性的注入============================ -->
<!-- 注入数组类型 -->
<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>王东</value>
<value>赵洪</value>
<value>李冠希</value>
</list>
</property>
<!-- 注入list集合 -->
<property name="list">
<list>
<value>李兵</value>
<value>赵如何</value>
<value>邓凤</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>
map简单的方式注入:
还有复杂的方法
通常配置不需要,spring整合Hibernate时,把Hibernate的映射做成一个集合(框架内部)
11.Spring的分模块配置
分模块的开发:
两种方法:
(1)加载配置文件的时候,加载多个
(2)在一个配置文件中引入多个
1)加载配置文件的时候,加载多个
2)在一个配置文件中引入多个