前言
在工作中经常会发现很多同事连最常用的SSM框架使用起来也经常忘这忘那的,关于spring甚至只记得IOC、DI、AOP,然后就在网上找资料浪费大部分时间,所以本文重温了一遍帮大伙加深理解,同时做个整理,以后再忘来看这篇文章就好了。
我平时也会收集一些不错的spring学习书籍PDF,毕竟程序员的书都挺贵的,不可能每本都买实体,自己啃完也会梳理学习笔记,都在这了>>spring一网打尽,直接点击就可以无偿获取。
1. 体系结构
Spring是模块化的,可以选择合适的模块来使用,其体系结构分为5个部分,分别为:
Core Container
核心容器:Spring最主要的模块,主要提供了IOC、DI、BeanFactory、Context等,列出的这些学习过Spring的同学应该都认识
Data Access/Integration
数据访问/集成:即有JDBC的抽象层、ORM对象关系映射API、还有事务支持(重要)等
Web
Web:基础的Web功能如Servlet、http、Web-MVC、Web-Socket等
Test
测试:支持具有Junit或TestNG框架的Spring组件测试
其他
AOP、Aspects(面向切面编程框架)等
2. IOC
2.1 引入耦合概念
耦合:即是类间或方法间的依赖关系,编译时期的依赖会导致后期维护十分困难,一处的改动导致其他依赖的地方都需改动,所以要解耦
解耦:解除程序间的依赖关系,但在实际开发中我们只能做到编译时期不依赖,运行时期才依赖即可,没有依赖关系即没有必要存在了
解决思路:使用Java的反射机制来避免new关键字(通过读取配置文件来获取对象全限定类名)、使用工厂模式
2.2 IOC容器
Spring框架的核心,主要用来存放Bean对象,其中有个底层BeanFactory接口只提供最简单的容器功能(特点延迟加载),一般不使用。常用的是其子类接口ApplicationContext接口(创建容器时立即实例化对象,继承BeanFactory接口),提供了高级功能(访问资源,解析文件信息,载入多个继承关系的上下文,拦截器等)。
ApplicationContext接口有三个实现类:ClassPathXmlApplicationContext、FileSystemoXmlApplication、AnnotionalConfigApplication,从名字可以知道他们的区别,下面讲解都将围绕ApplicationContext接口。
容器为Map结构,键为id,值为Object对象。
2.2.1 Bean的创建方式
无参构造
只配了id、class标签属性(此时一定要有无参函数,添加有参构造时记得补回无参构造)
普通工厂创建
可能是别人写好的类或者jar包,我们无法修改其源码(只有字节码)来提供无参构造函数,eg:
// 这是别人的jar包是使用工厂来获取实例对象的
public class InstanceFactory {
public User getUser() {
return new User();
}
}
<!-- 工厂类 -->
<bean id="UserFactory" class="com.howl.entity.UserFactory"></bean>
<!-- 指定工厂类及其生产实例对象的方法 -->
<bean id="User" factory-bean="UserFactory" factory-method="getUser"></bean>
静态工厂创建
<!-- class使用静态工厂类,方法为静态方法生产实例对象 -->
<bean id="User" class="com.howl.entity.UserFactory" factory-method="getUser"></bean>
2.2.2 Bean标签
该标签在applicationContext.xml中表示一个被管理的Bean对象,Spring读取xml配置文件后把内容放入Spring的Bean定义注册表,然后根据该注册表来实例化Bean对象将其放入Bean缓存池中,应用程序使用对象时从缓存池中获取
属性 | 描述 |
---|---|
class | 指定用来创建bean类 |
id | 唯一的标识符,可用 ID 或 name 属性来指定 bean 标识符 |
scope | 对象的作用域,singleton(默认)/prototype |
lazy-init | 是否懒创建 true/false |
init-method | 初始化调用的方法 |
destroy-method | x销毁调用的方法 |
autowire | 不建议使用,自动装配byType、byName、constructor |
factory-bean | 指定工厂类 |
factory-method | 指定工厂方法 |
元素 | 描述 |
constructor-arg | 构造函数注入 |
properties | 属性注入 |
元素的属性 | 描述 |
type | 按照类型注入 |
index | 按照下标注入 |
name | 按照名字注入,最常用 |
value | 给基本类型和String注入 |
ref | 给其他bean类型注入 |
元素的标签 | 描述 |
<list> |
|
<Set> |
|
<Map> |
|
<props> |
2.2.3 使用
注意:默认使用无参构造函数的,若自己写了有参构造,记得补回无参构造
XML
<bean id="User" class="com.howl.entity.User"></bean>
ApplicationContext ac = new ClassPathXmlApplicationContext
("applicationContext.xml");
User user = (User) ac.getBean("User");
user.getName();
注解
前提在xml配置文件中开启bean扫描
<context:component-scan base-package="com.howl.entity"></context:component-scan>
// 默认是类名首字母小写
@Compo