📅  最后修改于: 2023-12-03 15:05:16.789000             🧑  作者: Mango
依赖注入(DI)是一种设计模式,它可以使我们的应用程序设计更灵活,易于扩展,降低耦合性。其核心思想就是:把对象的创建和相互依赖关系的管理交给Spring容器来完成。
在Spring中,我们通过Bean容器来实现依赖注入。Bean容器会负责管理对象的生命周期,我们只需要在配置文件或者注解中声明Bean之间的依赖关系即可。
Spring中支持以下几种方式进行依赖注入:
构造函数注入
构造函数注入是通过在类的构造函数中注入依赖项来完成的。Spring在调用构造函数创建一个新实例时,会根据参数类型和名称来查找对应的依赖项并注入到构造函数中。
public class UserServiceImpl implements UserService {
private final UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
}
Setter方法注入
setter方法注入是通过Setter方法来注入依赖项的。
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
字段注入
字段注入是直接对类的字段进行注入。
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
}
当一个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中查找依赖项并注入。有以下几种自动装配模式:
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" />
byType
自动按照属性类型进行装配。
<bean id="userService" class="com.example.UserServiceImpl" autowire="byType">
<!-- 只要存在一个 UserDAOImpl 类型的 bean,就会被注入 -->
<property name="userDAO" />
</bean>
<bean id="userDAO" class="com.example.UserDAOImpl" />
constructor
自动按照构造函数参数类型进行装配。
<bean id="userService" class="com.example.UserServiceImpl" autowire="constructor">
<!-- 构造函数参数为 UserDAOImpl 类型的 bean 会被注入 -->
<constructor-arg name="userDAO" />
</bean>
<bean id="userDAO" class="com.example.UserDAOImpl" />
依赖注入可以使我们的应用程序更加灵活、易于扩展。主要优点如下:
降低耦合性
Spring负责创建和管理对象,应用程序只需要声明依赖关系即可。这样可以降低对象之间的耦合性,使应用程序更加灵活、易于维护。
易于测试
由于依赖关系是在Bean容器中进行管理的,因此可以轻松地进行模拟测试。
模块化
依赖注入使得模块之间的依赖关系更加清晰明了,不同的模块之间可以更加独立。这样可以提高应用程序的可维护性和扩展性。
依赖注入是一种非常重要的设计模式,可以使我们的应用程序更加灵活、易于扩展、降低耦合性。除了DI,Spring还提供了很多其他的功能,如AOP、事务管理等。掌握Spring框架可以让我们写出更加高效、优雅的Java应用程序。