Spring DI 简单演示三层架构——构造注入

Spring IOC 的常见注入方法有3种:Setter注入、构造注入属性注入。想了解更多可点击链接:Spring 注入、注解及相关概念补充

        属性注入 不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠 IOC 容器实现注入,不严谨。所以我只演示Setter注入构造注入。本篇演示构造注入

Setter注入构造注入很像,Setter注入使用 setter 方法,xml 配置文件 DI 注入使用子标签 property; 构造注入使用构造方法,xml 配置文件 DI 注入使用子标签 constructor-arg

Spring DI 简单演示三层架构——Setter 注入

首先新建项目,可参考:初识IDEA模拟三层--控制层、业务层和数据访问层

一、spring 环境搭建

(一)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>
<!--    导坐标,不导入该坐标会影响xml文件创建
导完坐标,一定去该页面右边点开 Maven看看是否下载完成,
若不报错,即下载成功-->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.28</version>
        </dependency>
    </dependencies>

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


</project>

(二)搭建配置文件

依次点击:src ==> main ==> resource 右击  ==> New ==> 找 XML Configuration File ==> 找到 Spring Config 并点击,起名(自己随便起名字),为了好区分,我起名叫 applicationContext

(三)建包建类,写方法

        建包建类,写方法可参考模拟三层--控制层、业务层和数据访问层,我们建立dao 包、 service 包、controller 包和 test 包。dao 包、 service 包和 controller 包这三个包分别写三层的接口和实现类,名字随便起的,习惯了“Student”,我给所有的名字都包含了“Student” ,其实“Student”没啥意义,“IUserDao"或”bsygd"这样随便的名字都行,什么的名字都一样的意义,取名自己好区分好记住就行(不过为了好区分,最好数据访问层、业务层、控制层起名都包含各自的dao 、service、controller字样,接口都 I 开头、实现类都 imp 结尾)。text 包就写测试类,因为本片文章简单演示而已,我们就简单的给每个接口写个 save() 新增方法给大家演示吧,具体代码如下:

//dao 数据访问层的接口
package com.apesource.pojo.dao;

public interface IStudentDao {
    public void save();
}
//dao 数据访问层的实现类
package com.apesource.pojo.dao;

public class StudentDaoImp implements IStudentDao{
    @Override
    public void save() {
        System.out.println("===dao的新增方法===");
    }
}
//service 业务层接口
package com.apesource.pojo.service;

public interface IStudentService {
    public void save();
}
//service 业务层的实现类
package com.apesource.service;

import com.apesource.dao.IStudentDao;

public class StudentServiceImp implements IStudentService{
    /*因为 service 层调用数据访问层
     *我们得将 dao 层与 service 联系起来
     *拿到一个 实现dao层方法的变量,又由于我们要使用构造方法注入
     * 所以我们要写它的构造方法(有参、无参都要写)*/
    IStudentDao dao;
    /***有参构造***/
    public StudentServiceImp(IStudentDao dao) {
        this.dao = dao;
    }
    /***无参构造***/
    public StudentServiceImp() {
    }

    @Override
    public void save() {
        System.out.println("===service的新增方法===");
        dao.save();
    }
}
//controller 控制层接口
package com.apesource.pojo.controller;

public interface IStudentController {
    public void save();
}
//controller 控制层的实现类
package com.apesource.pojo.controller;

import com.apesource.pojo.dao.IStudentDao;
import com.apesource.pojo.service.IStudentService;

public class StudentControllerImp implements IStudentController{
    /*因为 controller 层调用数据访问层
     *我们得将 controller 层与 service 联系起来
     *拿到一个实现 service 层方法的变量,又由于我们要使用构造方法注入
     * 所以我们要写它的构造方法(有参、无参都要写*/
    IStudentService service;
    /***有参构造***/
    public StudentControllerImp(IStudentService service) {
        this.service = service;
    }
    /***无参构造***/
    public StudentControllerImp() {
    }

    @Override
    public void save() {
        System.out.println("===contro的新增方法===");
        //调用 service 层方法
        service.save();
    }
}

(四)找到需要以解耦方式获取实例的类,将需要spring管理的类注入,通过 application.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">
    <!--注入数据访问——dao实现类-->
    <!--<bean id="可以自己起名,先写 class,再写 id,系统会自动生成 id 名,很方便" class="实现类或需要解耦的类的路径"></bean>-->
    <bean id="daoImp" class="com.apesource.dao.StudentDaoImp"></bean>

    <!--注入业务——service实现类-->
        <!--业务层需要数据访问层层对象注入,DI实现,子标签-->
        <!--constructor-arg 子标签,就用于构造注入,它也会有自动生成的 name,可以改自己起的名,自动生成很方便-->
            <!--constructor-arg的name指要通过构造给注入的属性名-->
            <!--constructor-arg的value指要通过构造给注入的数据,写具体值-->
            <!--constructor-arg的ref可以直接引用标签id-->
            <!--constructor-arg的index指要注入的数据下标,后面复杂类型篇章会讲到它的用法-->
            <!--constructor-arg的type指要注入的数据类型,后面复杂类型篇章会讲到它的用法-->
    <bean id="serviceImp" class="com.apesource.service.StudentServiceImp">
        <!--通过 setter给注入的dao(就我们service层添加的那个dao层的属性【IStudentDao dao】),ref可以直接引用数据访问层id,这样两层就关联起来了,控制层同理-->
        <constructor-arg name="dao" ref="daoImp"></constructor-arg>
    </bean>

    <!--注入控制器——controller实现类-->
        <!--控制层需要业务层对象注入,DI实现-->
    <bean id="controllerImp" class="com.apesource.controller.StudentControllerImp">
        <constructor-arg name="service" ref="serviceImp"></constructor-arg>
    </bean>
</beans>

(五)测试

package com.apesource.test;

import com.apesource.controller.IStudentController;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//注意:千万不要忘记 main 主方法
public class Test01 {
    public static void main(String[] args) {
        //1.加载 Spring 核心配置文件,获取 Spring 容器对象
        //applicationContext.xml为建完坐标下一步自己建立的那个 xml 配置文件的名字
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.获取对象【.getBean("controllerImp")这个controllerImp是 xml 配置文件控制层标签的 id】
        IStudentController controllerImp = (IStudentController) applicationContext.getBean("controllerImp");
        controllerImp.save();//看它是否三层关联调用方法
    }
}

运行结果(控制层显示出数据访问层方法结果,三层关联成功):

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值