一、Spring简要
什么是Spring?
Spring是一个非倾入容器,用于降低代码间的耦合度。根据不同的代码,使用IoC和AOP两种技术进行解耦。
主业务逻辑:逻辑联系紧密,复用性低
系统级服务:功能独立,主要是为业务提供系统级服务(日志、安全、事务),复用性强
IoC:使主业务不再自己维护关系,由Spring统一管理,“注入”
AOP:使系统级服务最大限度复用,不需要混杂进主业务,而是由Spring统一“织入”
非倾入:Spring的API不会侵入业务逻辑,不会破坏pojo(Plain Old Java Object)
ApplicationContext与BeanFactory容器的区别
1 | 1) ApplicationContext容器在进行初始化时,会将其中所有Bean对象创建 |
最全约束
1 | <?xml version="1.0" encoding="utf-8"?> |
IoC是什么?
控制反转思想,DI(依赖注入)是主流的实现方式
其他实现方式:依赖查找
二、Bean简述
(一)动态工厂Bean
1 | <bean id="factory" class="ServiceFactory"> |
(二)静态工厂Bean(推荐)
1 | <!-- 需要工厂方法为静态方法 --> |
(三)Bean的创建模式
1 | <!-- 单例(默认) --> |
三、Bean生命周期的始末
1 | <bean id="myService" class="ServiceImpl" |
要执行结束方法,需关闭容器。
1 | // 关闭容器条件 1. Bean对象是单例的 2. 手动关闭容器 |
生命周期顺序:
- 无参构造器
- 执行setter(需注入)
- 获取到Bean的id(需实现BeanNameAware)
- 获取到BeanFactory容器(需实现BeanFactoryAware)
- 执行postProcessBeforeInitialization()(需注册Bean后处理器BeanPostProcessor接口实现类)
- Bean初始化完毕(需实现InitializingBean)
- 初始化完毕之后(起始方法init-method执行)
- 执行postProcessAfterInitialization()方法
- doSome…
- 销毁之前(需实现接口DisposableBean)
- 销毁之前(执行destory-method=”结束方法名”)
四、Spring配置文件
标签id和name区别
id:必须满足XML的命名规范:
必须字母开头,可以包含数字、字母、下划线、连字符、句号、冒号
name:可以包含任何字符
基于XML的DI
(一)设值注入
1 | <!-- 需要提供setter方法 --> |
(二)构造注入
方法一
1 | <!-- 需带参构造器 --> |
方法二
1 | <!-- 需带参构造器 --> |
方法三
1 | <!-- 需带参构造器 --> |
(三)实现接口注入
(四)命名空间注入
P命名空间设值注入
1 | <!-- 需要setter方法 --> |
C命名空间构造注入
1 | <!-- 需要带参构造方法 --> |
(五)集合属性注入
1 |
|
简单写法
1 | <property name="myStrs" value="北京,上海"/> |
(六)自动注入
1 | <bean id="school" class="School"> |
1 | <bean class="School"> |
(七)SpEL表达式
1 | <!-- 要求: |
(八)内部Bean
1 | <bean id="student" class="Student"> |
(九)同类抽象Bean
1 | <!-- abstract:阻止base被获取 --> |
(十)异类抽象Bean
1 | <!-- abstract:阻止base被创建(base无class,无abstract则创建报错) --> |
五、多个Spring配置文件关系
平等关系
配置文件:
spring-beans.xml
spring-base.xml
写法一(利用重载方法:可变参数)
1 | String resource = "spring-base.xml"; |
写法二(利用重载方法:可变参数)
1 | String resource = "spring-base.xml"; |
写法三(推荐)
1 | String resource = "spring-*.xml"; |
包含关系
1 | <!-- 若使用通配符,主配置文件格式需不同 --> |
六、基于注解的DI
必须1:导入aop包
必须2:开启组件扫描器
1 | <!-- 开启组件扫描器 --> |
1 | "prototype") // 单例 or 原型(默认单例) ( |
(一)base-package相关
1 | <!-- 扫描com.ssm这个包及其子包 --> |
(二)和@Component相关的注解
注解 | 使用位置 |
---|---|
Repository | 使用在Dao实现类上 |
Service | 使用在Service实现类上 |
Controller | 使用在SpringMVC的处理器上 |