前言
好吧,这个标题挺扯的,反正大概的意思就是想聊聊spring,这篇文章不会涉及IOC和AOP,讲讲我的spring学习过程呢,先是狂神后是尚硅谷,然后杂七杂八面试题,狂神的视频呢就是能快速上手,尚硅谷的呢细嚼慢咽,娓娓道来,进一步了解。
什么是Spring
好吧,实话实说这个标题也是一个面试题,先来看看一些答案吧,然后自己总结
总结:
从答案中我们发现,必须说出spring有哪些模块,还有说一点这个的好处,
我的答案是,spring是一个开发框架,其中呢有七大模块分别是测试层,核心模块,aop,工具,消息,数据访问/集成,web。这七大模块呢又被分为20多个小模块,其中最重要的就是IOC和AOP,
spring方便解耦,简化开发,AOP编程支持,方便程序测试,方便和其他框架整合,方便进行事务操作,降低java开发的复杂性。
可以根据如下图来记忆
七大模块讲解
我们按照图片从上到下从左到右的顺序来讲解
数据访问集成:
这里分为了五个小模块
- JDBC (Java Database Connectivity) java数据库连接
- ORM (Object Relational Mapping) 对象关系映射
- OXM (Object XML Mapping) 对象XML映射
- JMS (Java Message Service) java消息服务
- Transactions 事务
ORM和事务比较重要,所以重点关注,你学习过程中听到的次数会比较多,我这里说听到,因为很多视频里面都有,你去学习的时候,就会听到,听到是普遍现象,学到是坚持不懈的现象。
Web模块:
这个模块有四个小模块,这个模块主要是做网站开发用的多,请记住spring的诞生,不是说就只能拿来在web开发方面使用,他的用途很广。做网站开发只是他使用的某一个方向而已。
- Web 模块 他提供了编解码,过滤器,序列化,国际化,跨域,转换器,客户端和服务端等等,
- WebMVC模块 我们使用的springmvc(这玩意是在基于spring开发的框架,迎合三层架构时代)
WebSocket 模块 用来支持这个 全双工通信(这个词学过计算机网络的熟悉,这玩意就是java网络编程的知识点,感兴趣可以去了解)
WebFlux模块 就是这个响应式Web编程模块
红字部分的是重要知识点,在对应着javaweb的知识点,是web开发老生常谈的知识点,任何语言的web开发都离不开,拦截器这个梗。只是各种语言实现的方式不一样而已。
切面模块(AOP)
就AOP
和 Aspects这两个模块
Aop
: Aspect Oriented Programming , 面向切面编程 ,是对OOP
的补充Aspects
: 切面(只是一个过程)
Spring AOP
是一个基于代理的 Aop 框架 ,日常使用比较多的
Spring Aspects
模块里面则定义了五种类型的切面
可能大家对这里不理解,这个正常,就当混个眼熟,这个得具体使用和讲解才能知道
IOC核心模块
来到 Spring
最核心的部分,这里有我们熟悉的 控制反转 (Inversion of Control, IOC ) 和依赖注入( Dependency Injection, DI),他有四个核心模块
- Beans
- Core
- Context
- Expression
BeanFactory
在 Beans
模块中,IOC
容器的根接口,是IOC思想的实现方式之一
StopWatch
在 Core
模块中,它是 Spring
中的一个计时器,在启动 Spring
项目时经常看到
ApplicationContext
在 Context
模块中 ,核心接口
ParserContext
就在 Expression
模块中,里面定了这个 EL表达式 的默认前缀 #{
, 后缀 }
BeanFactory: IOC容器的基本实现,是Spring内部使用的接口,不提供给开发人员使用
ApplicationContext: BeanFacatory 接口的子接口,提供了更多强大的功能,一般由开发人员使用
Test模块
这个模块就是拿来测试写的代码,主要应用在三层架构中,测试每一层的代码有没有问题。
入门案例
下载Spring框架
具体步骤:Spring下载(超详细)_挣脱那枷锁的博客-CSDN博客_spring下载
直接网址:JFrog
使用idea创建一个项目
导入jar包
可以观察发现都是jar包,文档,源代码
做简单的案例只需要核心模块
部门类
/**
* 部门类
*/
public class Dep {
private String name;
private List<String> cats;
private Set<String> pats; //宠物
private Map<String,String> infos; //信息
private Properties mysqlInfos; //mysql数据库链接信息
private String[] numbers; //家庭成员
public void setCats(List<String> cats) {
this.cats = cats;
}
public void setPats(Set<String> pats) {
this.pats = pats;
}
public void setInfos(Map<String, String> infos) {
this.infos = infos;
}
public void setMysqlInfos(Properties mysqlInfos) {
this.mysqlInfos = mysqlInfos;
}
public void setNumbers(String[] numbers) {
this.numbers = numbers;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dep{" +
"name='" + name + '\'' +
", cats=" + cats +
", pats=" + pats +
", infos=" + infos +
", mysqlInfos=" + mysqlInfos +
", numbers=" + Arrays.toString(numbers) +
'}';
}
}
员工类
/**
* 员工类
*/
public class Emp {
private String name;
//属于哪个部门
private Dep dep;
public void setName(String name) {
this.name = name;
}
public void setDep(Dep dep) {
this.dep = dep;
}
@Override
public String toString() {
return "Emp{" +
"name='" + name + '\'' +
", dep=" + dep +
'}';
}
}
bean2.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注入内部bean演示-->
<bean id="emp" class="pojo.Emp">
<property name="dep">
<bean class="pojo.Dep">
<property name="name" value="保安部"></property>
</bean>
</property>
</bean>
</beans>
测试类
public class SpringTest {
@Test
public void test() throws BeansException {
//得到IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
//通过id拿到bean对象
Emp emp = (Emp) context.getBean("emp");
System.out.println(emp);
}
}
这个案例使用就是它的核心,创建一个对象。不是用new的方式而是用xml配置。更多精彩内容请收看后续文章