Spring-ioc
1.1简介
rod johnson → 搞音乐的
平台型框架整合型的框架 → 方便的集成其他框架和第三方框架
Spring → 春天 冬将尽 春可期
Source of modern Java
1.2 IOC&DI
1.2.1 IOC控制反转
Inverse of Control 控制反转
控制:控制权 → 实例生成权
UserService userService = new UserServiceImpl();//控制 → 应用程序
UserService userService = Spring.getInstance(UserService.class);//Spring生成
反转:由应用程序变更为Spring
容器:实例放在spring容器中 → Spring容器、IOC容器
组件:容器中管理的实例(对象)
1.2.2 DI依赖注入
Dependency Injection 依赖注入
应用程序和Spring容器之间的关系。
依赖:谁依赖谁,应用程序依赖Spring容器;为什么?spring容器提供了应用程序所必须的外部资源
注入:谁注入谁。Spring容器注入给应用程序的资源
1.3Spring能做什么
hello=你好
hello = hello
hello = 萨瓦迪卡
2.入门案例
2.1入门案例1
Spring容器以什么样的形式存在,我们如何去获得spring容器
组件如何注册容器中
2.1.1依赖
5spring + 1logging
aop、core、beans、context、expression
只写spring-context
2.1.2 Spring配置文件(xml)
2.1.2.1 引入schema约束
1、复制已有的配置文件里的头
2、从spring官网找
3、自定义文件模板
2.1.2.2 配置文件名
application.xml或application-xxx.xml
2.1.3 ApplicationContext应用上下文
加载spring配置文件 → 获得应用上下文
应用上下文,大家可以认为就是我们的容器
2.1.4Spring配置文件中注册组件
2.1.5从容器中取出组件
3 补充
ctrl + shift + enter → 规整代码,补充最后的分号(光标在该行任意位置)
shift + enter → 快速另起一行
alt + shift + ↑↓ → 快速变换上下文顺序(可以选中,也可以不选中)
ctrl + shift + alt + c竖中指 → 快速复制全类名
ctrl + H → 看类的继承关系
ctrl + f12
ctrl + shift + F → 全局搜索的快捷键(这个快捷键和你的输入法的简繁体转换冲突)
ctrl + alt + V → 提取变量,补全代码
ctrl + w → 快速选中一整块内容
4 入门案例2
维护组件之间的依赖关系
UserService
UserDao
4.1 类中维护组件之间的依赖关系
4.2 配置文件中维护组件之间的依赖关系
4.3 单元测试
4.4 小结
当前并没有带来新的功能,而是已有的功能。提高了组件的重用频率,搭建一个更加灵活可靠的系统。
5 接口
5.1 ApplicationContext
生成并管理组件,认为就是容器。
ClasspathXmlApplicationContext:加载的是classpath路径
FileSystemXmlApplicationContext:加载的是文件路径
5.2BeanFactory
bean工厂 → 生成全部bean的地方
6 bean的作用域scope
singleton:组件的默认scope为singleton
prototype原型(每一次取出都是一个新的组件)
6.1 scope的配置
6.2 单元测试
6.3 单元测试2
7 Bean的实例化方式
容器中的组件是怎么样来的
7.1构造方法
7.1.1无参构造
7.1.2有参构造
7.2工厂
是否是静态工厂:工厂中方法是否是静态方法
7.2.1静态工厂
7.2.2实例工厂
7.2.3FactoryBean
BeanFactory和FactoryBean
李艮隶 隶艮李
区别:
BeanFactory生产全部的bean;
FactoryBean生成特定的Bean,通常都叫XXXFactoryBean → 对应的组件的类型就是XXX
FactoryBean中的getObject
8 Bean的生命周期
在应用程序获得bean之前就已经开始了。初始化容器的时候开始。
8.1BeanPostProcessor
容器中有实现BeanPostProcessor的组件,那么就是执行到对应方法
可以做通用的处理,也可以筛选出需要的组件做个性化的处理
8.2 组件可用状态
8.3 scope对生命周期的影响
影响的是生命周期开始的时间:
singleton:容器初始化的时候
prototype:当你获得(getBean)这个组件的时候开始,容器关闭时没有生命周期
8.4 完整流程
8.4.1 代码
8.4.2 流程图
9 注解
9.1准备
context:component-scan base-package
设定包目录,去扫描该包目录下的所有类,如果包含组件注册功能的注解,就注册到容器。
9.2 组件注册功能
在类定义时增加注解(ElementType.TYPE)完成组件注册。
@Component
@Service (service层组件通常使用)
@Repository (dao层组件通常使用)
@Controller (控制层组件通常使用,SpringMVC阶段才会用)
9.2.1组件id
可以使用注解的value属性指定组件id,默认以类名的首字母小写作为组件id
9.3注入功能
要使用注入功能注解,需要保证当前类是容器中的组件。
9.3.1值类型(String、基本类型、包装类)
9.3.1.1 值的引用
如果按照上面直接使用@Value,值是和代码直接耦合在一起的 → 解耦
需要加载配置文件:需要在spring的配置文件中引用该properties配置文件
在spring配置文件中可以使用表达式
9.3.2 javabean类型(容器中的组件)
组件之间存在依赖关系
@Autowired
@Autowired + @Qualifier
@Resource
9.4 生命周期和scope
生命周期注解直接写在方法上
init-method: @PostConstruct
destroy-method: @PreDestroy
Scope注解 写在类定义上
9.5 单元测试
主要要做的事情,从容器中取出对应的组件,并且测试该组件提供的功能。
9.5.1 引入依赖
spring-test
9.5.2 单元测试类(为了使用注入功能注解)