所有文章 > 日积月累 > 全网最详细的Spring入门教程
全网最详细的Spring入门教程

全网最详细的Spring入门教程

为什么用Spring

Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring 的一个最大的目标就是使 JAVA EE 开发更加容易。它通过提供一个统一的、高效的方式来构造整个应用,可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说,Spring 是一个提供了更完善开发环境的框架,可以为 POJO (Plain Ordinary Java Object) 对象提供企业级的服务。

Spring的特性和优势

Spring的特性

  • 非侵入式:基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API。
  • 控制反转 (IoC):将对象的创建权交给 Spring 框架,实现松耦合。
  • 依赖注入 (DI):通过配置赋值而不需要手动调用 setXX 方法去设置。
  • 面向切面编程 (AOP):把应用业务逻辑和系统服务分开,通过切面和模板减少样板式代码。
  • 容器:Spring 是一个容器,管理应用对象的生命周期。
  • 组件化:通过简单的组件配置组合成复杂的应用。
  • 声明式事务支持:通过声明式方式灵活地进行事务的管理。
  • 一站式:在 IoC 和 AOP 的基础上整合企业应用的开源框架和优秀的第三方类库。

Spring的优势

  • 使用 POJOs 开发企业级应用程序,不需要应用程序服务器。
  • Spring 在一个单元模式中是有组织的,开发者只需关注需要的部分。
  • 整合现有的技术如 ORM 框架、日志框架、JEE、Quartz 和 JDK 计时器。
  • 测试 Spring 应用程序方便,因为环境相关的代码被移动到框架中。
  • Spring 的 Web 框架是一个设计良好的 Web MVC 框架,提供了很好的替代选择。
  • 提供对 JavaEE 开发中复杂 API 的封装,降低应用难度。

Spring的组件

Spring5.x主要模块

Spring5.x 版本中 Web 模块的 Portlet 组件已经被废弃掉,同时增加了用于异步响应式处理的 WebFlux 组件。

Spring 各个模块的依赖关系

Spring Test

Spring 团队提倡测试驱动开发(TDD)。有了控制反转 (IoC)的帮助,单元测试和集成测试变得更简单。Spring 的测试模块对 JUnit、TestNG、Mockito、PowerMock 等常用测试框架有良好的支持,并且提供了模拟 Http 请求等基于 Spring 的测试功能。

Core Container

Spring 框架的核心模块,主要提供 IoC 依赖注入功能的支持,由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成。没有这些核心容器,也就不可能有 AOP、Web 等上层的功能。

AOP、Aspects、Instrumentation和Messaging

这些模块提供了面向切面编程、与 AspectJ 的集成支持、为 JVM 添加代理的功能、基础的报文传送应用支持等。

Data Access/Integration

这些模块提供了对数据库访问的抽象、编程和声明式事务管理、对 ORM 框架的支持、OXM 支持、JMS 支持等。

Spring Web

提供了基本的 Web 开发集成特性、Spring MVC Web 框架实现、WebSocket 支持、WebFlux 支持等。

Spring、SpringMVC、SpringBoot之间的关系

Spring 包含多个功能模块,其中最重要的是 Spring-Core 模块,其他模块如 Spring MVC 的功能实现基本都依赖于该模块。Spring MVC 是 Spring 中的一个重要模块,主要赋予快速构建 MVC 架构的能力。Spring Boot 旨在简化 Spring 开发,减少配置文件,实现开箱即用。

HelloWorld-xml

案例

案例源码点击 这里

引入依赖


    8
    8
    5.3.37
    1.9.6


    
        org.springframework
        spring-context
        ${spring.version}
    
    
        org.springframework
        spring-core
        ${spring.version}
    
    
        org.springframework
        spring-beans
        ${spring.version}
    
    
        org.aspectj
        aspectjweaver
        ${aspectjweaver.version}
    

POJO – User

public class User {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

DAO 获取 POJO, UserDaoServiceImpl (mock 数据)

public class UserDaoImpl{
    public List findUserList() {
        return Collections.singletonList(new User("seven", 18));
    }
}

业务层 UserServiceImpl(调用DAO层)

public class UserServiceImpl {
    private UserDaoImpl userDao;
    public void setUserDao(UserDaoImpl userDao) {
        this.userDao = userDao;
    }
    public List findUserList() {
        return userDao.findUserList();
    }
}

拦截所有service中的方法,并输出记录

@Aspect
public class LogAspect {
    @Around("execution(* com.seven.springhelloworldxml.service.*.*(..))")
    public Object businessService(ProceedingJoinPoint pjp) throws Throwable {
        Method method = ((MethodSignature) pjp.getSignature()).getMethod();
        System.out.println("execute method: " + method.getName());
        return pjp.proceed();
    }
}

添加并增加spring.xml和aspects.xml



    
    
    
        
    


    
    
    
    

APP中设置xml文件

public class APP {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("aspects.xml", "spring.xml");
        UserServiceImpl service = context.getBean("userService", UserServiceImpl.class);
        List userList = service.findUserList();
        userList.forEach(a -> System.out.println(a.getName() + "," + a.getAge()));
    }
}

运行结果:
运行结果

如何体现的Spring优势

控制反转 – IOC

控制反转是一种设计思想,Spring 通过 IoC 容器来实现这一特性。用户不再需要手动创建对象,而是由 Spring 框架负责管理对象的创建和生命周期。这不仅提高了代码的可维护性,还使得组件之间的依赖关系变得更加清晰。

面向切面 – AOP

AOP 的核心思想是将业务逻辑与系统服务逻辑分开,通过定义切面来实现解耦。Spring 的 AOP 模块通过动态代理技术在运行时将切面逻辑织入到目标对象中,从而实现日志记录、事务管理等功能的非侵入式集成。

Spring框架逐步简化开发

Java 配置方式改造

在传统的 Spring 配置中,XML 被广泛用于定义 Bean 和其依赖关系。然而,XML 配置容易变得冗长和难以维护。Java 配置通过注解和 Java 类来替代 XML 配置,使得配置更加直观和易于管理。

代码示例

@EnableAspectJAutoProxy
@Configuration
public class BeansConfig {
    @Bean("userDao")
    public UserDaoImpl userDao() {
        return new UserDaoImpl();
    }
    @Bean("userService")
    public UserServiceImpl userService() {
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(userDao());
        return userService;
    }
    @Bean("logAspect")
    public LogAspect logAspect() {
        return new LogAspect();
    }
}

注解配置方式改造

随着 Java 5 引入注解,Spring 从 2.5 版本开始支持基于注解的配置。通过注解,开发者可以简化 Bean 的定义和依赖注入过程。

代码示例

@Service
public class UserServiceImpl {
    @Autowired
    private UserDaoImpl userDao;
    public List findUserList() {
        return userDao.findUserList();
    }
}

SpringBoot托管配置

Spring Boot 通过约定大于配置的理念,进一步简化了 Spring 应用的开发。它提供了一系列的 starter 包,帮助开发者快速搭建项目。

FAQ

  1. 问:Spring 框架的主要特点是什么?

    • 答:Spring 框架的主要特点包括控制反转、依赖注入、面向切面编程、非侵入式开发、声明式事务管理等。
  2. 问:如何使用 Spring 进行依赖注入?

    • 答:Spring 提供了多种方式进行依赖注入,包括构造器注入、Setter 方法注入和基于注解的注入。
  3. 问:什么是 Spring Boot?

    • 答:Spring Boot 是 Spring 的一个子项目,旨在简化 Spring 应用的开发,提供了一种快速构建独立、生产级 Spring 应用的方式。
  4. 问:Spring AOP 是如何工作的?

    • 答:Spring AOP 通过使用代理模式,在编译时、加载时或运行时将切面代码织入到业务代码中,实现功能的横切。
  5. 问:Spring MVC 和 Spring Boot 有什么区别?

    • 答:Spring MVC 是用于构建 Web 应用程序的框架,而 Spring Boot 是用于简化 Spring 应用开发的框架,Spring MVC 可以作为 Spring Boot 的一部分使用。
#你可能也喜欢这些API文章!