📜  Spring中的依赖注入(1)

📅  最后修改于: 2023-12-03 15:05:16.789000             🧑  作者: Mango

Spring中的依赖注入

什么是依赖注入(DI)?

依赖注入(DI)是一种设计模式,它可以使我们的应用程序设计更灵活,易于扩展,降低耦合性。其核心思想就是:把对象的创建和相互依赖关系的管理交给Spring容器来完成。

Spring中的依赖注入

在Spring中,我们通过Bean容器来实现依赖注入。Bean容器会负责管理对象的生命周期,我们只需要在配置文件或者注解中声明Bean之间的依赖关系即可。

注入方式

Spring中支持以下几种方式进行依赖注入:

  1. 构造函数注入

    构造函数注入是通过在类的构造函数中注入依赖项来完成的。Spring在调用构造函数创建一个新实例时,会根据参数类型和名称来查找对应的依赖项并注入到构造函数中。

    public class UserServiceImpl implements UserService {
        private final UserDao userDao;
    
        public UserServiceImpl(UserDao userDao) {
            this.userDao = userDao;
        }
    }
    
  2. Setter方法注入

    setter方法注入是通过Setter方法来注入依赖项的。

    public class UserServiceImpl implements UserService {
        private UserDao userDao;
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    }
    
  3. 字段注入

    字段注入是直接对类的字段进行注入。

    public class UserServiceImpl implements UserService {
        @Autowired
        private UserDao userDao;
    }
    
注入其它Bean

当一个Bean需要引用另一个Bean时,我们可以使用@Autowired或者@Resource注解来进行注入。

public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
}
<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao" />
</bean>
<bean id="userDao" class="com.example.UserDaoImpl" />
注入常量和配置文件中的值

除了注入Bean,Spring还支持注入常量和配置文件中的值。

public class Config {
    @Value("123")
    private int intValue;
 
    @Value("hello")
    private String stringValue;
    
    @Value("${app.baseUrl}")
    private String baseUrl;
}
<context:property-placeholder location="classpath:config.properties" />
<bean id="config" class="com.example.Config">
    <property name="intValue" value="123" />
    <property name="stringValue" value="hello" />
    <property name="baseUrl" value="${app.baseUrl}" />
</bean>
自动装配

自动装配是一个简化注入的方式,Spring会自动在Bean中查找依赖项并注入。有以下几种自动装配模式:

  1. byName

    自动按照属性名称进行装配。

    <bean id="userService" class="com.example.UserServiceImpl" autowire="byName">
        <!-- userDAO bean 必须被命名为 userDAO -->
        <property name="userDAO" ref="userDAO" />
    </bean>
    <bean id="userDAO" class="com.example.UserDAOImpl" />
    
  2. byType

    自动按照属性类型进行装配。

    <bean id="userService" class="com.example.UserServiceImpl" autowire="byType">
        <!-- 只要存在一个 UserDAOImpl 类型的 bean,就会被注入 -->
        <property name="userDAO" />
    </bean>
    <bean id="userDAO" class="com.example.UserDAOImpl" />
    
  3. constructor

    自动按照构造函数参数类型进行装配。

    <bean id="userService" class="com.example.UserServiceImpl" autowire="constructor">
        <!-- 构造函数参数为 UserDAOImpl 类型的 bean 会被注入 -->
        <constructor-arg name="userDAO" />
    </bean>
    <bean id="userDAO" class="com.example.UserDAOImpl" />
    
优点

依赖注入可以使我们的应用程序更加灵活、易于扩展。主要优点如下:

  1. 降低耦合性

    Spring负责创建和管理对象,应用程序只需要声明依赖关系即可。这样可以降低对象之间的耦合性,使应用程序更加灵活、易于维护。

  2. 易于测试

    由于依赖关系是在Bean容器中进行管理的,因此可以轻松地进行模拟测试。

  3. 模块化

    依赖注入使得模块之间的依赖关系更加清晰明了,不同的模块之间可以更加独立。这样可以提高应用程序的可维护性和扩展性。

总结

依赖注入是一种非常重要的设计模式,可以使我们的应用程序更加灵活、易于扩展、降低耦合性。除了DI,Spring还提供了很多其他的功能,如AOP、事务管理等。掌握Spring框架可以让我们写出更加高效、优雅的Java应用程序。