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

相关推荐
hrrrrb40 分钟前
【Spring Security】Spring Security 概念
java·数据库·spring
小信丶41 分钟前
Spring 中解决 “Could not autowire. There is more than one bean of type“ 错误
java·spring
周杰伦_Jay2 小时前
【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
java·jvm
摇滚侠3 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
程序员小凯5 小时前
Spring Boot测试框架详解
java·spring boot·后端
豐儀麟阁贵5 小时前
基本数据类型
java·算法
_extraordinary_6 小时前
Java SpringMVC(二) --- 响应,综合性练习
java·开发语言
你的人类朋友6 小时前
什么是断言?
前端·后端·安全
程序员 Harry6 小时前
深度解析:使用ZIP流式读取大型PPTX文件的最佳实践
java
程序员小凯7 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存