前言
在现代 Java 开发中,Spring 框架以其强大的功能和灵活性成为了开发者的首选。作为 Spring 的核心特性之一,依赖注入(Dependency Injection, DI)提供了一种松耦合的方式来管理应用程序中的对象和它们之间的关系。通过依赖注入,我们可以将对象的创建和管理交给 Spring 容器,从而提高了代码的可测试性、可维护性以及灵活性。
本博客将深入探讨 Spring 中 Bean 的依赖注入配置,包括基于 XML 配置和注解配置两种方式。同时,我们还将介绍一些常用的 Spring 配置标签,帮助开发者更好地理解如何管理和配置应用程序中的 Bean。通过这些内容,您将能够掌握 Spring 的基本配置技巧,并为构建复杂的企业级应用打下坚实的基础。
基于Xml的Bean配置
Bean的依赖注入配置

其中,ref是reference的缩写形式,翻译为:涉及,参考的意思,用于引用其他Bean的id。value用于注入普通属性值。
依赖注入的数据类型有如下三种:
- 普通数据类型,例如:String、int、boolean等,通过value属性指定。
- 引用数据类型,例如:UserDaolmpl、DataSource等,通过ref属性指定。
- 集合数据类型,例如:List、Map、Properties等。
java
public class UserServiceImpl implements UserService {
private List<String> strings;
public void setStrings(List<String> strings) {
this.strings = strings;
}
public void show(){
System.out.println(strings);
}
....
}
xml
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="strings">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
</bean>
测试代码:
java
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)applicationContext.getBean("userService");
userService.show();
}
运行结果:

java
public class UserServiceImpl implements UserService {
......
public void show(){
....
System.out.println(userDaos);
}
private List<UserDao> userDaos;
public void setUserDaos(List<UserDao> userDaos) {
this.userDaos = userDaos;
}
}
xml
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
......
<property name="userDaos" >
<list>
<bean class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean class="com.itheima.dao.impl.UserDaoImpl"></bean>
</list>
</property>
</bean>
xml
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
.....
<property name="userDaos" >
<list>
<ref bean="userDao1"></ref>
<ref bean="userDao2"></ref>
<ref bean="userDao3"></ref>
</list>
</property>
</bean>
<bean id="userDao1" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userDao2" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userDao3" class="com.itheima.dao.impl.UserDaoImpl"></bean>
java
public class UserServiceImpl implements UserService {
....
private Set<String> strSet;
public void setStrSet(Set<String> strSet) {
this.strSet = strSet;
}
private Set<UserDao> userDaoSet;
public void setUserDaoSet(Set<UserDao> userDaoSet) {
this.userDaoSet = userDaoSet;
}
}
xml
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
.....
<property name="strSet">
<set>
<value>xxxxx</value>
<value>yyyyy</value>
</set>
</property>
<property name="userDaoSet">
<set>
<ref bean="userDao1"></ref>
<ref bean="userDao2"></ref>
<ref bean="userDao3"></ref>
</set>
</property>
</bean>
<bean id="userDao1" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userDao2" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userDao3" class="com.itheima.dao.impl.UserDaoImpl"></bean>
java
private Map<String, UserDao> userDaoMap;
public void setUserDaoMap(Map<String, UserDao> userDaoMap) {
this.userDaoMap = userDaoMap;
}
xml
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
....
<property name="userDaoMap">
<map>
<entry key="123" value-ref="userDao1"></entry>
<entry key="456" value-ref="userDao2"></entry>
<entry key="789" value-ref="userDao3"></entry>
</map>
</property>
</bean>
扩展:自动装配方式
如果被注入的属性类型是Bean引用的话,那么可以在标签中使用autowire属性去配置自动注入方式,属性值有两个:
- byName:通过属性名自动装配,即去匹配setXxx与id="xxx"(name="xxx")是否一致;
- byType:通过Bean的类型从容器中匹配,匹配出多个相同Bean类型时,报错。
java
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void show() {
System.out.println(userDao);
}
}
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl" autowire="byName"></bean>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>

xml
<bean id="userService" class="com.itheima. service.impl.UserServiceImpl"
autowire="byType">
<bean id="userDao1111" class="com.itheima.dao.impl.UserDaoImpl"></bean>

Spring的其他配置标签
Spring的xml标签大体上分为两类,一种是默认标签,一种是自定义标签
- 默认标签:就是不用额外导入其他命名空间约束的标签,例如< bean>标签
- 自定义标签:就是需要额外引入其他命名空间约束,并通过前缀引用的标签,例如< context:property-placeholder/>标签
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/beans/spring-context.xsd">
<context:property-placeholder></context:property-placeholder>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl" autowire="byType"></bean>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
</beans>
Spring的默认标签用到的是Spring的默认命名空间
该命名空间约束下的默认标签如下:

< beans>标签,除了经常用的做为根标签外,还可以嵌套在根标签内,使用profile属性切换开发环境
xml
<!--配置测试环境下,需要加载的Bean实例 -->
<beans profile="test">
</beans>
<!--配置开发环境下,需要加载的Bean实例 -->
<beans profile="dev">
</beans>
可以使用以下两种方式指定被激活的环境:
- 使用命令行动态参数,虚拟机参数位置加载-Dspring.profiles.active=test
- 使用代码的方式设置环境变量System.setProperty("spring.profiles.active","test")
< import>标签,用于导入其他配置文件,项目变大后,就会导致一个配置文件内容过多,可以将一个配置文件根据业务某块进行拆分,拆分后,最终通过标签导入到一个主配置文件中,项目加载主配置文件就连同导入的文件一并加载了
xml
<!--导入用户模块配置文件-->
<import resource="classpath:UserModuleApplicationContext.xml"/>
<!--导入商品模块配置文件-->
<import resource="classpath:ProductModuleApplicationcontext.xml"/>
< alias>标签是为某个Bean添加别名,与在标签上使用name属性添加别名的方式一样,我们为UserServicelmpl指定四个别名:aaa、bbb、xxx、yyy
xml
<!--配置UserService-->
<bean id="userService" name="aaa,bbb" class-"com.itheima.service,impl. UserServiceImp1">
<property name="userDao" ref="userDao"/>
</bean>
<!--指定别名-->
<alias name="userService" alias="xxx"/>
<alias name="userService" alias="yyy"/>
断点调试,在beanFactory中维护着一个名为aliasMap的Map<String,String>集合,存储别名和beanName之间的映射关系

Spring的自定义标签需要引入外部的命名空间,并为外部的命名空间指定前缀,使用<前缀:标签>形式的标签,称之为自定义标签,自定义标签的解析流程也是Spring xml扩展点方式之一
xml
<!--默认标签-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<!--自定义标签-->
<context:property-placeholder/>
<mvc:annotation-driven/>
<dubbo:application name="application"/>
xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version> <!-- 请根据需要选择版本 -->
</dependency>
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 其他 Spring MVC 配置 -->
</beans>
总结
在这篇博客中,我们探讨了 Spring 框架中 Bean 的依赖注入配置,以及如何使用 XML 和注解两种方式来管理应用程序中的依赖关系。通过理解依赖注入的原理和实践,开发者可以有效地构建更为灵活和可维护的应用程序。
此外,我们也介绍了一些常用的 Spring 配置标签,这些标签在日常开发中非常实用,可以帮助简化配置和提升开发效率。了解这些配置标签的使用,不仅能提高开发者的工作效率,还能帮助团队在项目中保持一致的编码规范。
随着对 Spring 框架的深入理解,您将能够更自如地利用它的强大功能来构建高效、可扩展的 Java 应用程序。如果您有任何问题或想要深入探讨的主题,欢迎在评论区留言!