SSM 框架(Spring + SpringMVC + Maven + Springboot + MybatisPlus 从入门到精通 ):(第二篇)Spring

SSM 框架(Spring + SpringMVC + Maven + Springboot + MybatisPlus 从入门到精通 ):(第二篇)Spring

前言:紧接上期,我们继续学习 Spring

Spring

DI:依赖注入

细心的同学会发现,我们上一期的只是把 service 层的对象交给 spring帮我们 new,但是在 serviceimpl中,仍然 new 了 Dao层的对象。
在这里插入图片描述
这里我们需要解耦合,该怎么办呢?
使用 DI 依赖注入,上期我们已经把 BookDaoimpl 交给了 Spring
在这里插入图片描述
所以这里我们需要干什么呢?通俗来说,是让 Spring 自动把 Dao 层的对象交给 Service 层,这里就需要使用到 DI

第一步:修改配置 Spring 文件
因为我们是把 BookDaoimpl 交给 BookServiceimpl,所以我们在 BookServiceimpl 的 bean 标签里面配置。

<bean id="bookService" class="org.example.service.impl.BookServiceimpl">
        <property name="bookDao" ref="bookDao1"></property>
    </bean>

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--   1.引入spring坐标-->
<!--   2.新建spring配置文件-->
<!--   3.配置beaen -->

    <bean id="bookDao1" class="org.example.model.impl.BookDaoimpl"></bean>

        <bean id="bookService" class="org.example.service.impl.BookServiceimpl">
            <property name="bookDao" ref="bookDao1"></property>
        </bean>
</beans>

第二步:修改 Bookserviceimpl
首先我们为 Bookcerviceimpl 中的 bookDao 添加 set 方法,这个方法是由我们的 Spring 调用的。

public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

然后,由于我们配置了 Spring 依赖注入,我们不需要自己在 BookServiceimpl 中 new bookDao 的对象了,删除 new 对象的部分。如下:

private BookDao bookDao;

BookServiceimpl 修改后的整体代码:

package org.example.service.impl;

import org.example.model.BookDao;
import org.example.model.impl.BookDaoimpl;
import org.example.service.BookService;

public class BookServiceimpl implements BookService {
  private BookDao bookDao;
  @Override
  public void save() {
      System.out.println("book service save...");
      bookDao.save();
  }

  public void setBookDao(BookDao bookDao) {
      this.bookDao = bookDao;
  }
}

最后运行结果:
在这里插入图片描述
这样 new 对象的权力就全部交给 Spring 了,这就是 IOC 和 DI。

bean的使用

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--   1.引入spring坐标-->
<!--   2.新建spring配置文件-->
<!--   3.配置beaen -->

    <bean id="bookDao1" class="org.example.model.impl.BookDaoimpl"></bean>

        <bean id="bookService" class="org.example.service.impl.BookServiceimpl">
            <property name="bookDao" ref="bookDao1"></property>
        </bean>
</beans>

在这里插入图片描述

这是我们之前配置的 bean 的属性

id: id 是用来实例化对象时获取对象的标识
class:class 是我们需要交给 Spring 对象的具体包位置

bean 中的 property 是指我们依赖注入的对象配置
name :是我们需要依赖注入的 Bookservice 中的变量名
ref : 是指我们注入对象的 id

这里扩展几个 bean 中常用的属性

name: 可以取别名,别名中间可以以空格,逗号分隔(可以在name一个标签中取多个别名)

Demo:(我们修改配置文件、Main 如下:)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--   1.引入spring坐标-->
<!--   2.新建spring配置文件-->
<!--   3.配置beaen -->

    <bean id="bookDao1" class="org.example.model.impl.BookDaoimpl" ></bean>

        <bean id="bookService" class="org.example.service.impl.BookServiceimpl" name="service">
            <property name="bookDao" ref="bookDao1"></property>
        </bean>
</beans>
package org.example;

import org.example.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main2 {
    public static void main(String[] args) {
        //获取ioc容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        BookService bookService = (BookService) ctx.getBean("service");
        bookService.save();
    }
}

启动发现可以正常启动
在这里插入图片描述

bean 构造对象的方式修改:

默认情况下,bean构造的对象都是单例模式,就是说对于多个对象使用,只会有一个对象实体被 new 出来

测试如下(只需要让main中获取两个service层对象,然后打印两个对象地址,如果一样那就是单例模式):

package org.example;

import org.example.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main2 {
    public static void main(String[] args) {
        //获取ioc容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        BookService bookService = (BookService) ctx.getBean("service");


        BookService bookService2 = (BookService) ctx.getBean("service");
        System.out.println(bookService);
        System.out.println(bookService2);
    }
}

这是我本地的打印结果,可以发现是一样的结果
在这里插入图片描述
这里就证明了,我们默认情况下,bean去构造对象的时候,都是以单例模式的方式,new 对象

由于篇幅有限,就到这。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我不会画饼鸭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值