spring框架基础

IoC

控制反转(Inversion of Control,IoC)是一种设计原则,用于减少计算机程序中的耦合度,提高模块化。在Java开发中,IoC通常通过依赖注入来实现。

1.什么是控制反转

在传统的程序设计中,对象的创建和对象间的依赖关系是由对象自身控制的。例如,如果一个类A需要使用类B的功能,那么类A会在自己的代码中直接创建类B的实例。这种设计会导致类A和类B之间的耦合度很高,不利于代码的重用和测试。

IoC的核心思想是将对象的创建和对象间依赖关系的控制权从对象本身转移到外部容器。这样,对象就不再需要自己创建或管理依赖,而是通过容器来注入所需的依赖。

2.IoC的主要特点:

  1. 解耦:对象不再需要知道如何创建或获取它们的依赖,从而降低了对象之间的耦合度。
  2. 模块化:由于依赖关系由外部控制,各个模块可以独立开发和测试。
  3. 可测试性:在测试时,可以轻松地替换对象的依赖,进行单元测试。
  4. 灵活性:通过配置文件或注解来管理依赖关系,使得代码更加灵活。

3.IoC容器的作用:

  1. 实例化对象:容器负责创建对象实例。
  2. 管理对象的生命周期:容器可以管理对象的创建、销毁以及生命周期中的各个阶段。
  3. 依赖注入:容器负责将对象的依赖关系注入到对象中。
  4. 配置管理:容器可以读取配置文件,根据配置来创建和配置对象。

4.依赖注入:

依赖注入是实现IoC的一种方式,它包括以下三种主要形式:

  1. 构造器注入:通过构造器将依赖传递给对象。
  2. Setter注入:通过Setter方法将依赖设置到对象中。
  3. 字段注入:直接将依赖注入到对象的字段中(不推荐,因为不够灵活)。

5.IoC容器的工作流程:

  1. 配置元数据:通过XML、注解或Java配置类定义对象的创建和依赖关系。
  2. 容器读取配置:IoC容器读取配置元数据,并创建一个或多个应用程序上下文(ApplicationContext)。
  3. 创建对象:容器根据配置创建对象实例。
  4. 依赖注入:容器解析对象的依赖关系,并注入相应的依赖。
  5. 对象使用:应用程序使用由IoC容器创建和管理的对象。

Bean的定义和生命周期

什么是Bean?

在Spring中,Bean是构成应用程序主体的组件,由Spring IoC容器实例化、配置和管理的对象。Bean可以是服务、数据访问对象、控制器、工具类等。

Bean的配置

Bean可以通过XML配置文件、注解或Java配置类来定义。

  • XML配置:使用<bean>标签定义Bean的类、作用域、生命周期回调等。
  • 注解配置:使用@Component、@Service、@Repository、@Controller等注解标记类作为Bean,并使用@Autowired等注解注入依赖。
  • Java配置:使用@Configuration注解的类和@Bean注解的方法定义Bean。

Bean的生命周期

Bean的生命周期是指Spring容器从创建一个Bean实例到最终销毁这个实例所经历的一系列过程。

1.实例化Bean

Spring容器使用Bean定义中的类信息创建Bean实例,如果Bean定义了构造器参数,Spring将使用这些参数来创建实例。

2.依赖注入

一旦Bean实例化完成,Spring容器将根据配置信息注入所需的依赖项,即设置Bean的属性。

3.初始化

默认为init,可以通过init-method属性指定一个自定义的初始化方法,Spring容器会在Bean属性设置和InitializingBean接口调用之后调用这个方法。

4.使用阶段

此时,Bean已经准备好,可以被应用程序使用。

5.销毁

通过默认方法destro销毁。

常用注解

Spring的注解配置提供了一种简洁、更符合Java习惯的配置方法,相比XML配置文件,注解配置可以减少大量的XML配置代码,使得配置更加直观和易于维护,以下是Spring中常用的注解配置:

1.@Configuration

这个注解用于声明一个配置类,相当于XML配置中的<beans>标签。在配置类中,可以使用@Bean注解来声明Spring容器中的Bean。

java 复制代码
@Configuration
public class BeanConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

2.@Component

这个注解用于声明一个组件,通常用于标识受Spring IoC容器管理的类。被@Component注解的类会被自动扫描并注册为Bean,而**@Service,@Repository,@Controller**,这些注解是@Component的特化,用于标识特定类型的组件:

  1. @Service:用于服务层组件。
  2. @Repository:用于数据访问层组件。
  3. @Controller:用于表示层组件,如Spring MVC的控制器。

3.@Autowired

用于自动注入依赖的Bean,可以用于构造器、字段或Setter方法。

java 复制代码
@Service
public class AddVideoService {

    int id = 0;
    boolean o = true;
    @Autowired
    private AddVideoMapper addVideoMapper;

    @Transactional
    public int addVideo(String video ,String title){
        while (o==true) {
            id++;
            int count = addVideoMapper.checkID(id);
            if (count == 0){
                o = false;
            }

        }
        return addVideoMapper.addVideo(video,title,id);

    }
}

4.@Qualifier

当有多个相同类型的Bean时,@Qualifier注解可以指定需要注入的具体Bean的名称。

java 复制代码
@Autowired
@Qualifier("specificBean")
private MyBean myBean;

5.@Value

用于将配置文件中的值注入到Bean的字段中。

java 复制代码
@Component
public class MyBean {
    @Value("${property.name}")
    private String name;
}

6.@ComponentScan

用于指定Spring在启动时扫描组件的位置。

java 复制代码
@Configuration
@ComponentScan(basePackages = "com.me.myapp")
public class MyConfig {
    // ...
}

注解配置使得Spring的配置更加简洁和灵活,同时也使得代码更加易于理解和维护。

相关推荐
风铃儿~8 小时前
Spring AI 入门:Java 开发者的生成式 AI 实践之路
java·人工智能·spring
hstar952712 小时前
三十三、面向对象底层逻辑-SpringMVC九大组件之HandlerExceptionResolver接口设计
java·spring·设计模式·架构
面朝大海,春不暖,花不开12 小时前
Spring Security默认配置覆盖指南
java·后端·spring
IT_Octopus14 小时前
多线程下使用缓存+锁Lock, 出现“锁失效” + “缓存未命中竞争”的缓存击穿情况,双重检查缓存解决问题
java·spring·缓存
qq_3380329219 小时前
Spring Boot/Spring应用中配置自定义RedisTemplate
spring boot·redis·spring
考虑考虑19 小时前
Springboot3.5.x版本actuator新属性
spring boot·后端·spring
萌新小码农‍1 天前
Spring框架学习day7--SpringWeb学习(概念与搭建配置)
学习·spring·状态模式
Mr Aokey1 天前
Spring MVC参数绑定终极手册:单&多参/对象/集合/JSON/文件上传精讲
java·后端·spring
长勺1 天前
Spring中@Primary注解的作用与使用
java·后端·spring
想用offer打牌1 天前
面试回答喜欢用构造器注入,面试官很满意😎...
后端·spring·面试