DI依赖注入和第三方bean管理以及核心容器

1.依赖注入方式

  • setter 注入方式

    • 简单类型
    • 引用类型
  • 构造器注入

    • 简单类型
    • 引用类型
1.1 setter 注入简单类型

在实现类中添加简单数据类型,并提供 setter 方法

public class BookDaoImpl implements BookDao {

    //注入简单类型
    private int num;

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public void save() {
        System.out.println("book dao save......"+num);
    }
}

配置文件中添加 bean

    <bean id="bookDao" class="com.my.dao.impl.BookDaoImpl">
        <property name="num" value="10"/>
    </bean>

测试运行结果

    public static void main(String[] args) {

        ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");

        BookDao bookDao = (BookDao) context.getBean("bookDao");

        bookDao.save();
        //book dao save......10
    }
1.2 setter 注入引用数据类型

在实现类中添加引用数据类型,并提供 setter 方法

public class BookServiceImpl implements BookService {
    //注入引用类型
    private BookDao bookDao;

    @Override
    public void save() {
        System.out.println("book service save......");
        
        bookDao.save();
    }
    //提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

配置文件中添加 bean

    <bean id="bookDao" class="com.my.dao.impl.BookDaoImpl">
        <property name="connectionNum" value="10"/>
    </bean>

    <bean id="bookService" class="com.my.service.impl.BookServiceImpl">
        //引用类型
        <property name="bookDao" ref="bookDao"/>
    </bean>

测试运行结果

    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");

        BookService bookService = (BookService) context.getBean("bookService");

        bookService.save();
        //输出结果为: book service save......
        //book dao save......10
    }
1.3 构造器注入简单数据类型

在实现类中,添加构造方法

public class BookDaoImpl implements BookDao {

    private int num;

    public BookDaoImpl(int num) {
        this.num = num;
    }

    @Override
    public void save() {
        System.out.println("book dao save......"+num);
    }
}

配置文件中配置 bean

    <bean id="bookDao" class="com.my.dao.impl.BookDaoImpl">
        <constructor-arg name="num" value="10"/>
    </bean>

测试运行结果

    public static void main(String[] args) {

        ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");

        BookDao bookDao = (BookDao) context.getBean("bookDao");

        bookDao.save();
        //输出结果为:book dao save......10
    }
}

1.4构造器注入引用类型

在实现类中,添加构造方法

public class BookServiceImpl implements BookService {

    //注入引用类型
    private BookDao bookDao;

    public BookServiceImpl(BookDao bookDao, UserDao userDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        System.out.println("book service save......");

        bookDao.save();
    }
}

配置文件中配置 bean

    <bean id="bookDao" class="com.my.dao.impl.BookDaoImpl">
        <constructor-arg name="connectionNum" value="10"/>
    </bean>

    <bean id="bookService" class="com.my.service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

测试运行结果

    public static void main(String[] args) {

        ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");

        BookService bookService = (BookService) context.getBean("bookService");

        bookService.save();
        //输出结果为:book service save......
        //book dao save......10
    }
1.5集合注入

创建一个实现类,添加集合:数组、List、Set、Map、Properties 。 并提供 setter 方法

public class BookDaoImpl implements BookDao {
    private int[] array;
    private List<String> list;
    private Set<String> set;
    private Map<String,String> map;
    private Properties properties;

    public void setArray(int[] array) {
        this.array = array;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public void save() {

        System.out.println("array数组:"+ Arrays.toString(array));
        System.out.println("list数组:"+list);
        System.out.println("set数组:"+set);
        System.out.println("map数组:"+map);
        System.out.println("properties数组:"+properties);

    }
}

配置文件,注入集合类型数据

   <bean id="bookDao" class="com.my.dao.impl.BookDaoImpl">

        <property name="array">
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </array>
        </property>

        <property name="list">
            <list>
                <value>a</value>
                <value>b</value>
                <value>c</value>
            </list>
        </property>

        <property name="set">
            <set>
                <value>a</value>
                <value>b</value>
                <value>c</value>
                <value>c</value>
            </set>
        </property>

        <property name="map">
            <map>
                <entry key="1" value="a"/>
                <entry key="2" value="b"/>
                <entry key="3" value="c"/>
            </map>
        </property>

        <property name="properties">
            <props>
                <prop key="4">d</prop>
                <prop key="5">e</prop>
                <prop key="6">f</prop>
            </props>
        </property>

    </bean>

测试运行结果

    public static void main(String[] args) {

        ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");

        BookDao bookDao = (BookDao) context.getBean("bookDao");

        bookDao.save();
        //输出结果为:array数组:[1, 2, 3]
        //list数组:[a, b, c]
        //set数组:[a, b, c]
        //map数组:{1=a, 2=b, 3=c}
        //properties数组:{4=d, 5=e, 6=f}
    }

2. 第三方数据源对象管理(管理第三方 bean)

  1. 导入 spring-context 依赖和 第三方 Druid 依赖
        <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.2.11</version>
        </dependency>
  1. 开启命名空间,在 beans 标签里添加 context ,如下:
<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

       ">
  1. 创建资源包 properties 文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=root
  1. 配置文件中加载 properties 文件,使用 ${} 读取文件里的属性值
<!--    1.开启命名空间-->
<!--    2.加载properties文件-->
   <context:property-placeholder location="jdbc.properties"/>

<!--    3.使用${}读取文件里的属性值-->
   <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
       <property name="driverClassName" value="${jdbc.driver}"/>
       <property name="url" value="${jdbc.url}"/>
       <property name="username" value="${jdbc.username}"/>
       <property name="password" value="${jdbc.password}"/>
   </bean>

测试运行结果

    public static void main(String[] args) {

        ApplicationContext context =new ClassPathXmlApplicationContext("applicationConfig.xml");

        DataSource dataSource = (DataSource) context.getBean("dataSource");

        System.out.println(dataSource);
        //输出结果为:{
        //	CreateTime:"2022-09-18 19:45:03",
        //	ActiveCount:0,
        //	PoolingCount:0,
        //	CreateCount:0,
        //	DestroyCount:0,
        //	CloseCount:0,
        //	ConnectCount:0,
        //	Connections:[
        //	]
        //}
    }

3.核心容器

3.1创建容器的方式
  • 类路径加载配置文件

    ApplicationContext context =new ClassPathXmlApplicationContext("applicationConfig.xml");
    
  • 文件路径加载配置文件

    ApplicationContext context1=new FileSystemXmlApplicationContext("D:\\SpringProjects\\spring_07_dataSource\\src\\main\\resources\\applicationConfig.xml");
    
  • 加载多个配置文件,用逗号隔开

    ApplicationContext context =new ClassPathXmlApplicationContext("applicationConfig.xml","applicationConfig2.xml");
    
3.2获取 bean 的方式
  • 使用 bean 名称获取

    BookDao bookDao = (BookDao) context.getBean("bookDao");
    
  • 使用 bean 名称获取并指定类型

    BookDao bookDao = context.getBean("bookDao", BookDao.class);
    
  • 使用 bean 类型获取

    BookDao bookDao = context.getBean(BookDao.class);
    
3.3容器类层次结构

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)是面向对象编程中的两个重要概念。它们可以帮助我们更好地实现代码的松耦合,提高代码的可维护性和可扩展性。 IoC是一种编程思想,它将程序的控制权从程序员手中转移到了IoC容器中,由IoC容器管理和调用对象之间的依赖关系。IoC容器就像是一个工厂,它负责创建和管理对象,程序员只需要告诉IoC容器需要哪些对象,IoC容器就会根据配置文件或者注解等方式来创建对象,并将它们组合起来。 DI是IoC的一种具体实现方式,它通过构造函数、属性或者方法等方式将依赖关系注入到对象中。当一个对象需要另一个对象时,它不会直接创建这个对象,而是通过IoC容器来获取这个对象。通过DI,我们可以实现对象之间的松耦合,提高代码的可维护性和可测试性。 下面是一个简单的例子,演示如何使用IoC容器DI实现对象之间的依赖注入: ```java // 定义接口 public interface MessageService { void send(String message); } // 实现接口 public class EmailService implements MessageService { public void send(String message) { System.out.println("Email sent: " + message); } } // 定义需要依赖注入的类 public class MyClass { private MessageService messageService; // 通过构造函数注入依赖 public MyClass(MessageService messageService) { this.messageService = messageService; } public void doSomething() { // 使用依赖的方法 messageService.send("Hello World!"); } } // 使用IoC容器创建对象并注入依赖 public class Main { public static void main(String[] args) { // 创建IoC容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 从IoC容器中获取对象 MyClass myClass = (MyClass) context.getBean("myClass"); // 调用方法 myClass.doSomething(); } } ``` 在上面的例子中,我们定义了一个MessageService接口和一个EmailService实现类。然后我们定义了一个MyClass类,它需要依赖MessageService对象来完成一些操作。通过构造函数注入依赖,我们可以将MessageService对象注入到MyClass中。最后,在使用IoC容器创建对象时,我们可以通过配置文件或者注解等方式来指定依赖的实现类,IoC容器会自动创建对象并注入依赖。 总之,IoC和DI是非常重要的编程思想,它们可以帮助我们更好地管理对象之间的依赖关系,提高代码的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2023-8-13胖胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值