1️⃣Spring Core:Spring框架的核心模块,提供了IoC容器的实现,包括BeanFactory和ApplicationContext。它还提供了依赖注入的支持,以及一些基本的工具类和接口。
Spring Core模块提供了IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)的功能。下面我们将详细介绍Spring Core的知识点。
IoC(控制反转):IoC是一种设计模式,它将对象的创建、依赖关系的管理和对象的生命周期交给容器来处理。在Spring框架中,IoC由BeanFactory和ApplicationContext接口实现。BeanFactory是IoC容器的基本实现,ApplicationContext是BeanFactory的子接口,提供了更多的企业级功能,如国际化、事务管理等。
DI(依赖注入):DI是IoC的一种实现方式,它通过将依赖关系注入到对象中,来解决对象之间的耦合问题。Spring框架通过使用XML配置文件、注解和Java配置类等方式来实现依赖注入。例如,通过配置文件中的标签,可以声明一个类的实例,并指定依赖的其他类或值。Spring框架会根据配置文件的定义,自动创建类的实例并注入所需的依赖关系。
Bean:在Spring框架中,被容器管理的对象被称为Bean。Bean由IoC容器创建、组装和管理,可以通过配置文件或注解来声明和配置。Bean是Spring中最基本的组件,所有的应用程序逻辑都应该放在Bean中。
容器:容器是Spring框架的核心,它负责创建和管理Bean。Spring框架提供了两种类型的容器:BeanFactory和ApplicationContext。BeanFactory是最基本的容器实现,提供了基本的依赖注入功能。ApplicationContext是更高级的容器实现,提供了更多的企业级功能。
生命周期:Spring框架管理Bean的生命周期,它负责创建、初始化、使用和销毁Bean。Spring框架提供了一系列的回调方法,可以在Bean的生命周期不同阶段执行特定的操作。例如,使用@PostConstruct注解可以在Bean的初始化阶段执行自定义的逻辑。
AOP(面向切面编程):AOP是一种编程范式,用于解决横切关注点的问题。在Spring框架中,AOP通过代理技术实现。Spring框架提供了AOP模块,可以使用切点表达式和通知来定义横切逻辑。例如,可以使用@Before注解在方法执行之前执行某个方法。
Spring表达式语言(SpEL):SpEL是Spring框架中的一种表达式语言,可以在运行时进行动态计算。SpEL广泛应用于配置文件、注解和模板中,可以用于访问方法、属性、集合和运算符等。例如,可以使用SpEL在配置文件中动态设置属性的值。
注解驱动开发:Spring框架支持使用注解来简化配置和开发工作。通过在类、方法和属性上添加注解,可以实现依赖注入、AOP和事务管理等功能。例如,使用@Component注解标记一个类为Bean,并使用@Autowired注解注入依赖关系。
2️⃣Spring Context:Spring上下文模块扩展了Spring Core,提供了更大范围的功能,比如国际化、资源加载、事件传播等。
它提供了对应用程序的配置和生命周期管理的支持,同时还提供了访问和管理应用程序中所有对象的能力。
IoC容器 Spring Context模块提供了IoC(Inversion of Control)容器的实现。IoC是一种设计原则,它将对象的创建和对象的依赖注入从应用程序的代码中解耦出来,并委托给IoC容器进行管理。Spring的IoC容器负责创建和管理应用程序中的所有对象,并自动解决对象之间的依赖关系。
Bean管理 Spring Context模块通过Bean定义和Bean工厂来管理对象。Bean定义是用于描述对象的元数据,包括对象的类名、属性值、依赖关系等信息。Bean工厂则负责根据Bean定义创建对象,并在需要时提供对象的实例。
例如,可以通过使用Spring的ApplicationContext
接口来加载和管理Bean定义,并通过getBean()
方法来获取Bean的实例。下面是一个简单的示例:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = context.getBean(MyBean.class);
public class MyBean {
public void init() {
// 初始化逻辑
}
public void destroy() {
// 销毁逻辑
}
}
ApplicationEvent
和ApplicationListener
接口,可以实现应用程序内各个组件之间的解耦。例如,可以定义一个自定义的事件,并在合适的时机发布该事件:
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
public class MyPublisher {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void publishEvent() {
eventPublisher.publishEvent(new MyEvent(this));
}
}
然后,在另一个组件中监听该事件:
public class MyListener implements ApplicationListener {
public void onApplicationEvent(MyEvent event) {
// 处理事件
}
}
以上只是Spring Context模块的一些核心知识点,除此之外,该模块还提供了AOP支持、国际化支持、资源加载等功能。总而言之,Spring Context模块是Spring框架中非常重要的一个模块,它提供了IoC容器、Bean管理、生命周期管理和事件机制等功能。
3️⃣Spring AOP:Spring框架的AOP模块,提供了对面向切面编程的支持。它允许开发者定义切面、切点和通知等AOP概念,从而实现横切关注点的功能。
Spring AOP的核心概念包括切点(pointcut)、通知(advice)、切面(aspect)、连接点(joint point)和代理(proxy)等。
切点是一组匹配连接点的表达式,连接点是应用程序中可以插入通知的特定点。通知是在切点处执行的代码。根据切点和通知的组合方式,可以有多种类型的通知,包括前置通知(Before advice)、后置通知(After advice)、返回通知(After-returning advice)、异常通知(After-throwing advice)和环绕通知(Around advice)等。
切面是通知和切点的结合,它定义了在何时、何地应用通知。通过使用切面,可以将关注点从业务逻辑中分离出来,避免代码的重复性。一个切面可以包含多个通知和切点。
连接点是应用程序中可以插入通知的特定点,例如方法的调用或者某个异常的抛出。Spring AOP仅支持方法连接点。
代理是Spring AOP实施切面的机制,通过代理,可以将通知织入到目标对象中,从而实现切面概念。Spring AOP使用JDK动态代理和CGLib动态代理两种方式来实现代理。
Spring AOP提供了三种实现AOP的方式:XML配置、注解驱动和纯Java配置。
在XML配置方式中,可以通过配置文件来定义切面、切点和通知。例如,下面的配置定义了一个切面和一个切点:
在注解驱动方式中,可以通过在类或方法上添加注解来定义切面、切点和通知。例如,下面的代码定义了一个切面和一个前置通知:
@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
private void serviceMethods() {}
@Before("serviceMethods()")
public void beforeAdvice() {
// 执行前置通知的代码
}
}
在纯Java配置方式中,可以通过Java代码来定义切面、切点和通知。例如,下面的代码定义了一个切面和一个后置通知:
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
@Bean
public LoggingAspect loggingAspect() {
return new LoggingAspect();
}
@Bean
public MyService myService() {
return new MyService();
}
@Bean
public MyAfterReturningAdvice afterReturningAdvice() {
return new MyAfterReturningAdvice();
}
@Bean
public Advisor afterReturningAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution(* com.example.service.*.*(..))");
return new DefaultPointcutAdvisor(pointcut, afterReturningAdvice());
}
}
@Aspect
public class LoggingAspect {
@AfterReturning("execution(* com.example.service.*.*(..))")
public void afterReturningAdvice() {
// 执行后置通知的代码
}
}
@Service
public class MyService {
// service方法的具体实现
}
public class MyAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
// 执行后置通知的代码
}
}
Spring AOP提供了一种方便和灵活的方式来实现面向切面编程,可以将关注点从业务逻辑中分离出来,提高代码重用性和可维护性。无论是通过XML配置、注解驱动还是纯Java配置,Spring AOP都能够满足不同项目的需求。
4️⃣Spring JDBC:Spring框架的JDBC模块,提供了对JDBC的封装和简化,使得数据库操作变得更加简单和高效。
Spring JDBC模块是Spring框架的一个重要组成部分,它提供了一种简单、灵活和高效的方式来访问关系型数据库。
数据源配置: 在Spring框架中,可以通过配置文件或者注解的方式来定义数据源,数据源是JDBC连接池的包装类,用于管理数据库连接。Spring框架支持常见的数据库连接池,如Apache Commons DBCP、C3P0和HikariCP等。
举例:
@Bean
public DataSource dataSource() {
DataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
JdbcTemplate: JdbcTemplate是Spring框架提供的核心类,它简化了数据库访问的流程,封装了JDBC的操作细节,提供了一系列的方法来执行SQL语句。
举例:
@Autowired
private JdbcTemplate jdbcTemplate;
...
jdbcTemplate.update("INSERT INTO user (name, age) VALUES (?, ?)", "John Doe", 30);
SQL操作: Spring JDBC模块支持各种类型的SQL操作,包括查询、更新、批处理和存储过程等。通过JdbcTemplate提供的方法,可以执行SQL语句并获取结果集或受影响的行数。
举例:
List users = jdbcTemplate.query("SELECT * FROM user", new UserRowMapper());
int count = jdbcTemplate.update("UPDATE user SET age = ? WHERE id = ?", 35, 1);
事务管理: Spring框架提供了事务管理的支持,通过声明式事务和编程式事务两种方式来管理数据库事务。通过@Transactional注解或者编程方式可以标记事务的边界,并定义事务的属性,如传播行为和隔离级别等。
举例:
@Transactional
public void updateUserAge(int userId, int newAge) {
jdbcTemplate.update("UPDATE user SET age = ? WHERE id = ?", newAge, userId);
}
异常处理: Spring JDBC模块提供了异常处理机制,用于捕获和处理数据库操作中的异常。Spring框架将SQLException转换为DataAccessException,简化了异常处理的过程。
举例:
try {
jdbcTemplate.update("INSERT INTO user (name, age) VALUES (?, ?)", "John Doe", 30);
} catch (DataAccessException e) {
// 异常处理逻辑
}
ORM集成: Spring JDBC模块与其他ORM框架(如Hibernate、MyBatis)集成良好,可以通过注解或XML配置来定义实体类与数据库表的映射关系。
举例:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "name")
private String name;
@Column(name = "age")
private int age;
// 省略getter和setter方法
}
综上所述,Spring JDBC模块是Spring框架的一个重要组成部分,提供了一种简单、灵活和高效的方式来访问关系型数据库。通过数据源配置、JdbcTemplate、SQL操作、事务管理、异常处理和ORM集成等功能,开发者可以更加方便地进行数据库操作,提高开发效率和代码质量。
5️⃣Spring MVC:Spring框架的Web模块,提供了基于MVC(Model-View-Controller)模式的Web应用程序开发支持。它包括控制器、视图解析器等组件,帮助开发者构建Web应用程序。以实现清晰的分离关注点,提高代码的可维护性和可测试性。
控制器(Controller): 控制器是Spring MVC中的核心组件,用于接收并处理来自用户的请求。控制器通过使用注解或实现特定接口来定义处理请求的方法。例如,@Controller注解将一个类标记为控制器,@RequestMapping注解用于映射URL请求到具体的处理方法。
视图(View): 视图负责渲染用户界面并将数据呈现给用户。Spring MVC支持多种视图技术,包括JSP、Thymeleaf、Freemarker等。开发人员可以根据实际需求选择适合的视图技术。
模型(Model): 模型代表应用程序的数据和业务逻辑。在Spring MVC中,模型通常是一个POJO(普通的Java对象),它存储和处理数据。开发人员可以使用注解如@ModelAttribute或在处理方法中将数据添加到模型中。
处理请求的生命周期: Spring MVC的请求处理流程包含多个阶段,包括请求的映射、数据绑定、调用控制器方法、执行业务逻辑、选择并呈现视图等。开发人员可以使用各种注解和配置选项来控制请求的处理和流程。
数据绑定和验证: Spring MVC支持自动数据绑定,将请求参数绑定到处理方法的参数或模型对象中。还可以使用校验器(Validator)对绑定的数据进行验证,确保数据的有效性和一致性。例如,使用@Valid注解和BindingResult对象来处理表单验证。
RESTful Web服务支持: Spring MVC提供了对构建RESTful Web服务的支持。使用注解如@RequestMapping和@ResponseBody,开发人员可以轻松地将Java对象转换为JSON或XML格式,并作为响应返回给客户端。
文件上传和下载: Spring MVC提供了处理文件上传和下载的功能。通过使用MultipartResolver和@RequestParam注解,可以方便地接收和处理HTTP请求中的文件。
异常处理: Spring MVC允许开发人员定义全局的异常处理器,以处理应用程序中发生的异常。可以使用@ControllerAdvice注解和@ExceptionHandler注解来实现全局异常处理。
拦截器: Spring MVC拦截器可以在请求前后执行一些公共的逻辑。开发人员可以使用拦截器进行身份验证、日志记录、性能监测等操作。通过实现HandlerInterceptor接口并在配置文件中进行配置,可以定制拦截器的行为。
总结: Spring MVC是一个强大的Web框架,提供了丰富的功能和灵活的配置选项。它允许开发人员基于MVC架构构建高效、可扩展和易于维护的Web应用程序。通过理解和掌握Spring MVC的知识,开发人员可以更好地实现Web应用程序的需求。
6️⃣Spring Boot:Spring框架的快速应用程序开发模块,基于Spring的一切进行了自动配置,使得开发者可以更快地搭建Spring应用程序。
Spring Boot是基于Spring框架的一个开发框架,旨在简化Spring应用的初始化和配置过程。它提供了一种约定大于配置的方式来构建应用程序,使得开发人员可以快速上手并且能够快速搭建一个独立的、可部署的Spring应用。下面将从整体架构、主要特性、核心组件、自动配置、常用注解、开发流程、部署方式和优势等方面进行详细讲解。
①、整体架构 Spring Boot的整体架构可以分为三个层次:核心、自动配置和启动器。
②、主要特性
③、核心组件
④、自动配置 Spring Boot的核心特性之一是自动配置。它通过使用条件注解和SpringFactoriesLoader机制,根据应用程序中的依赖自动配置各种组件,大大简化了配置的工作。例如,当引入了Spring Data JPA的依赖时,Spring Boot会自动配置数据源、实体管理器、事务管理器等,开发人员无需手动配置。
⑤、常用注解
⑥、开发流程 使用Spring Boot开发应用程序的流程如下:
⑦、部署方式 Spring Boot应用程序的部署方式有多种,可以选择打包成可执行的JAR文件、WAR文件或者使用Docker容器等。
⑧、优势
综上所述,Spring Boot通过提供简化配置、自动配置、内嵌服务器、健康检查、热部署、安全性等特性,大大简化了Spring应用的开发和部署过程,提高了开发效率和系统的可维护性。
举例说明,比如在Spring MVC中,我们可以定义一个控制器来处理HTTP请求,如下所示:
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("message", "Hello, World!");
return "hello";
}
}
在这个例子中,我们使用了Spring MVC中的@Controller注解来定义一个控制器类,使用@RequestMapping注解来定义URL映射。在sayHello方法中,我们使用了Model来传递数据到视图,最后返回了视图名字“hello”。