Spring 概念汇总

一、Spring中的依赖注入和依赖反转

  1. 依赖注入(Dependency Injection)
    • 概念
      • 依赖注入是一种设计模式,它允许在对象创建时将其依赖的对象传递给它,而不是让对象自己去创建或查找依赖对象。在Spring中,依赖注入是控制反转(Inversion of Control,IoC)的一种具体实现方式。
    • 注入方式
      • 构造函数注入
        • 通过类的构造函数来注入依赖对象。例如:
java 复制代码
public class MyClass {
    private MyDependency dependency;

    public MyClass(MyDependency dependency) {
        this.dependency = dependency;
    }
}

在Spring配置中,可以这样配置:

xml 复制代码
<bean id="myDependency" class="com.example.MyDependency"/>
<bean id="myClass" class="com.example.MyClass">
    <constructor-arg ref="myDependency"/>
</bean>

或者使用Java配置:

java 复制代码
@Configuration
public class AppConfig {
    @Bean
    public MyDependency myDependency() {
        return new MyDependency();
    }

    @Bean
    public MyClass myClass() {
        return new MyClass(myDependency());
    }
}
复制代码
 - **Setter方法注入**
   - 通过类的Setter方法来注入依赖对象。例如:
java 复制代码
public class MyClass {
    private MyDependency dependency;

    public void setDependency(MyDependency dependency) {
        this.dependency = dependency;
    }
}

在Spring配置中:

xml 复制代码
<bean id="myDependency" class="com.example.MyDependency"/>
<bean id="myClass" class="com.example.MyClass">
    <property name="dependency" ref="myDependency"/>
</bean>

或者Java配置:

java 复制代码
@Configuration
public class AppConfig {
    @Bean
    public MyDependency myDependency() {
        return new MyDependency();
    }

    @Bean
    public MyClass myClass() {
        MyClass myClass = new MyClass();
        myClass.setDependency(myDependency());
        return myClass;
    }
}
复制代码
 - **接口注入(不常用)**
   - 通过实现特定的接口来注入依赖对象。这种方式在实际应用中相对较少使用。
  1. 依赖反转(Dependency Inversion)
    • 概念
      • 依赖反转原则(DIP)是面向对象设计的五大原则之一。它强调高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。在Spring中,依赖反转主要体现在将对象的创建和依赖关系的管理交给容器来完成。
    • 在Spring中的体现
      • 对象创建的反转
        • 在传统的编程方式中,对象通常是由使用它的类自己创建的。例如:
java 复制代码
public class MyService {
    private MyRepository repository = new MyRepository();

    public void doSomething() {
        repository.saveData();
    }
}

在Spring中,对象的创建由容器负责。例如:

java 复制代码
@Service
public class MyService {
    private MyRepository repository;

    @Autowired
    public MyService(MyRepository repository) {
        this.repository = repository;
    }

    public void doSomething() {
        repository.saveData();
    }
}

这里的MyRepository对象不是由MyService自己创建,而是由Spring容器创建并注入到MyService中。

  • 依赖关系管理的反转

  • 传统方式下,对象之间的依赖关系是在代码中硬编码的。而在Spring中,依赖关系由容器根据配置来管理。通过配置文件(如XML配置文件)或注解(如@Autowired@Qualifier等)来指定对象之间的依赖关系,使得代码更加灵活和易于维护。例如,在XML配置中可以指定多个不同实现的依赖关系:

xml 复制代码
<bean id="myRepositoryImpl1" class="com.example.MyRepositoryImpl1"/>
<bean id="myRepositoryImpl2" class="com.example.MyRepositoryImpl2"/>
<bean id="myService" class="com.example.MyService">
    <property name="repository" ref="myRepositoryImpl1"/>
</bean>

可以通过修改配置文件轻松地切换MyService所依赖的MyRepository的具体实现。

相关推荐
qq_229058014 分钟前
docker中检测进程的内存使用量
java·docker·容器
我真的是大笨蛋17 分钟前
InnoDB行级锁解析
java·数据库·sql·mysql·性能优化·数据库开发
钦拆大仁20 分钟前
Java设计模式-单例模式
java·单例模式·设计模式
小手cool36 分钟前
在保持数组中对应元素(包括负数和正数)各自组内顺序不变的情况下,交换数组中对应的负数和正数元素
java
笨手笨脚の41 分钟前
深入理解 Java 虚拟机-04 垃圾收集器
java·jvm·垃圾收集器·垃圾回收
skywalker_111 小时前
Java中异常
java·开发语言·异常
没有天赋那就反复1 小时前
JAVA 静态方法
java·开发语言
代码丰1 小时前
SpringAI+RAG向量库+知识图谱+多模型路由+Docker打造SmartHR智能招聘助手
人工智能·spring·知识图谱
Java天梯之路1 小时前
Spring Boot 钩子全集实战(七):BeanFactoryPostProcessor详解
java·spring boot·后端
wr2005142 小时前
第二次作业,渗透
java·后端·spring