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

相关推荐
TT哇2 小时前
@AllArgsConstructor
java·开发语言
lkbhua莱克瓦242 小时前
TCP通信练习1——多发多收
java·开发语言·网络·网络协议·tcp/ip·tcp练习
这就是佬们吗2 小时前
一文讲清---ELK搭建
java·笔记·elk·docker·容器
Filotimo_2 小时前
在java后端开发中,docker虚拟化容器用处
java·开发语言·docker
大学生资源网2 小时前
基于springboot的智能家居系统的设计与实现(源码+文档)
java·spring boot·后端·毕业设计·源码
葵花楹2 小时前
Maven 核心能力拆解 + 实战: Java 邮件群发
java·maven
洛阳纸贵2 小时前
JAVA高级工程师--Maven父子关系专题
java·前端·maven
丝斯20112 小时前
AI学习笔记整理(34)——视觉大模型在自动驾驶中的应用
人工智能·笔记·学习
编程小白gogogo2 小时前
苍穹外卖---swagger
java