(二)Spring IOC & DI_Spring_学习笔记
一、Spring Introduction1.Spring起源Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许
一、Spring Introduction
1.Spring起源
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。
它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
Spring是一个分层的Java SE/EE full-stack(一站式) 轻量级开源框架。
整合性轻量级框架,相当于一个平台。
2.Outline
3.核心概念
核心概念:
IOC:Inverse of control 控制反转
控制:控制是指应用程序中实例的生成权。比如,获取实例的方式是通过new一个对象,这就是一种控制。
反转:就是把控制由应用程序反转交给Spring。原先自己new出来实例,现在由Spring来创建实例。实例交给了Spring来管理,实例所在的地方就是容器,称为Spring容器或者IOC容器。
所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
DI:Dependency Injection 依赖注入 (讨论的对象:Spring容器和应用程序)
通过上面的反转我们知道,应用程序“贫穷”,Spring“富有”。
依赖:谁依赖谁?为什么依赖?
应用程序依赖IOC容器,因为应用程序把实例都交给了IOC容器进行管理。
注入:谁注入谁?注入了什么?
IOC注入给应用程序,注入某个对象所需要的外部资源(包括对象、资源、常量数据)
AOP:面向切面编程
4.Spring优点
补充:
AOP是Spring中的动态代理。
事务通常在service层,Spring中声明事务可以通过只加一个注解实现,注解加在哪个方法上,哪个方法在一个事务里。
5.特性:
Core technologies: dependency injection(依赖注入), events(事件), resources(资源), i18n(国际化), validation(参数校验), data binding(参数校验和java Bean绑定起来), type conversion(类型转换), SpEL(spring表达时语言), AOP.(面向切面编程)。
6.Spring Framework
二、案例
1.入门案例1
开始使用spring管理实例
UserService
ProductService
1.1.创建对应的类
1.2.引入spring依赖
导入spring依赖的包
core, beans, context,expression ,aop 和 logging(日志包)
maven配置文件中只需要引入spring-context → 5+1
各个包之间的依赖关系
1.3.配置文件
application.xml 或者application-xxx.xml
约束 → xml中可以写哪些标签,标签中有哪些属性,标签间的顺序是什么样子
组件:spring配置文件中管理实例
xml文件中约束获得
1、已有的配置文件中复制一下
2、从spring官网referenceDoc下的appendix
创建一个文件模板file template下的appendix
4.3.2.管理组件
组件中的id属性不是必须的。
4.4.使用组件
spring配置文件中管理实例,我们称之为组件。
2.入门案例2
使用spring管理有依赖关系的组件
userService userDao
productService
2.1 引入依赖
2.2 创建有依赖的类
创建userDao和userDaoImpl
service中维护了dao的实例
2.3 spring配置文件
5.4单元测试
小结:
学习了IOC 和 DI 最大的感触是什么?
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法
依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
三、Spring两大核心容器(API)
Spring两大核心容器:ApplicationContext、BeanFactory
3.1接口、类的继承关系(ctrl+h看继承关系)
查看ApplicationContext的继承关系
3.2.FileSystem和Classpath
加载文件的位置不同
classpath:加载classpath目录下的配置文件
filesystem:加载的文件路径下的配置文件
四、Bean实例化
1.构造方法
无参构造(最常用的)
property标签通过set方法给成员变量赋值
有参构造
单元测试
2.工厂
根据工厂中的生产方法是否是静态的,可以分为静态工厂和实例工厂。如果是静态,可直接通过类名调用方法,如果是非静态,要先创建对象,再调用方法。
静态工厂
实例工厂
单元测试
3.FactoryBean
BeanFactory:生产全部实例
XXXFactoryBean:对应的组件类型是XXX
implements FactoryBean → getObject方法
4.spring容器中的bean的作用域
singleton:容器中的这个组件是单例模式,无论什么时候从容器从取对象始终都是一个对象
prototype:原型,和单例相反,每一次取出都是一个新的对象
singleton
prototype
默认的scope是什么
默认是单例,单例也是最最常用
5.bean的生命周期
不是所有组件都有aware的过程,只有实现aware的接口,才会有aware的过程,有对应的方法可执行。
scope和生命周期相关
单例:生命周期是容器初始化的时候开始。
prototype是调用getBean方法后,生命周期才开始。
单例有销毁这部分的生命周期,10,11。
prototype没有10和11。
5.1案例1(默认的scope为singleton)
otherBean中没有写任何方法,所以只执行BeanPostProccessor的方法。
除了实现BeanPostProcessor接口的组件(对象)本身不会执行来自该接口的方法,其他组件都会执行该接口的这两个方法。
5.2.案例2(修改为prototype)
6.CollectionBean
组件中的成员变量类型可以是基本数据类型,也可以是collection → 数组 、List、Set、Map、Properties。
6.1.定义bean中的成员变量
6.2.数组、List、Set
property下子标签不同 :array、list、set
6.3.Map
6.4.properties
6.5.运行结果
五、注解(重中之重)
组件扫描包的配置 → 配置将哪个包目录下的有注解(组件注册)的class注册到容器中。
1.组件注册
之前组件注册,写的是bean标签 → 通常包含class
使用注解进行组件注册一般是写在类定义上
1、@Component → 通用
2、@Service → 通常是加在service层的类上
3、@Repository → 通常是加在dao层的类上
4、@Controller → SpringMVC阶段注册组件的注解
可以使用注解的value属性来指定id → 上面的组件注册都可以这样使用。
2.注入
维护组件之间的关系
2.1.value
给组件中的基本类型、包装类、字符串类型的成员变量注入值
2.1.1.引用额外的配置文件
2.1.2.也可以在spring配置文件中使用
2.2.组件类型
1、@Autowired → 按照类型 → 这个类型组件只有一个
2、@Autowired + @Qualifier → 通过@Qualifier的value属性指定id
3、@Resource → 默认按照类型,如果需要指定id,使用name属性
补充:@Autowired如果类型没有匹配上,也可以按照id匹配
2.3.scope/lifecycle
2.3.1.scope
类定义上:默认不写仍然是singleton
2.3.2.生命周期
加在组件中的方法上
init-method:@PostConstruct
destroy-method:@PreDestroy
2.4.单元测试
2.4.1.导包
spring-test,注意版本应与spring-context保持一致
2.4.2.测试类上增加注解
更多推荐
所有评论(0)