Spring

Spring框架全面详解

1. Spring框架简介

Spring是一个开源的轻量级Java开发框架,旨在简化企业级应用开发。它最初由Rod Johnson在2003年创建,现由Pivotal团队维护。

核心特点

  • 轻量级:非侵入性设计,不强制依赖Spring的API
  • 依赖注入:通过IoC机制降低组件间耦合度
  • 面向切面编程:通过AOP实现横切关注点的模块化
  • 容器:管理对象的配置和生命周期
  • 一站式框架:提供从表现层到持久层的完整解决方案

主要模块

  • Spring Core:提供IoC容器的基础功能
  • Spring AOP:提供面向切面编程的实现
  • Spring JDBC:简化JDBC操作
  • Spring ORM:支持JPA、Hibernate等ORM框架
  • Spring Web:提供Web开发相关功能
  • Spring MVC:实现了MVC设计模式的Web框架
  • Spring Security:提供安全框架
  • Spring Test:支持单元测试和集成测试

2. Spring官方压缩包目录介绍

Spring官方发布的压缩包主要包含以下目录结构:

  • docs/:包含API文档和开发指南
  • libs/:包含Spring框架的核心JAR文件
    • spring-core.jar:提供基础功能,包括IoC和依赖注入
    • spring-beans.jar:提供BeanFactory,实现工厂模式
    • spring-context.jar:提供ApplicationContext,扩展了BeanFactory
    • spring-expression.jar:提供SpEL表达式支持
    • spring-aop.jar:提供AOP功能
    • spring-web.jar:提供Web应用的基础功能
    • spring-webmvc.jar:实现了Spring MVC
    • spring-jdbc.jar:提供JDBC抽象层
    • spring-tx.jar:提供事务管理
    • spring-test.jar:提供测试支持
  • schema/:包含XML配置文件的模式定义
  • license.txt:许可证信息
  • notice.txt:版权和法律通知
  • readme.txt:简介和使用说明

3. Spring环境搭建

Maven方式配置

pom.xml中添加Spring依赖:



    org.springframework
    spring-context
    5.3.9




    org.springframework
    spring-webmvc
    5.3.9




    org.springframework
    spring-jdbc
    5.3.9

Gradle方式配置

build.gradle中添加Spring依赖:

implementation 'org.springframework:spring-context:5.3.9'
implementation 'org.springframework:spring-webmvc:5.3.9'
implementation 'org.springframework:spring-jdbc:5.3.9'

创建配置文件

src/main/resources下创建applicationContext.xml



    

Java配置类

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

启动Spring容器

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
// XML方式
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

// 注解方式
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

4. IoC/DI容器详解

IoC(控制反转)概念

控制反转是一种设计原则,将传统上由应用程序代码直接控制的对象的创建和管理权,转移给外部容器或框架。在Spring中,IoC容器负责创建、配置和管理对象及其之间的依赖关系。

核心优势

  • 降低组件之间的耦合度
  • 提高代码的可测试性
  • 提高模块的可重用性
  • 提高系统的可维护性

DI(依赖注入)实现

依赖注入是IoC的一种实现方式,由容器将依赖关系注入到组件中:

Spring提供两种IoC容器

  1. BeanFactory

    • Spring最基本的IoC容器
    • 延迟加载Bean对象
    • 适用于资源有限的环境
  2. ApplicationContext

    • 扩展了BeanFactory的功能
    • 提供更多企业级功能
    • 支持国际化
    • 支持事件发布
    • 支持应用层特定的上下文
    • 预加载Bean定义

ApplicationContext主要实现类

  • ClassPathXmlApplicationContext:从类路径加载配置文件
  • FileSystemXmlApplicationContext:从文件系统加载配置文件
  • AnnotationConfigApplicationContext:基于Java注解配置
  • WebApplicationContext:用于Web应用的上下文

5. Spring创建Bean的三种方式

1. 构造方法创建Bean

最常用的方式,通过默认构造方法创建Bean:


或使用Java配置:

@Bean
public UserService userService() {
    return new UserServiceImpl();
}

2. 静态工厂方法创建Bean

通过调用静态工厂方法创建Bean:


对应的工厂类:

public class ServiceFactory {
    public static UserService createUserService() {
        return new UserServiceImpl();
    }
}

Java配置方式:

@Bean
public UserService userService() {
    return ServiceFactory.createUserService();
}

3. 实例工厂方法创建Bean

通过调用实例工厂的方法创建Bean:



对应的工厂类:

public class ServiceFactory {
    public UserService createUserService() {
        return new UserServiceImpl();
    }
}

Java配置方式:

@Bean
public ServiceFactory serviceFactory() {
    return new ServiceFactory();
}

@Bean
public UserService userService() {
    return serviceFactory().createUserService();
}

6. scope属性讲解

Bean的scope属性定义了Bean的作用域和生命周期:

1. singleton(单例,默认)

  • 整个应用中只创建一个Bean实例
  • Spring容器负责管理Bean的完整生命周期
  • 适用于无状态的Bean

@Bean
@Scope("singleton")
public UserService userService() {
    return new UserServiceImpl();
}

2. prototype(原型)

  • 每次请求都创建一个新的Bean实例
  • 容器只负责创建,不负责销毁
  • 适用于有状态的Bean

@Bean
@Scope("prototype")
public UserService userService() {
    return new UserServiceImpl();
}

3. request(Web环境)

  • 每个HTTP请求创建一个新的Bean实例
  • 请求结束时销毁
  • 仅在Web应用中有效

@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public UserForm userForm() {
    return new UserForm();
}

4. session(Web环境)

  • 每个HTTP会话创建一个新的Bean实例
  • 会话结束时销毁
  • 仅在Web应用中有效

@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public UserPreferences userPreferences() {
    return new UserPreferences();
}

5. application(Web环境)

  • 每个ServletContext创建一个新的Bean实例
  • 应用程序关闭时销毁
  • 类似于singleton,但限定在ServletContext范围内

@Bean
@Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public AppConfig appConfig() {
    return new AppConfig();
}

7. Spring中几种注入方式

1. 构造函数注入

通过构造函数参数注入依赖:


    

Java代码:

public class UserServiceImpl implements UserService {
    private final UserDao userDao;
    
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }
}

Java配置:

@Bean
public UserService userService(UserDao userDao) {
    return new UserServiceImpl(userDao);
}

2. Setter方法注入

通过setter方法注入依赖:


    

Java代码:

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

Java配置:

@Bean
public UserService userService() {
    UserServiceImpl service = new UserServiceImpl();
    service.setUserDao(userDao());
    return service;
}

3. 字段注入(基于注解)

直接在字段上使用@Autowired注解:

public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
}

4. 接口注入(不常用)

通过特定接口实现依赖注入:

public interface DaoAware {
    void setDao(Object dao);
}

public class UserServiceImpl implements UserService, DaoAware {
    private UserDao userDao;
    
    @Override
    public void setDao(Object dao) {
        this.userDao = (UserDao) dao;
    }
}

5. 自动装配(autowire)

让Spring自动解析依赖关系:


常用的自动装配模式:

  • byName:根据属性名匹配Bean
  • byType:根据属性类型匹配Bean
  • constructor:根据构造参数类型匹配Bean

8. 静态代理设计模式

静态代理是一种结构型设计模式,代理类和被代理类在编译时就已经确定。

基本原理

  1. 定义一个接口
  2. 创建实现该接口的目标类(被代理类)
  3. 创建代理类,同样实现该接口
  4. 代理类中持有目标类的引用,通过代理类间接访问目标类

实现步骤

1. 定义接口

public interface UserService {
    void addUser(String username);
    void deleteUser(String username);
}

2. 实现目标类

public class UserServiceImpl implements UserService {
    @Override
    public void addUser(String username) {
        System.out.println("添加用户: " + username);
    }
    
    @Override
    public void deleteUser(String username) {
        System.out.println("删除用户: " + username);
    }
}

3. 实现代理类

publi

你可能感兴趣的:(Spring,spring,java,后端)