Spring之旅 - 记录学习 Spring 框架的过程和经验(三)Bean的依赖注入配置、Spring的其它配置标签

前言

在现代 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 应用程序。如果您有任何问题或想要深入探讨的主题,欢迎在评论区留言!

相关推荐
Lei活在当下2 分钟前
先用起来,再理解,关于协程Coroutine应该知道的事
android·java·jvm
richxu202510015 分钟前
学完了江科大STM32,下一步该怎么学?
stm32·单片机·嵌入式硬件·学习
Java爱好狂.19 分钟前
Java程序员体系化学习路线(2026最新版)
java·后端·java面试·java架构师·java程序员·java八股文·java学习路线
网络与设备以及操作系统学习使用者38 分钟前
Linux与Windows核心差异深度解析
linux·运维·网络·windows·学习
tongluowan0071 小时前
以ReentrantLock为例解释AQS的工作流程
java·模板方法模式·aqs·reentrantlock
知识分享小能手2 小时前
Flask入门学习教程,从入门到精通,Flask智能租房——前期准备 知识点详解(5)
python·学习·flask
淳杰2 小时前
学习笔记 | playwright用法
笔记·学习
身如柳絮随风扬2 小时前
Java 项目打包与部署完全指南:JAR vs WAR,从构建到运行
java·firefox·jar
三品吉他手会点灯2 小时前
STM32F103 学习笔记-21-串口通信(第6节)-串口发送命令控制RGB灯
笔记·stm32·单片机·嵌入式硬件·学习
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【62】时光旅行(Time-Travel)
java·人工智能·spring