Spring概念
1.spring是开源的轻量级框架(免费,依赖少,可以直接使用)
2.spring核心主要两部分:
(1)aop:面向切面编程,扩展功能不是修改源代码实现
(2)ioc:控制反转,
-比如有个类,在类里面有个方法(不是静态方法),调用类里面的方法,需要创建类的对象,使用对象调用方法,创建类对象的过程,需要new 出来对象
-把对象的创建不是通过new方式实现,而是交给spring配置创建类对象
3.spring是一站式框架
(1)spring在javaee三层结构中,每一层都提供不同的解决技术
-web层:springMVC
-service层:spring的ioc
-dao层:spring的jdbcTemplate
Spring的ioc操作
1.把对象的创建交给spring进行管理
2.ioc的操作两部分:
(1)ioc的配置文件方式【本篇的主要内容】
(2)ioc的注解方式【详细在下一篇福介绍】
3.IOC的底层原理
1.ioc底层原理使用技术
(1)xml配置文件
(2)dom4j解析xml
(3)工厂设计模式
(4)反射
2.画图分析ioc实现原理
(1)ioc技术之前存在的模式以及存在的缺陷
(2)ioc实现的原理
4.IOC入门案例
第一步 导入jar包
第二步 创建类,在类里面创建方法
第三步 创建spring配置文件,配置创建类
(1) Spring的核心配置文件名称和位置不是固定的
-建议放到src下面,官方建议applicationContext.xml
(2) 在xml中引入schema约束
(3)在以上beans元素内继续添加<bean id ="user" class="cn.itcast.ioc.User"></bean>
注:id可以随便写,但是class的value即待创建类的路径信息一定要写对
第四步 写代码测试对象创建
(1)第四步只使用在测试-->新建一个测试类,在@Test的测试方法中以bean1.xml为例,先对其进行加载,然后用getBean(id)来获取得到这个待创建类的实例
spring的bean管理(xml配置文件)
1.1 Bean实例化的方式
1. Bean的实例化是一种专业术语,即在spring里面通过xml配置文件创建对象
2. bean实例化三种方式实现
2.1 使用类的无参构造创建(重点)--参考ioc入门案例,
类里面没有无参数的构造时,将出现异常,比如入门案例中的第四步讲提示“No default constructor found”
2.2 使用静态工厂创建
(1)工厂类中,创建了静态的方法,返回类对象,可以直接用类名.方法名来调用
其各个步骤类似与ioc入门案例,不同之处,在以下截图中有标注,主要体现在
1.创建了一个Bean2的工厂类,在其静态方法中返回待创建类的对象,
2.xml文件配置内容要进行修改:
2.3 使用实例工厂创建
(2)工厂类中,创建不是静态的方法,返回类对象。得用对象名.方法名来调用
主要不同点体现在:
1.工厂类中的创建目标类的方法是非静态方法
2.xml中配置的修改,先生成工厂类。再根据工厂类生成待创建类,参考如下截图
以上第一个bean中的id与第二个bean中的factory-bean是对应相等;
对于最后一个bean的实例化方式,在对应的入门案例的第四步中,直接用getbean(“bean3”)即可;
Bean的后两种实例化方法都可以用ioc的入门案例中第四步中的测试代码进行测试,一遍验证带创建类是否成功被创建;
1.2 Bean标签常用属性
(1)id属性:
-id属性值不能包含特殊符号
-id属性可以任意命名
-根据id值可以得到配置对象
(2)class属性
-创建对象所在类的全路径
(3)name属性
-功能和id属性值一样,但是name属性值可以包含特殊符号
(4)scope属性
-singleton :默认值,单例
参考ioc入门案例,xml中没设置scope,即默认是singleton,如果在第四步测试代码中创建两个对象的话,前台输出可以看到是两个对象是同一个对象
-prototype:多例
如果xml设置scope=prototype的话,那么上图的前台输出结果将会是两个不同的值,即创建了两个不同的实例对象
1.3 属性注入
1. 属性注入的定义:创建对象的时候,向类里面的属性设置值得过程;
2. 属性注入的方式介绍(三种)
3. 在spring框架里面,支持前两种方式
3.1 如何使用有参数构造注入属性?
第一步,先按照ioc入门案例,先创建类PropertyDemo1,并定义有参构造,
第二步,在xml配置文件中进行如下设置:其中username为属性的名称,value为本次要赋的具体值
第三步,可以使用ioc入门案例第四步的test对以上两步进行测试
3.2 如何使用set方法注入属性(重点)?
第一步:创建如下类
第二步:设置xml文件配置:其中bookname为属性的名称,value为本次要赋的具体值
1.4 注入对象类型属性(重点)
1.场景:以创建UserService类和Dao类为例,其中在UserService中得到UserDao对象
2.具体实现过程
2.1 在UserService里面把UserDao作为类型属性
2.2 生成dao类型属性的set方法
2.3 xml配置文件中的属性注入,ref值和dao类的id值保持一致
1.5 注入复杂类型属性
1.数组
2.List
3.Map
案例:
第一步创建person类,里面包含以上复杂类型的属性,并已定义set方法:
第二步:在xml文件中进行配置
IOC和DI区别
(1)IOC:控制反转,把对象创建交给spring进行配置
(2)DI:依赖注入,向类里面的属性设置值(即以上Bean管理section中的1.3-1.5的属性注入)
(3)关系:依赖注入不能单独存在,需要在ioc基础上才能完成操作,比如以上的xml中的property标签包含在bean标签之中,也即先要创建类的实例对象,才能对其进行属性注入
Spring整合web项目底层原理
1.加载spring的核心xml配置文件
(1)以上直接加载,功能可以实现,但是每次都会new对象,效率很低
2.解决的实现思想:把加载配置文件和创建对象过程,在服务器启动的时候完成
3.实现原理的底层技术
(1)ServletContext对象
(2)监听器
(3)具体使用:【在实际项目中以下步骤是spring已经封装好的,只需要配置就可以】
--在服务器启动的时候,为每个项目创建一个ServletContext对象
--在ServletContext对象创建时候,使用监听器可以具体监听到ServletContext对象在什么时候创建
--使用监听器监听到ServletContext对象创建的时候,加载spring配置文件,把配置文件中配置的对象(多个bean标签)进行创建
--把创建出来的对象放到ServletContext域对象里面(setAttribut方法)
--获取对象的时候,到ServletContext域得到(getAttribute方法)