当前位置: 首页 > news >正文

Spring项目结构、基于XML和注解的IoC

前言:关于IoC控制反转的概念请查看Spring概述:IoC、AOP

一、三层架构下Spring项目结构:


  • 项目结构
    请添加图片描述

  • Spring核心配置文件
<?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">
     <!--这里面编写核心配置-->
</beans>

  • 表示层

UsersController类:见(二)、(三)、(四)。


  • 业务逻辑层

UsersService接口:

package org.example.service;

public interface UsersService {
    void service();
}

UsersServiceImpl实现类:见(二)、(三)、(四)。


  • 数据访问层

UsersMapper接口:

package org.example.dao;

public interface UsersMapper {
    int insert();
}

UsersMapperImpl实现类:见(二)、(三)、(四)。


二、控制正转:传统用户操作对象


  • 项目基础结构同(一)。

  • UsersMapperImpl实现类
package org.example.dao;

/**
 * 数据访问层
 */
public class UsersMapperImpl implements UsersMapper{
    @Override
    public int insert() {
        System.out.println("用户增加成功");
        return 1;
    }
}

  • UsersServiceImpl实现类
package org.example.service;

import org.example.dao.UsersMapper;
import org.example.dao.UsersMapperImpl;

/**
 * 业务逻辑层
 */
public class UsersServiceImpl implements UsersService{
    //业务逻辑层必须要有数据访问层对象
    UsersMapper usersMapper;//面向接口编程
	//带参构造方法
    public UsersServiceImpl(UsersMapper usersMapper) {
        this.usersMapper = usersMapper;
    }
	//业务逻辑层具体功能
    @Override
    public void service() {
        usersMapper.insert();
    }
}

  • UsersController类
package org.example.controller;

import org.example.service.UsersService;
import org.example.service.UsersServiceImpl;

/**
 * 表示层
 */
public class UsersController {
    //表示层中必须要有业务逻辑层对象
    UsersService usersService;
	//带参构造方法
    public UsersController(UsersService usersService) {
        this.usersService = usersService;
    }
	//表示层具体功能
    public void control(){
        usersService.service();
    }
}

  • 测试类
    @Test
    public void aTest() {
    	//手动创建数据访问层对象
        UsersMapper usersMapper = new UsersMapperImpl();
        //手动创建业务逻辑层对象,并通过构造方法把数据访问层对象传给业务逻辑层对象
        UsersService usersService = new UsersServiceImpl(usersMapper);
        //手动创建表示层对象,并通过构造方法把业务逻辑层对象传给表示层对象
        UsersController usersController = new UsersController(usersService);
        //调用表示层对象的方法
        usersController.control();
    }

  • 控制正转缺点:
    我们在使用某些对象时需要手动new对象,然后通过构造方法或set方法手动传值,程序繁琐,不具有复用性。

三、Spring基于XML的IoC:


  • 项目基础结构同(一)。

  • UsersMapperImpl实现类
package org.example.dao;

/**
 * 数据访问层
 */
public class UsersMapperImpl implements UsersMapper{
    @Override
    public int insert() {
        System.out.println("用户增加成功");
        return 1;
    }
}

  • UsersServiceImpl实现类
package org.example.service;

import org.example.dao.UsersMapper;
import org.example.dao.UsersMapperImpl;

/**
 * 业务逻辑层
 */
public class UsersServiceImpl implements UsersService{
    //业务逻辑层必须要有数据访问层对象
    UsersMapper usersMapper;//面向接口编程
	//set方法
    public void setUsersMapper(UsersMapper usersMapper) {
        this.usersMapper = usersMapper;
    }
	//无参构造方法
    public UsersServiceImpl() {
    }
	//带参构造方法
    public UsersServiceImpl(UsersMapper usersMapper) {
        this.usersMapper = usersMapper;
    }
	//业务逻辑层具体功能
    @Override
    public void service() {
        usersMapper.insert();
    }
}

  • UsersController类
package org.example.controller;

import org.example.service.UsersService;
import org.example.service.UsersServiceImpl;

/**
 * 表示层
 */
public class UsersController {
    //表示层中必须要有业务逻辑层对象
    UsersService usersService;
	//set方法
    public void setUsersService(UsersService usersService) {
        this.usersService = usersService;
    }
	//无参构造方法
    public UsersController() {
    }
	//带参构造方法
    public UsersController(UsersService usersService) {
        this.usersService = usersService;
    }
	//表示层具体功能
    public void control(){
        usersService.service();
    }
}

  • Spring核心配置文件
<?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">
    <!--bean标签:一个bean标签代表创建了一个对象
    参数说明:
        id:创建对象的名称
        class:对象所属的类,这里只能是类,不能是接口
    -->
    
    <!--property标签:通过对象的set方法给对象的属性赋值,也叫setter注入
    使用前提:对象必须有无参构造方法和set方法
    参数说明:
        name:对象中属性名称
        value:基本数据类型赋属性值
        ref:引用数据类型赋属性值
    -->
    
    <!--constructor-arg标签:通过对象的构造方法给对象的属性赋值,也叫构造方法注入
    使用前提:对象必须有带参构造方法
    参数说明:
        name:构造方法中局部变量的名称
        index:构造方法中局部变量的位置
        value:基本数据类型赋属性值
        ref:引用数据类型赋属性值
    -->
    <!--创建数据访问层对象-->
    <bean id="UsersMapperImpl" class="org.example.dao.UsersMapperImpl">
    </bean>
    <!--创建业务逻辑层对象-->
    <bean id="UsersServiceImpl" class="org.example.service.UsersServiceImpl">
        <!--依赖注入-->
        <property name="usersMapper"  ref="UsersMapperImpl"></property>
    </bean>
    <!--创建表示层对象-->
    <bean id="UsersController" class="org.example.controller.UsersController">
        <!--依赖注入-->    
        <property name="usersService" ref="UsersServiceImpl"></property>
    </bean>
</beans>

  • 测试类
    @Test
    public void bTest(){
        /**
        * ApplicationContext容器,会在容器对象初始化时,通过调用各对象的无参构造方法将其中的所有对象一次性全部创建完成。
        * 以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
        * Spring初始化对象时要使用无参的构造方法,切记保证类中有无参构造方法。
        */
        //创建容器对象并启动
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //根据对象name名称取出对象,注意是取,不是创建
        UsersController usersController = (UsersController) ac.getBean("UsersController");
        usersController.control();
    }

四、Spring基于注解的IoC:


  • 创建对象的注解:
    • @Component :可创建所有类型的对象都可以使用此注解,默认名称是类名的驼峰命名法.也可以指定对象的名称@Component(“指定名称”)。
    • @Controller:可创建表示层的对象,此对象可以接收用户请求,返回处理结果给客户端。
    • @Service:可创建业务逻辑层的对象,此对象可施事务控制,向上给表示层返回数据,向下调用数据访问层。
    • @Repository:可创建数据访问层的对象 ,对数据库中的数据进行增删改查操作。
  • 给属性赋值(依赖注入)的注解:
    • @Value:给基本数据类型注入值
    • @Autowired:给引用数据类型按类型注入,从整个Bean工厂中搜索同源类型的对象进行注入。
    • @Qualifier:给引用数据类型按名称注入,从整个Bean工厂中搜索相同名称的对象进行注入。

  • 项目基础结构同(一)。

  • UsersMapperImpl实现类
package org.example.dao;

import org.springframework.stereotype.Repository;

/**
 * 数据访问层
 */
@Repository//数据访问层注解
public class UsersMapperImpl implements UsersMapper{
    @Override
    public int insert() {
        System.out.println("用户增加成功");
        return 1;
    }
}

  • UsersServiceImpl实现类
package org.example.service;

import org.example.dao.UsersMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 业务逻辑层
 */
@Service
public class UsersServiceImpl implements UsersService{
    //业务逻辑层必须要有数据访问层对象
    @Autowired//业务逻辑层注解
    UsersMapper usersMapper;//面向接口编程
    @Override
    public void service() {
        usersMapper.insert();
    }
    //不再需要带参构造方法和set方法
}

  • UsersController类
package org.example.controller;

import org.example.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * 表示层
 */
@Controller
public class UsersController {
    //表示层中必须要有业务逻辑层对象
    @Autowired//表示层注解
    UsersService usersService;
    //表示层具体功能
    public void control(){
        usersService.service();
    }
    //不再需要带参构造方法和set方法
}

  • Spring核心配置文件
<?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 https://www.springframework.org/schema/context/spring-context.xsd">
    <!--添加包扫描,通过扫描包内的注解创建对象-->
    <context:component-scan base-package="org.example.controller"></context:component-scan>
    <context:component-scan base-package="org.example.service"></context:component-scan>
    <context:component-scan base-package="org.example.dao"></context:component-scan>
</beans>

  • 测试类
    @Test
    public void cTest(){
        /**
        * ApplicationContext容器,会在容器对象初始化时,通过调用各对象的无参构造方法将其中的所有对象一次性全部创建完成。
        * 以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
        * Spring初始化对象时要使用无参的构造方法,切记保证类中有无参构造方法。
        */
        //创建容器对象并启动    
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //根据对象name名称取出对象,注意是取,不是创建
        UsersController usersController = (UsersController) ac.getBean("usersController");
        usersController.control();
    }

相关文章:

  • NOIP201005机器翻译 题解
  • 解读ICLR 2021:DoodlerGAN创意草图开山之作
  • 稀疏表示理论(与指静脉识别)
  • 遥感航拍影像25篇CVPR39个数据集
  • 【cmake实战十一】com组件方法的简单实现
  • RDP直线圆弧分割算法
  • 为什么有的python内置函数怎么就一个pass?
  • 主从复制 读写分离
  • flink-taskmanager内存计算
  • 大数据复习(day03)
  • C++ 优先队列 priority_queue 使用篇
  • 同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧
  • 图文讲解带你拿捏MyBatis(一)——MyBatis入门
  • [Python]Django类视图
  • 重识Nginx - 12 SSL/TLS 浅析
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • @angular/forms 源码解析之双向绑定
  • docker容器内的网络抓包
  • HTML-表单
  • Java基本数据类型之Number
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Sublime text 3 3103 注册码
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 利用DataURL技术在网页上显示图片
  • 爬虫模拟登陆 SegmentFault
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 一起参Ember.js讨论、问答社区。
  • Prometheus VS InfluxDB
  • Spring Batch JSON 支持
  • 阿里云重庆大学大数据训练营落地分享
  • 关于Android全面屏虚拟导航栏的适配总结
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (力扣)1314.矩阵区域和
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)Neo4j下载安装以及初次使用
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 5种线程安全集合
  • .net 7 上传文件踩坑
  • .Net Web窗口页属性
  • .net 微服务 服务保护 自动重试 Polly
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET企业级应用架构设计系列之结尾篇
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • []FET-430SIM508 研究日志 11.3.31
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android]使用Git将项目提交到GitHub
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [ffmpeg] x264 配置参数解析