Spring6快速入门
各工具版本要求:
JDK
:Java17+
Maven
:3.6+
Spring
:6.0.9
简介
Spring是一个控制反转(IOC),面向切面(AOP)编程的轻量级框架。
2002年,Rod Johnson首次推出Spring框架的雏形,interface21(https://interface21.io/)
2004年3月24日,Spring以interface21框架为基础,经过重新设计,发布了1.0正式版。
官网
:http://spring.p2hp.com
官方文档地址
:https://docs.spring.io/spring-framework/docs/
GitHub
:https://github.com/spring-projects/spring-framework
Spring Framework
特点
🚀Spring是一个开源、轻量级,非入侵式的框架。(非入侵:Spring对应用程序本身的结构影响非常小)
🚀控制反转(IOC):把创建对象过程交给Spring管理
🚀面向切面(AOP):AOP用来封装多个类的公共行为,将那些与业务无关但和业务模块共同调用的逻辑封装起来,减少系统的重复代码,降低模块之间的耦合度,另外AOP还解决一些系统层面上的问题,比如日志、事务、权限等。
🚀容器:Spring IOC是一个容器,它可以降低使用门槛,提高开发效率
🚀组件化:使用简单的组件配置合成复杂的应用,在Spring中可以使用XML和java注解组合这些对象。
🚀一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。
组成
Spring Core(核心容器)
spring core提供了IOC, DI, Bean配置装在创建的核心实现。核心概念:Beans, BeansFactory、BeanDefinitions、ApplicationContext.
spring-core
:IOC和DI的基本实现
spring-beans
:BeanFactory和Bean的装配管理(BeanFactory)
spring-context
:Spring context上下文,即IOC容器(ApplicationContext)
spring-expression
:spring表达式语言
Spring AOP
spring-aop
:面向切面编程的应用模块,整合ASM、 CGLib、 JDK proxy
spring-aspects
:集成AspectJ, AOP应用框架
spring-instrument:
动态Class Loading模块
Spring Data Access
spring-jdbc
:spring对JDBC的封装,用于简化jdbc操作
spring-orm
:java对象与数据库的映射框架
spring-jms
:Spring对Java Message Service(java消息服务)的封装,用于服务之间相互通信
spring-tx
:spring jdbc事务管理
Spring Web
spring-web
:最基础的web支持,建立于spring-context之上,通过servlet或listener来初始化IOC容器
spring-webmvc
:实现web mvc
spring-websocket
:websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗。
spring-webflux
:Spring5.0提供的,用于取代传统Java servlet,非阻塞式Reactive Web框架,异步, 非阻塞,时间驱动事务。
Spring Message
Spring-messaging
: spring4.0提供的, 为spring集成一些基础的报文传送服务。
Spring test
spring-test
:集成测试支持,主要是对junit的封装。
第一个Spring6工程
步骤
创建maven聚合工程
引入spring6相关依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.9</version>
</dependency>
创建类,定义属性和方法
public class User {
public void add(){
System.out.println("add....");
}
}
按照spring要求创建配置文件(xml格式)
在spring配置文件中配置内容
<?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">
<!--完成user对象创建,
bean标签
id属性:唯一标识
class属性:要创建对象所在类的全路径(包名称+类名称)
-->
<bean id="user" class="com.louis.User"></bean>
</beans>
测试
@Test
public void test(){
//加载spring配置文件,对象创建,参数是创建的xml文件
ApplicationContext context = new ClassPathXmlApplicationContext("testSpring.xml");
//获取创建的对象,getBean,其中的参数是在xml文件中id的属性值,转换为与自己创建的相应的对象
User user = (User)context.getBean("user");
//使用对象调用方法进行测试
user.add();
}
/*add....*/
总结
在上面使用的方式中可以看出,获取内容没有使用new关键字去创建对象,而是使用了反射。
执行过程
① 加载bean.xml配置文件
② 对xml文件进行解析操作
③ 获取xml文件bean标签中的属性值(id、class)
④ 使用反射根据全路径创建对象
Class clazz = Class.forName(class属性值)
//1、获取类的Class对象(字节码文件)
Class<?> clazz = Class.forName("com.louis.User");
//2、调用方法创建对象
//Object o = clazz.newInstance();过时用法
User user = (User)clazz.getDeclaredConstructor().newInstance();
在Spring中创建对象,会将创建好的对象放入DefaultListableBeanFactory对象的Map集合中。
Map<String, BeanDefinition> beanDefinitionMap;
//key:唯一标识,value:类的定义(描述信息)