首页 > 其他分享 >Spring DI 简单演示三层架构——Setter 注入

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

时间:2024-08-16 13:53:36浏览次数:14  
标签:service DI Spring dao controller apesource com public Setter

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

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

import com.apesource.pojo.dao.IStudentDao;

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

    @Override
    public void save() {
        System.out.println("===service的新增方法===");
        //调用 dao 层方法
        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 层方法的变量,又由于我们要使用 setter 方法注入
     * 所以我们要写它的 setter 方法*/
    IStudentService service;
    public void setService(IStudentService service) {
        this.service = service;
    }

    @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实现,子标签-->
        <!--property 子标签,就用于 setter 注入,它也会有自动生成的 name,可以改自己起的名,自动生成很方便-->
            <!--property的name指要通过 setter给注入的属性名-->
            <!--property的value指要通过 setter给注入的数据,写具体值-->
            <!--property的ref可以直接引用标签id-->
    <bean id="serviceImp" class="com.apesource.service.StudentServiceImp">
        <!--通过 setter给注入的dao(就我们service层添加的那个dao层的属性【IStudentDao dao】),ref可以直接引用数据访问层id,这样两层就关联起来了,控制层同理-->
        <property name="dao" ref="daoImp"></property>
    </bean>

    <!--注入控制器——controller实现类-->
        <!--控制层需要业务层对象注入,DI实现-->
    <bean id="controllerImp" class="com.apesource.controller.StudentControllerImp">
        <property name="service" ref="serviceImp"></property>
    </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();//看它是否三层关联调用方法
    }
}

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

标签:service,DI,Spring,dao,controller,apesource,com,public,Setter
From: https://blog.csdn.net/2303_79008526/article/details/141230198

相关文章

  • springboot个人健康管理-计算机毕业设计源码04385
    摘 要随着移动互联网的飞速发展,微信小程序因其便捷、高效、低成本的特点,成为了连接用户与服务之间的桥梁。特别是在健康管理领域,微信小程序为用户提供了一个随时随地进行健康数据记录、查询和管理的平台。而SpringBoot作为一种轻量级的Java开发框架,因其快速搭建、易于集成......
  • NVIDIA CUDA 编程模型之Grid和Block
    NVIDIACUDA编程模型允许灵活地配置grid和block,使程序能够在不同规模和结构上运行。CUDA中的grid可以是1、2或3维的,block也可以是1、2或3维的。这意味着存在多种可能的组合,每种组合都会影响最终线程的编号计算。下表展示了所有可能的grid和block组合,并描述了......
  • Redis介绍
    Redis一、介绍1.1基本了解RemoteDictionaryServer(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供了丰富的数据结构,例如String、Hash、List、Set、SortedSet等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、......
  • import org.springframework.beans.factory.annotation.Autowired
    importjava.io.IOException;publicclassGoogleSearch1TestextendsSpringBaseTestNGTest{@AutowiredprivateGooglePagegooglePage;@Lazy//onlycreatetheobjectwhenneeded@AutowiredprivateScreenShotUtilscreenShotUtil;@TestpublicvoidGoogleTest......
  • SpringMVC 接收数据
    SpringMVC接收数据1.设置访问路径@RequestMapping将handler注册到HandlerMapping中@RequestMapping可以用到方法上也可以用到类上用到方法上,访问某个路径就直接执行这个方法。如果方法上都有某一个路径字段,就可以把他提取出来放到类上。需要注意的是放在类上,方法上也必......
  • redis启动失败报错:Job for redis.service failed because the control process exited
    问题描述启动报错如下:查看redis的启动信息:systemctlstatusredis.service或journalctl-xe由提示可以看不是配置文件,内存等原因造成的。解决方案原因:linux的一个安全子系统(SELinux)阻止了服务的启动。查看SELinux的工作模式cat /etc/selinux/configSELinu......
  • SpringBoot整合日志功能(slf4j+logback)详解
     目录一、日志门面与日志实现1.1什么是日志门面和日志实现?1.2为什么需要日志门面?二、简介三、日志格式四、记录日志4.1使用日志工厂4.2 使用Lombok的@Slf4j注解五、日志级别5.1日志级别介绍5.2配置日志级别5.3指定某个包下的类使用某个级别5.4占位符打......
  • Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI
    Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程XorbitsInference(Xinference)是一个开源平台,用于简化各种AI模型的运行和集成。借助Xinference,您可以使用任何开源LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并......
  • springboot电竞专题网站的设计与实现-附源码641314
    摘 要近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务越来越赢得网民们的青睐。现今,大量的计算机技术应用于商业领域,......
  • 基于springboot教学评价系统的设计与实现-附源码641310
    摘  要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对教学评价等问题,对如何通过计算机教学评价进行研究分析,然后开发设计出教学评价系统已解决问......