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的具体实现。

相关推荐
颜淡慕潇5 分钟前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes
ProtonBase11 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
乐之者v17 分钟前
leetCode43.字符串相乘
java·数据结构·算法
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
向前看-7 小时前
验证码机制
前端·后端
xlsw_7 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹8 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭9 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫9 小时前
泛型(2)
java