Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)

这篇具有很好参考价值的文章主要介绍了Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

依赖注入的方式有setter注入、构造器注入、自动装配、集合注入

首先,Maven项目pom.xml依赖包如下:
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring-1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.22.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
    </dependencies>
</project>

【注】:上述除spring依赖包之外其他三个依赖包用于测试使用。

1. setter注入

先说明一下,这里有的文件为Book2Dao(接口)、Book2DaoImpl(Book2Dao接口实现类)、Book2Service(接口)、Book2ServiceImpl(Book2Service即可实现类)、Test2(用于测试)。示例在Book2ServiceImpl类中使用Book2Dao的方法save,如下:

Book2Dao

package com.bh.dao;
public interface Book2Dao {
    void save();
}

Book2DaoImpl

package com.bh.dao.Impl;

import com.bh.dao.Book2Dao;
public class Book2DaoImpl implements Book2Dao {
    public void save() {
        System.out.println(" Book2DaoImpl 已保存数据!");
    }
}

Book2Service

package com.bh.service;

public interface Book2Service {
    void save();
}

Book2ServiceImpl

package com.bh.service.Impl;

import com.bh.dao.Book2Dao;
import com.bh.service.Book2Service;

public class Book2ServiceImpl implements Book2Service {
    private Book2Dao book2Dao;
    public void setBook2Dao(Book2Dao book2Dao) {
        this.book2Dao = book2Dao;
    }
    public void save() {
        book2Dao.save();
    }
}

applicationContext.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/context/spring-context.xsd

">

<!--    开启context的命名空间  -->
     <bean id="book2Dao" class="com.bh.dao.Impl.Book2DaoImpl"/>

    <bean id="book2Service" class="com.bh.service.Impl.Book2ServiceImpl">
        <property name="book2Dao" ref="book2Dao"/>
    </bean>
</beans>

【注】:这个xml文件是开启了context的命名空间的,用于后续操作。
Test2

package com.bh;

import com.bh.service.Book2Service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test2 {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Book2Service book2Service = ctx.getBean("book2Service", Book2Service.class);
        book2Service.save();
    }
}

运行结果为:
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)

这种方式如果在Book2ServiceImpl类中引入多个其他类的依赖时,在配置文件applicationContext.xml上就需要写上对应的property标签,并且一旦Java类上这些引入的依赖变量名称进行修改,对应的配置文件bean标签里的property标签也要进行相应的修改,显得很繁琐,有没有简便的方法呢?有的,那就是使用自动装配
自动装配

只需要修改一下applicationContext.xml配置文件即可。

applicationContext.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/context/spring-context.xsd

">
<!--    开启context的命名空间  -->
     <bean id="book2Dao" class="com.bh.dao.Impl.Book2DaoImpl"/>

    <bean id="book2Service" class="com.bh.service.Impl.Book2ServiceImpl" autowire="byType"/>
</beans>

运行结果和上述一样。
如果在上述applicationContext.xml定义了两个Book2DaoImpl类型相同的bean,则会报错,如下:
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)

运行结果:
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)
从报错信息上分析,是因为我定义了两个class类型相同的bean,而使用的自动装配方式是按类型(byType)进行装配的,我可以修改一下自动装配类型,使用byName按名称,这样就没有问题了,如下:
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)
这样修改之后,就能正常运行出结果了。但是使用按名称进行装配,对于bean的id值是有要求的,id值需要与Java类上对应变量名称一致,否则也会出问题。

对于自动装配,总结如下:

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作;
  • 使用按类型装配时,必须保障容器中相同类的bean唯一,推荐使用;
  • 使用按名称装配时,必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用;
  • 自动装配优先级低于setter注入与构造器的注入,同时出现时自动装配失效。
2. 构造器注入

使用构造方法进行注入,原Book2ServiceImpl类修改为:
Book2ServiceImpl

package com.bh.service.Impl;

import com.bh.dao.Book2Dao;
import com.bh.service.Book2Service;

public class Book2ServiceImpl implements Book2Service {
    private Book2Dao book2Dao;
    public Book2ServiceImpl(Book2Dao book2Dao) {
        this.book2Dao = book2Dao;
    }

    public void save() {
        book2Dao.save();
    }
}

上述applicationContext.xml配置文件修改为如下:
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)
运行结果同上述正常运行结果;
如果构造方法中有简单类型,constructor-arg标签如下:

<constructor-arg name="name" value="liuze"/>

但是这种方式一旦Java类变量名称修改了,配置文件也需要进行相应的名称修改,可以把name属性去掉,用index来代替,index值从0开始,表示Java类构造方法中形参的位置。
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)

3. 集合注入

比如在一个Java类中有一些集合类型的变量,如数组、List、Set、Map、Properties,参考示例如下(使用setter注入):
RandomObject

package com.bh.other;

import java.util.*;

public class RandomObject {

    private int[] arrObj;
    private List<String> listObj;
    private Set<String> setObj;
    private Map<String,String > mapObj;
    private Properties propertiesObj;

    public void setArrObj(int[] arrObj) {
        this.arrObj = arrObj;
    }

    public void setListObj(List<String> listObj) {
        this.listObj = listObj;
    }

    public void setSetObj(Set<String> setObj) {
        this.setObj = setObj;
    }

    public void setMapObj(Map<String, String> mapObj) {
        this.mapObj = mapObj;
    }

    public void setPropertiesObj(Properties propertiesObj) {
        this.propertiesObj = propertiesObj;
    }

    public void save(){

        System.out.println("保存数据。。。");
        System.out.println(Arrays.toString(arrObj));
        System.out.println(listObj);
        System.out.println(setObj);
        System.out.println(mapObj);
        System.out.println(propertiesObj);
    }
}

applicationContext.xml配置文件为:

<bean id="randomObject" class="com.bh.other.RandomObject">
    <property name="arrObj">
         <array>
             <value>123</value>
             <value>456</value>
             <value>789</value>
         </array>
     </property>
     <property name="listObj">
         <list>
             <value>abc</value>
             <value>efg</value>
             <value>hij</value>
         </list>
     </property>
     <property name="setObj">
         <set>
             <value>abc</value>
             <value>efg</value>
             <value>hij</value>
             <value>abc</value>
         </set>
     </property>
     <property name="mapObj">
         <map>
             <entry key="name" value="liuze"/>
             <entry key="age" value="22"/>
             <entry key="address" value="hunan"/>
         </map>
     </property>
     <property name="propertiesObj">
         <props>
             <prop key="name">liuze</prop>
             <prop key="age">23</prop>
             <prop key="address">hunan</prop>
         </props>
     </property>
 </bean>

运行结果:
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)

怎样利用上述知识对数据源对象进行注入呢?
applicationContext.xml

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc::mysql://localhost:3306/d_test"/>
    <property name="user" value="root"/>
    <property name="password" value="sxx123"/>
</bean>

依旧使用setter注入方式即可,那么怎样加载自定义的properties文件呢?这就是说到开头讲的那个aplicationContext.xml文件了,是不是发现这个文件开头那个看不懂的链接比默认的多了几个,那是用于开启context命名空间的。
现在在resources文件夹有一个jdbc.properties文件如下:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc::mysql://localhost:3306/d_test
jdbc.username=root
jdbc.password=sxx123

aplicationContext.xml如何读取这些数据,如下:
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)
运行结果:
Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)文章来源地址https://www.toymoban.com/news/detail-432360.html

到了这里,关于Spring:依赖注入的方式(setter注入、构造器注入、自动装配、集合注入)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring】三大依赖注入(@Autowired,Setter,构造方法)

    目录 一、属性注入(@Autowired) 1.1 优点分析 1.2 缺点分析 1.2.1 无法实现final修饰的变量注入。 1.2.2 兼容性不好 1.2.3 (可能违背)设计原则问题 1.2.4 代码举例: 1.2.5 出现循环依赖该怎么办? 1.2.6 @Resource与@Autowired的区别 二、Setter注入 2.1 优点分析 2.2 缺点分析 2.2.1 不能注入不

    2024年02月01日
    浏览(38)
  • Java中构造器详解(类的五成员之三:构造器)

    先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。 Java的基本单位是类,类中包含五个部分,这篇写的是 构造器 。 (1)变量 (2)方法 (3)构造器 (4)初始化块 (5)内部类 ①构造器是处于Java类中的一个方法,最大的作用创建对象时执行

    2024年02月08日
    浏览(42)
  • 7.5 构造器详解

    7.5 构造器详解 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点: 必须和类的名字相同 必须没有返回类型,也不能写void 一个类即使什么都不写都会存在一个构造方法。 构造器的作用 可以实例化一些初始值,比如一些游戏

    2024年02月14日
    浏览(37)
  • Java 构造器

    2024年02月12日
    浏览(112)
  • 单例模式与构造器模式

    单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建 在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单

    2024年02月15日
    浏览(36)
  • MyBatis-Plus:条件构造器Wrapper

    目录 1.Wrapper概述 1.1.Wrapper的继承关系 1.2.Wapper介绍  1.3.各个构造器使用区别 1.4.构造器常用方法 2.Wrapper常用构造器介绍 2.1.QueryWrapper 2.2.UpdateWrapper 2.3.LambdaQueryWrapper 2.4.AbstractWrapper 3. Lambda条件构造器 3.1.示例 4.鸣谢         我们在实际操作数据库的时候会涉及到很多的条件

    2024年02月11日
    浏览(63)
  • Java中使用es条件构造器BoolQueryBuilder

    由于es在java中查询没法像mybatis那样方便,而且es的构造器使用也比较繁琐,理解不是很方便,所以写一篇文章来记录es构造器BoolQueryBuilder查询时各种条件的构造的正确姿势。 1.构造准备 2.条件构造 must可用filter代替,查询效率会更高,因为must会对结果进行_score评估 3.构造完成

    2024年02月11日
    浏览(53)
  • JavaScript设计模式(一)——构造器模式、原型模式、类模式

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,正逐渐往全干发展 📃 个人状态: 研发工程师,现效力于中国工业软件事业 🚀 人生格言: 积跬步至千里,积小流成江海 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒

    2024年02月11日
    浏览(41)
  • MyBatis-Plus深入 —— 条件构造器与插件管理

            在前面的文章中,荔枝梳理了一个MyBatis-Plus的基本使用、配置和通用Service接口,我们发现在MyBatis-Plus的辅助增强下我们不再需要通过配置xml文件中的sql语句来实现基本的sql操作了,不愧是最佳搭档!在这篇文章中,荔枝会着重梳理有关MyBatis-Plus的两个知识点:条

    2024年02月09日
    浏览(49)
  • Java8函数式接口, 方法引用, 构造器引用, 数组引用

    只包含一个抽象方法的接口,称为函数式接口。 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明 我们可以在一个接口上使用 @Functionallnterface 注解,这样做可以检查它是

    2024年02月05日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包