Spring-IOC容器注解方式整合三层架构

注解方式特点

//1. 完全注解方式指的是去掉xml文件,使用配置类 + 注解实现
//2. xml文件替换成使用@Configuration注解标记的类
//3. 标记IoC注解:@Component,@Service,@Controller,@Repository 
//4. 标记DI注解:@Autowired @Qualifier @Resource @Value
//5. <context:component-scan标签指定注解范围使用@ComponentScan(basePackages={"com.atguigu.components"})替代
//6. <context:property-placeholder引入外部配置文件使用      @PropertySource({"classpath:application.properties","classpath:jdbc.properties"})替代
//7. <bean 标签使用@Bean注解和方法实现
//8. IoC具体容器实现选择AnnotationConfigApplicationContext对象

案例:

搭建一个三层架构案例,模拟查询全部学生(学生表)信息,持久层使用JdbcTemplate和Druid技术,使用注解+配置类方式进行组件管理

1.数据库准备

-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `students`;
CREATE TABLE `students`  (
  `id` int NOT NULL,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `gender` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `age` int NULL DEFAULT NULL,
  `class` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES (1, '喜羊羊', '男', 18, '高中一班');
INSERT INTO `students` VALUES (2, '美羊羊', '女', 19, '高中二班');
INSERT INTO `students` VALUES (3, '懒羊羊', '男', 18, '高中一班');
INSERT INTO `students` VALUES (4, '沸羊羊', '男', 18, '高中三班');
INSERT INTO `students` VALUES (5, '暖羊羊', '女', 19, '高中二班');
INSERT INTO `students` VALUES (6, '软绵绵', '男', 60, '高中一班');
INSERT INTO `students` VALUES (7, '灰太狼', '男', 30, '高中三班');
INSERT INTO `students` VALUES (8, '红太狼', '女', 30, '高中二班');

SET FOREIGN_KEY_CHECKS = 1;

2.项目准备

        1.项目创建
        2. pojo包下创建实体类Student
@Setter//使用lombok,实现set方法
public class Student {

    private Integer id;
    private String name;
    private String gender;
    private Integer age;
    private String classes;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", classes='" + classes + '\'' +
                '}';
    }
}
        3.三层架构搭建和实现
                a.持久层
public interface StudentDao {

    List<Student> queryAll();
}


public class StudentDaoImpl  implements StudentDao {
    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public List<Student> queryAll() {

        String sql = "select id , name , age , gender , class as classes from students ;";

        /*
          query可以返回集合!
          BeanPropertyRowMapper就是封装好RowMapper的实现,要求属性名和列名相同即可
         */

        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Student.class));
    }
}
                b.业务层
public interface StudentService {
    List<Student> findAll();
}


@Service
public class StudentServiceImpl  implements StudentService{
    private StudentDao studentDao;

    @Override
    public List<Student> findAll() {
        List<Student> studentList = studentDao.queryAll();
        return studentList;
    }

    @Autowired
    public void setStudentDao(StudentDao studentDao) {
        this.studentDao = studentDao;
    }
}
                c.表述层
@Controller
public class StudentController {
    private StudentService studentService;
    @Autowired
    public void setStudentService(StudentService studentService) {
        this.studentService = studentService;
    }

    public void findAll(){
        List<Student> all = studentService.findAll();
        System.out.println("all = " + all);
    }
}
4.IOC配置类
// 标识这是一个 Java 配置类
@Configuration 
// 使用 ComponentScan 注解来扫描包 org.example
@ComponentScan(basePackages = "org.example")
// 使用 PropertySource 注解来加载 classpath:jdbc.properties 文件中的配置信息
@PropertySource("classpath:jdbc.properties") 
public class JavaConfig {

    @Bean // 定义一个数据源 bean
    public DataSource dataSource( // 注入 driver、url、username、password 等配置信息
                                  @Value("${cx.driver}") String driver,
                                  @Value("${cx.url}") String url,
                                  @Value("${cx.username}") String username,
                                  @Value("${cx.password}") String password) {

        // 创建一个 DruidDataSource 对象
        DruidDataSource dataSource = new DruidDataSource();
        // 设置驱动类名
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url); 
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        // 返回数据源 bean
        return dataSource;
    }

    @Bean // 定义一个 JdbcTemplate bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) { // 注入数据源 bean
        // 创建一个 JdbcTemplate 对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        // 设置数据源
        jdbcTemplate.setDataSource(dataSource); 
        return jdbcTemplate;
    }
}
5.测试包下运行测试
public class SpringIoCTest {
    @Test
    public void test(){
        //使用 AnnotationConfigApplicationContext 类初始化一个应用程序上下文对象,
        //同时指定了配置类 JavaConfig.class。
        //通过这个应用程序上下文对象直接获取 StudentController 类型的 bean 实例。
        //调用 controller 对象的 findAll() 方法,执行相应的操作
        StudentController controller = new AnnotationConfigApplicationContext(JavaConfig.class)
                .getBean(StudentController.class);
        controller.findAll();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472489.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于肤色模型(YCbCr模型)的人面定位统计算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

计算机视觉之三维重建(2)---摄像机标定

文章目录 一、回顾线代1.1 线性方程组的解1.2 齐次线性方程组的解 二、透镜摄像机的标定2.1 标定过程2.2 提取摄像机参数2.3 参数总结 三、径向畸变的摄像机标定3.1 建模3.2 求解 四、变换4.1 2D平面上的欧式变换4.2 2D平面上的相似变换和仿射变换4.3 2D平面上的透射变换4.4 3D…

音视频开发_SDL跨平台多媒体开发库实战

SDL&#xff08;Simple DirectMedia Layer&#xff09;是一个非常流行和强大的跨平台开发库&#xff0c;它主要被用来开发视频游戏和实时多媒体应用程序。它提供了一系列的功能来处理视频、音频、键盘、鼠标、操纵杆、图形硬件加速以及聚焦3D硬件的各种功能。SDL的API通过C编程…

串行通信协议 SPI

SPI&#xff08;Serial Peripheral Interface&#xff09;是一种串行通信协议&#xff0c;常用于连接微控制器、存储器、传感器和其他外围设备。SPI通常由一个主设备&#xff08;通常是微控制器&#xff09;和一个或多个从设备组成。 1、SPI通信一般由四根线组成: SCLK&#x…

Java学习笔记20——枚举类型的创建与使用

在实际编程中&#xff0c;存在着这样的“数据集”&#xff0c;它们的数值在程序中是稳定的并且个数是有限的。例如春、夏、秋、冬四个数据元素组成了四季的“数据集”&#xff0c;一月到十二月组成了十二个月份的“数据集”&#xff0c;周一到周五及周六周日组成了每周七天的“…

无论是自学还是培训,找工作都要有舍我其谁的信心

不要说自己不行&#xff0c;要说自己可以&#xff0c;做的很不错。 我在投简历的时候&#xff0c;没有包装&#xff0c;然后在与hr沟通的时候&#xff0c;就会遇到 hr问技术能力如何这样的相关问题&#xff0c;其实我觉得我自己不够自信&#xff0c;想要获得一个offer。必须先…

25 OpenCV模板匹配算法

文章目录 介绍匹配算法介绍matchTemplate 模板匹配算子minMaxLoc 找出图像中的最大值最小值代码示例 介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。 所以模板匹配首先需要一个模板图像T&#xff08;给定的子图像&#xff09; 另外需要一个待检测的图像-源图…

必看!想入行嵌入式该准备些什么?

近日&#xff0c;很多人问华妹&#xff1a;想入行嵌入式该怎么准备。很能理解大家对于嵌入式的关注&#xff0c;嵌入式系统是当今科技领域中的重要组成部分&#xff0c;它存在于我们生活的方方面面&#xff0c;各行各业。智能化时代的到来也让嵌入式技术炙手可热&#xff01; …

高通平台初步

网上找的图&#xff0c;大体差不多&#xff0c;但是有些细节有点奇怪。 上面的图有点小怪&#xff0c;主要是Libraies&#xff0c;Framework&#xff0c;App&#xff0c;这部分感觉应该是Google的。其他的没啥问题。 大概整理一下编译流程吧。 首先是安装环境&#xff0c;一些…

如何对静态IP进行测试?静态IP有什么优点?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

Controller中接收数组参数

1、场景 需要根据用户id集合批量删除用户数据&#xff0c;前端使用post请求&#xff0c;controller中参数接收数组参数并根据用户id删除用户基本信息 2、分析处理&#xff1a; 2.1、前端请求类型contentType:application/json 请求体中为json字符串&#xff0c;后端新建一个U…

力扣23. 合并 K 个升序链表(最小堆)

Problem: 23. 合并 K 个升序链表 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.创建虚拟头节点dummy并创建辅助指针p指向dummy&#xff1b; 2.创建最小堆minHeap将每个链表的头节点存入; 3.当minHeap不为空时每次让p指向从最小堆堆顶取出的节点node&#xff0…

【小沐学AI】Google AI大模型的一点点学习(Python)

文章目录 1、Google AI简介1.1 Google AI Studio1.2 Bard1.3 PaLM1.4 Gemini1.5 Gemini API1.6 Vertex AI1.7 Gemma 2、Google AI开发2.1 快速入门2.1.1 配置开发环境2.1.2 列出所有模型2.1.3 从文本输入生成文本2.1.4 从图像和文本输入生成文本2.1.5 聊天对话 结语 1、Google …

Covalent Network(CQT)与 Celo 集成,推动 Web3 下一代现实资产解决方案的发展

Covalent Network&#xff08;CQT&#xff09;是一个统一的区块链 API 提供商&#xff0c;其已正式与 Celo 集成&#xff0c;Celo 是一个以移动优先的 EVM 兼容链。这一重要的里程碑旨在提升 Celo 生态系统中开发者的能力&#xff0c;通过授予他们访问关键链上数据的权限&#…

踏“时间”与“空间”前来探寻复杂度的奥妙(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

基于WTR096-28SS芯片方案的宠物喂食器实现智能化喂食功能

一、简介 本方案宠物喂食器采用了WTR096-28SS芯片方案来实现智能化的喂食功能。该方案结合了先进的技术和设计理念&#xff0c;提供了便捷、智能和个性化的宠物喂食解决方案。 该宠物喂食器具备定时、定量喂食功能&#xff0c;可以根据主人设定的时间和食物量&#xff0c;自动…

xercesc库保存XML功能实现

目录 一 参考链接 二 运行结果 三 代码 一 参考链接 DOM Programming Guide (apache.org) Xerces-c DOM XML文件的构造_xerces-c domimplementation-CSDN博客 Xerces-c库的使用-CSDN博客 二 运行结果 三 代码 #if 1//参考链接&#xff1a; https://blog.csdn.net/RGBMa…

HarmonyOS NEXT应用开发之SideBarContainer侧边栏淡入淡出动效实现案例

介绍 在2in1或平板上&#xff0c;群聊侧边栏是一种较为常用的功能&#xff0c;虽然HarmonyOS已经具备了基本的动效&#xff0c;但是部分情况下开发者可能有定制侧边栏动效的需求&#xff0c;本例主要介绍了如何基于显式动画实现侧边栏的淡入淡出动效。 效果图预览 使用说明&a…

【区间、栈】算法例题

目录 六、区间 48. 汇总区间 ① 49. 合并区间 ② 50. 插入区间 ② 51. 用最少数量的箭引爆气球 ② 七、栈 52. 有效的括号 ① 53. 简化路径 ② 54. 最小栈 ② 55. 逆波兰表达式求值 ② √- 56. 基本计算器 ③ 六、区间 48. 汇总区间 ① 给定一个 无重复元素 的 …

静态代理IP如何测试?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…