为了账号安全,请及时绑定邮箱和手机立即绑定

Spring入门:快速上手Spring框架的基础教程

标签:
Spring
概述

本文全面介绍了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框架的优势和应用场景

优势

  1. 轻量级:Spring框架的设计目标是轻量级,不需要复杂的配置,减少了应用程序的体积和复杂性。
  2. 依赖注入:Spring框架通过依赖注入机制实现了松耦合,使得代码的维护和扩展变得简单。
  3. 面向切面编程:Spring框架支持面向切面编程,使得将横切关注点(如日志、事务管理等)与业务逻辑分离成为可能。
  4. 事务管理:Spring框架提供了强大的事务管理功能,支持编程式和声明式事务管理。
  5. 数据库访问:Spring框架提供了多种数据库访问抽象层,简化了数据库访问操作。
  6. Web开发:Spring框架提供了Spring MVC框架,使得Web开发更加简单和规范。

应用场景

  1. 企业级应用开发:Spring框架为企业级应用开发提供了良好的支持,包括依赖注入、事务管理、数据库访问等。
  2. Web应用开发:Spring MVC框架和Spring Boot的结合,使得Web应用开发变得简单快捷。
  3. 微服务架构:Spring Boot和Spring Cloud的结合,使得在微服务架构下构建可维护、可扩展的应用程序成为可能。
Spring的核心模块介绍

Spring框架由多个核心模块组成,每个模块都有其特定的功能。以下是Spring的核心模块介绍:

  1. Spring Core:Spring的核心模块,提供了依赖注入、面向切面编程(AOP)等功能。
  2. Spring Context:提供了配置文件解析、资源访问、事件传播等功能,是Spring框架的核心容器之一。
  3. Spring Bean:提供了Bean的定义、生命周期管理和装配功能。
  4. Spring AOP:提供了面向切面编程的功能,支持横切关注点的分离。
  5. Spring DAO:提供了简单的数据访问对象抽象层,简化了数据库访问操作。
  6. Spring MVC:提供了一个基于Model-View-Controller模式的Web框架,支持Web应用开发。
  7. Spring Transaction:提供了事务管理功能,支持编程式和声明式事务管理。
  8. Spring Web:提供了基于Servlet API的Web开发支持。
  9. Spring Test:提供了测试支持,使得测试Spring应用程序更加简单。
Spring环境搭建
开发环境准备

为了能够开发和运行Spring应用程序,需要准备以下开发环境:

  • JDK:需要安装JDK,推荐使用JDK 8及以上版本。
  • IDE:推荐使用IntelliJ IDEA或Eclipse,这两个IDE支持Spring开发。
  • Maven:需要安装Maven构建工具,用于项目依赖管理和构建。
  • Spring Boot:推荐使用Spring Boot,它简化了Spring应用的配置。
Maven依赖配置

为了使用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中实现IoC与DI

在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生命周期中的回调方法,如InitializingBeanDisposableBean接口中的方法,以及通过@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)。

  • 切面:将横切关注点封装成模块化组件。
  • 通知:定义了切面何时执行。通知可以是前置通知、后置通知、环绕通知等。
  • 切点:定义了连接点的位置。切点表达式定义了哪些方法或操作符符合连接点条件。
  • 连接点:程序执行过程中的一个点,如方法调用、异常抛出等。
  • 织入:将切面应用到目标对象的过程。
使用Spring实现AOP的方法

示例代码

@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注解。
Spring MVC框架入门
MVC设计模式的基本概念

MVC(Model-View-Controller)是一种设计模式,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。

  • 模型(Model):模型代表应用程序中的数据和业务逻辑。模型封装了应用程序的状态,并提供操作数据的方法。
  • 视图(View):视图负责展示模型中的数据。视图与模型分离,可以根据模型中的数据动态生成界面。
  • 控制器(Controller):控制器作为模型和视图之间的中介,接收用户的请求,调用模型的方法,将结果交给视图进行展示。
Spring MVC的工作流程

Spring MVC的工作流程如下:

  1. 客户端发送请求到前端控制器(DispatcherServlet)。
  2. 前端控制器根据请求的信息(如URL)调用处理器映射器(HandlerMapping)。
  3. 处理器映射器根据请求信息查找处理器,并返回处理器(Controller)和处理器的执行链(HandlerExecutionChain)。
  4. 前端控制器调用处理器适配器(HandlerAdapter),处理器适配器执行处理器逻辑,返回ModelAndView。
  5. 前端控制器收集处理器返回的ModelAndView对象中的视图名,并调用视图解析器(ViewResolver)解析视图。
  6. 视图解析器将视图名转换为视图对象。
  7. 视图对象将最终的视图渲染成实际的HTML页面返回给前端控制器。
  8. 前端控制器将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中的事务管理方式

Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。

编程式事务管理

编程式事务管理通过编程的方式管理事务。可以通过TransactionTemplatePlatformTransactionManager实现编程式事务管理。

声明式事务管理

声明式事务管理通过配置文件或注解的方式管理事务。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) {
        // 删除用户
    }
}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消