Spring
1、简介
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
Spring就是一个容器,用来存放同类内容的集合。
Spring是用来管理对象,目的是解耦,核心是IOC和AOP
1.1优点
1、Spring是一个开源免费的框架 , 容器 。
2、Spring是一个轻量级的框架 , 非侵入式的 。(开发简化)
3、控制反转 IoC(工厂模式) , 面向切面 Aop(代理模式)。
4、对事物的支持 , 对框架的支持。方便程序测试,便于集成各种框架。
1.2组成
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式 。
*数据模块(Data Access/Integration)
数据访问与集成模块,在这个模块中,有五个小模块:
-
JDBC
(Java Database Connectivity),Java数据库连接 -
ORM
(Object Relational Mapping), 对象关系映射 -
OXM
(Object XML Mapping), 对象XML映射 -
JMS
(Java Message Service),Java消息服务 -
Transactions
,事务
*Web模块
web模块中有四个模块:
-
Web
-
WebMVC
-
WebSocket
-
WebFlux
*切面模块(Aop,Aspects)
切面模块中有两个模块:
-
Aop
: Aspect Oriented Programming , 面向切面编程 ,是对OOP
的补充 -
Aspects
: 切面
*工具模块(Instrumentation)
工具模块是java的接口,用来:
-
监控代理
-
事件日志记录
-
代码覆盖率
*消息模块
后补
*核心模块
后补
*测试模块
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
后补
1.3pom.xml相关依赖
<!--基于maven依赖传递性,导入spring-context依赖可导入当前所需所有jar包--> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> </dependency> <!--junit测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
2、基于XML管理bean
2.1、入门案例
创建Maven module
1、引入依赖
2、创建类HelloWorld
3、创建Spring的配置文件
resources下new→XML Configuration File→Spring Config
4、在Spring的配置文件中配置bean
5、创建测试类测试
输出
2.2、获取bean的三种方式(附带标签详解)
1、根据备案的id获取
如上:入门案例
2、根据bean的类型获取
注意:根据类型获取bean时,要求IOC容器中有且只有一个类型匹配的bean 若有多个类型匹配的bean,此时抛出异常:NoUniqueBeanDefinitionException
3、根据bean的id和类型来获取
结论: 根据类型来获取bean时,在满足bean唯一性的前提下其实只是看:[对象instanceof指定的类型]的返回结果,只要返回的是true就可以认定和类型匹配,能够获取到。
即通过bean的类型、bean所继承的类的类型、bean所实现的接口的类型都可以获取bean。
2.3、依赖注入之setter注入
创建Student类
根据bean的id和类型来获取
2.4依赖注入之构造器注入
在Student中添加有参构造
根据bean的id和类型来获取
2.5、为类类型属性赋值
如学生类Student: Integer sid;String sname;Integer age; Clazz clazz;
关联班级类Clazz:Integer clazzId;String clazzName;
方法1:引入外部以声明的bean
配置Clazz类型的bean:
为Student中的clazz赋值:
根据bean的id和类型来获取
方法2:级联属性赋值
方法3:内部bean
2.6、为数组类型属性赋值
Student类中添加: private String[] hobby;
2.7、为集合类型属性赋值
方法1:Clazz类中添加:
private List<Student> students;
方法2:
2.8、为Map集合类型属性赋值
创建Teacher类:
private Integer tid; private String tname;
在Student类中添加:
private Map<String, Teacher> teacherMap;
方法1:配置bean:
方法2:
2.9、P命名空间
2.10、引入外部属性文件
①加入依赖
<!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <!-- 数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency>
②创建外部属性文件jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC jdbc.username=root jdbc.password=root
③bean
④测试连接
2.11、bean的作用域
后补
2.12、bean的生命周期
后补
2.13、FactoryBean(工厂)
当我们使用第三方框架或者库时,有时候是无法去new一个对象的, 比如静态工厂,对象是不可见的,只能通过getInstance()之类方法获取, 此时就需要用到FactoryBean,通过实现FactoryBean接口的bean重写getObject()方法, 返回我们所需要的bean对象。
简单来说,FactoryBean类型的bean,在获取bean的时候得到的并不是class属性中配置的这个类的对象,而是 getObject()方法的返回值。