Spring概念
- spring是开源的轻量级框架
- spring核心主要两部分:
(1)aop:面向切面编程,扩展功能不是修改源代码实现
比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,需要创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象,将这个过程交给spring
(2)ioc:控制反转,
把对象的创建不是通过new方式实现,而是交给spring配置创建类对象 - spring是一站式框架
Spring的ioc操作
- 把对象的创建交给spring进行管理
- ioc操作两部分:
(1)ioc的配置文件方式
(2)ioc的注解方式
IOC底层原理
1 ioc底层原理使用技术
(1)xml配置文件
(2)dom4j解决xml
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。
(3)工厂设计模式
(4)反射
2 画图分析ioc实现原理
下面的图片是利用工厂设计模式实现
以上是bean的一个底层实现,spring就像一个大工厂,管理着所有的bean
详细请见
spring创建bean的底层实现
简单的IOC例子
第一步 创建类,在类里面创建方法
第二步 创建spring配置文件,配置创建类
- spring核心配置文件名称和位置不是固定的,建议放到src下面,官方建议applicationContext.xml
- 引入schema约束
- 配置对象创建
第三步 写代码测试对象创建
Bean实例化的方式
- 使用类的无参数构造创建(重点)(spring默认使用无参构造)
使用静态工厂创建
使用实例工厂创建
其实就是将工厂类也作为bean来管理
Bean标签常用属性
(1)id属性:起名称,id属性值名称任意命名
- id属性值,不能包含特殊符号
- 根据id值得到配置对象
(2)class属性:创建对象所在类的全路径
(3)name属性:功能和id属性一样的,id属性值不能包含特殊符号,但是在name属性值里面可以包含特殊符号
(4)scope属性
- singleton:默认值,单例 对象只会创建一次
prototype:多例 每次创建都是新的对象
request:创建对象把对象放到request域里面
- session:创建对象把对象放到session域里面
- globalSession:创建对象把对象放到globalSession里面
属性注入介绍
1 创建对象时候,向类里面属性里面设置值
2 属性注入的方式介绍
- 使用set方法注入
- 使用有参数构造注入
- 使用接口注入
3 spring中支持前两种方法
- 使用有参数构造注入属性
- 使用set方法注入属性(重点)
注入对象类型属性(重点)
(1)过程: 创建service类和dao类,在service得到dao对象
(2)具体实现过程:在service里面把dao作为类型属性,生成dao类型属性的set方法
- 注入复杂类型属性
<!-- 注入复杂类型属性值 -->
<bean id="person" class="cn.itcast.property.Person">
<!-- 数组 -->
<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>
<!-- map -->
<property name="map">
<map>
<entry key="aa" value="lucy"></entry>
<entry key="bb" value="mary"></entry>
<entry key="cc" value="tom"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
IOC和DI区别
(1)IOC: 控制反转,把对象创建交给spring进行配置
(2)DI: 依赖注入,向类里面的属性中设置值
(3)关系:依赖注入不能单独存在,需要在ioc基础之上完成操作
关于servletcontext和applicationcontext的区别
简单地说,servletcontext是对于每个javeweb的,
而applicationcontext是spring的