本文全面介绍了Spring框架的基础知识,包括Spring入门所需的功能、优势和应用场景。文章详细讲解了Spring的核心模块、环境搭建以及IoC与DI的基础概念。此外,还深入探讨了Spring AOP、MVC框架和事务管理的使用方法。
Spring框架简介 Spring框架的定义和功能Spring框架是一个开源的Java平台下的轻量级框架,它为开发Java应用程序提供了全面的基础设施支持。Spring框架最初由Rod Johnson在2003年开发,旨在简化企业应用开发,提供更简洁、更规范的开发方式。Spring框架实现了对Java EE API的简化,使得开发者能够避免复杂的配置文件和代码,专注于业务逻辑的实现。
Spring框架的主要功能包括依赖注入、面向切面编程(AOP)、事务管理、数据库访问、Web开发等。Spring通过这些功能帮助开发人员构建可维护、可扩展的应用程序。
Spring框架的优势和应用场景优势
- 轻量级:Spring框架的设计目标是轻量级,不需要复杂的配置,减少了应用程序的体积和复杂性。
- 依赖注入:Spring框架通过依赖注入机制实现了松耦合,使得代码的维护和扩展变得简单。
- 面向切面编程:Spring框架支持面向切面编程,使得将横切关注点(如日志、事务管理等)与业务逻辑分离成为可能。
- 事务管理:Spring框架提供了强大的事务管理功能,支持编程式和声明式事务管理。
- 数据库访问:Spring框架提供了多种数据库访问抽象层,简化了数据库访问操作。
- Web开发:Spring框架提供了Spring MVC框架,使得Web开发更加简单和规范。
应用场景
- 企业级应用开发:Spring框架为企业级应用开发提供了良好的支持,包括依赖注入、事务管理、数据库访问等。
- Web应用开发:Spring MVC框架和Spring Boot的结合,使得Web应用开发变得简单快捷。
- 微服务架构:Spring Boot和Spring Cloud的结合,使得在微服务架构下构建可维护、可扩展的应用程序成为可能。
Spring框架由多个核心模块组成,每个模块都有其特定的功能。以下是Spring的核心模块介绍:
- Spring Core:Spring的核心模块,提供了依赖注入、面向切面编程(AOP)等功能。
- Spring Context:提供了配置文件解析、资源访问、事件传播等功能,是Spring框架的核心容器之一。
- Spring Bean:提供了Bean的定义、生命周期管理和装配功能。
- Spring AOP:提供了面向切面编程的功能,支持横切关注点的分离。
- Spring DAO:提供了简单的数据访问对象抽象层,简化了数据库访问操作。
- Spring MVC:提供了一个基于Model-View-Controller模式的Web框架,支持Web应用开发。
- Spring Transaction:提供了事务管理功能,支持编程式和声明式事务管理。
- Spring Web:提供了基于Servlet API的Web开发支持。
- Spring Test:提供了测试支持,使得测试Spring应用程序更加简单。
为了能够开发和运行Spring应用程序,需要准备以下开发环境:
- JDK:需要安装JDK,推荐使用JDK 8及以上版本。
- IDE:推荐使用IntelliJ IDEA或Eclipse,这两个IDE支持Spring开发。
- Maven:需要安装Maven构建工具,用于项目依赖管理和构建。
- Spring Boot:推荐使用Spring Boot,它简化了Spring应用的配置。
为了使用Spring框架,需要在项目中添加Spring相关依赖。这里以Maven为例,配置Spring的基本依赖。
依赖配置示例
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.10</version>
</dependency>
</dependencies>
Spring项目的基本结构
一个基本的Spring项目结构如下:
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── controller
│ │ ├── service
│ │ └── config
│ │ └── AppConfig.java
│ ├── resources
│ │ └── application.properties
│ └── webapp
│ └── WEB-INF
└── test
└── java
└── com
└── example
└── demo
└── DemoApplicationTests.java
src/main/java/com/example/demo
:存放Java源代码。src/main/resources/application.properties
:存放应用程序配置信息。src/main/webapp/WEB-INF
:存放Web应用的配置文件,如web.xml
。src/test/java/com/example/demo
:存放测试代码。
示例代码
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
}
Spring IoC与DI基础
什么是IoC与DI
IoC(控制反转)
IoC(Inversion of Control)意味着将对象的依赖关系的控制权从调用者(对象A)转移给容器(如Spring容器)。对象A不再负责创建对象B,而是由容器来创建对象B,并将对象B注入给对象A。
DI(依赖注入)
DI(Dependency Injection)是实现IoC的一种具体方式,它将对象之间的依赖关系通过外部配置文件(如XML配置文件)或者注解(如@Autowired
)的方式注入到对象中。依赖注入的方式包括构造器注入、设值方法注入和接口注入等。
在Spring中,可以通过XML配置文件或者注解的方式实现IoC与DI。
XML配置文件方式
<bean id="userService" class="com.example.demo.service.UserServiceImpl">
<property name="userRepository" ref="userRepository"/>
</bean>
<bean id="userRepository" class="com.example.demo.repository.UserRepositoryImpl"/>
注解方式
@Component
public class UserRepositoryImpl implements UserRepository {
// 实现代码
}
@Component
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
// 实现代码
}
Bean的生命周期管理
Spring容器管理Bean的整个生命周期,从创建到销毁。Spring容器会调用Bean生命周期中的回调方法,如InitializingBean
和DisposableBean
接口中的方法,以及通过@PostConstruct
和@PreDestroy
注解的方法。
回调方法示例
@Component
public class MyBean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
// 初始化方法
}
@Override
public void destroy() throws Exception {
// 销毁方法
}
}
注解方式示例
@Component
public class MyBean {
@PostConstruct
public void init() {
// 初始化方法
}
@PreDestroy
public void destroy() {
// 销毁方法
}
}
Spring AOP入门
AOP的基本概念
AOP(Aspect-Oriented Programming)是一种编程范式,它将横切关注点(如日志、事务管理等)与业务逻辑分离,使得代码更加模块化。AOP的核心概念包括切面(Aspect)、通知(Advice)、切点(Pointcut)、连接点(Joinpoint)和织入(Weaving)。
- 切面:将横切关注点封装成模块化组件。
- 通知:定义了切面何时执行。通知可以是前置通知、后置通知、环绕通知等。
- 切点:定义了连接点的位置。切点表达式定义了哪些方法或操作符符合连接点条件。
- 连接点:程序执行过程中的一个点,如方法调用、异常抛出等。
- 织入:将切面应用到目标对象的过程。
示例代码
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.demo.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Executing: " + joinPoint.getSignature().getName());
}
@AfterReturning(pointcut = "execution(* com.example.demo.service.*.*(..))", returning = "result")
public void logAfter(JoinPoint joinPoint, Object result) {
System.out.println("Returned: " + result);
}
}
Spring框架提供了强大的AOP支持,可以通过XML配置文件或者注解的方式实现AOP。
XML配置文件方式
<aop:config>
<aop:pointcut id="businessService" expression="execution(* com.example.demo.service.*.*(..))" />
<aop:advisor advice-ref="doAround" pointcut-ref="businessService" />
</aop:config>
<bean id="doAround" class="com.example.demo.aspect.DoAroundAdvice"/>
注解方式
@Aspect
@Component
public class DoAroundAdvice {
@Around("execution(* com.example.demo.service.*.*(..))")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 前置通知
System.out.println("前置通知");
Object result = joinPoint.proceed(); // 执行目标方法
// 后置通知
System.out.println("后置通知");
return result;
}
}
常用的AOP切点表达式
execution(* com.example.demo.service.*.*(..))
:匹配com.example.demo.service
包下的所有方法。execution(* com.example.demo.service.*Service.*(..))
:匹配com.example.demo.service
包下所有以Service
结尾的方法。execution(* com.example.demo.service.*Service.*(..)) && @annotation(timeout)
:匹配com.example.demo.service
包下所有以Service
结尾的方法,并且该方法上带有@Timeout
注解。
MVC(Model-View-Controller)是一种设计模式,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。
- 模型(Model):模型代表应用程序中的数据和业务逻辑。模型封装了应用程序的状态,并提供操作数据的方法。
- 视图(View):视图负责展示模型中的数据。视图与模型分离,可以根据模型中的数据动态生成界面。
- 控制器(Controller):控制器作为模型和视图之间的中介,接收用户的请求,调用模型的方法,将结果交给视图进行展示。
Spring MVC的工作流程如下:
- 客户端发送请求到前端控制器(DispatcherServlet)。
- 前端控制器根据请求的信息(如URL)调用处理器映射器(HandlerMapping)。
- 处理器映射器根据请求信息查找处理器,并返回处理器(Controller)和处理器的执行链(HandlerExecutionChain)。
- 前端控制器调用处理器适配器(HandlerAdapter),处理器适配器执行处理器逻辑,返回ModelAndView。
- 前端控制器收集处理器返回的ModelAndView对象中的视图名,并调用视图解析器(ViewResolver)解析视图。
- 视图解析器将视图名转换为视图对象。
- 视图对象将最终的视图渲染成实际的HTML页面返回给前端控制器。
- 前端控制器将HTML页面返回给客户端。
控制器配置示例
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/users")
public String listUsers(Model model) {
model.addAttribute("users", userService.getAllUsers());
return "users";
}
}
视图配置示例
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
}
模型配置示例
@Service
public class UserService {
private UserDAO userDAO;
@Autowired
public UserService(UserDAO userDAO) {
this.userDAO = userDAO;
}
public List<User> getAllUsers() {
return userDAO.findAll();
}
}
Spring事务管理
事务管理的基本概念
事务管理是确保数据库操作的一致性和完整性。事务具有四个基本属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
- 原子性:事务是一个不可分割的工作单位,事务中所有操作要么全部成功,要么全部失败。
- 一致性:事务执行完成后,数据库的状态保持一致。
- 隔离性:事务之间相互隔离,一个事务不能看到其他事务未提交的数据。
- 持久性:事务一旦提交,结果将持久化,即使系统出现故障也不会丢失数据。
Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。
编程式事务管理
编程式事务管理通过编程的方式管理事务。可以通过TransactionTemplate
或PlatformTransactionManager
实现编程式事务管理。
声明式事务管理
声明式事务管理通过配置文件或注解的方式管理事务。Spring提供了@Transactional
注解,可以方便地定义事务的边界。
示例代码
@Service
public class UserService {
// 通过注解声明事务
@Transactional
public void addUser(User user) {
// 添加用户
}
@Transactional
public void deleteUser(Long id) {
// 删除用户
}
}
事务传播行为的理解与使用
事务传播行为定义了在存在事务上下文的情况下,应该如何创建或使用事务。Spring提供了多种事务传播行为,包括:
REQUIRED
:如果当前存在事务,则加入该事务;否则,创建一个新的事务。SUPPORTS
:如果当前存在事务,则加入该事务;否则,以非事务方式执行。MANDATORY
:如果当前存在事务,则加入该事务;否则,抛出异常。NOT_SUPPORTED
:以非事务方式执行操作,如果当前存在事务,则暂停当前事务。NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常。REQUIRES_NEW
:创建一个新的事务,如果当前存在事务,则暂停当前事务。NESTED
:如果当前存在事务,则在嵌套事务内执行;否则,执行一个新事务。
示例代码
@Service
public class UserService {
@Transactional(propagation = Propagation.REQUIRED)
public void addUser(User user) {
// 添加用户
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void deleteUser(Long id) {
// 删除用户
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章