使用 spring 的 IoC 的实现账户的CRUD(2)双层实现+注解开发

news2024/11/17 15:35:57

在http://t.csdn.cn/yucl4的基础上进行注解开发
【分析】
在这里插入图片描述

  • xml文件其中spring容器中的bean,
  • 因此通过注解把这些放到容器中即可

@component:相当xml中的bean的id:

  • 如果不指定 value 属性,默认 bean 的 id 是当前类的类名, 首字母小写。
  • @Controller @Service @Repository是三个衍生

@Autowired

  • 自动按照类型注入。
  • 当使用注解注入属性时,setter 方法可以省略
  • 它只能注入其他 bean 类型(spring容器中有的)。
  • 当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。
  • @qualifier:按照id注入,必须与@Autowired搭配
package com.kfm.spring.dao;

import com.kfm.spring.model.Account;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.sql.SQLException;

/**
 * @author jkk
 */
@Component("accountdao")
public class IAccountdao implements Accountdao{

    @Autowired
    private QueryRunner queryRunner;
//    public void setQueryRunner(QueryRunner queryRunner){
//        this.queryRunner = queryRunner;
//    }
    @Override
    public Account findByid(int id) {
        String sql = "select * from account where id = ?";
        try {
            Account account = queryRunner.query(sql,new BeanHandler<>(Account.class),id);
            return account;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }
}

package com.kfm.spring.service;

import com.kfm.spring.dao.Accountdao;
import com.kfm.spring.model.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author jkk
 */
@Component("accountservice")
public class IAccountService implements AccounrService{
    @Autowired
    private Accountdao accountdao;
//    public  void setAccountdao(Accountdao accountdao){
//        this.accountdao = accountdao;
//    }
    @Override
    public Account findByid(int id) {
        return accountdao.findByid(id);
    }
}

.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://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="com.kfm.spring" ></context:component-scan>
    
    <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
        <constructor-arg name="ds" ref="datasource"></constructor-arg>
    </bean>
    <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/web"></property>
        <property name="user" value="root"></property>
        <property name="password" value=""></property>
    </bean>
    </beans>

可以注意到,现在还不是完全的注解开发,只是替换了两个,既然两个用注解替换,那么如何从spring的容器中找到
在这里插入图片描述
@Resource

  • 不属于spring的注解,属于java的注解
  • 默认按照名字去找
  • 有两个属性name和type
  • 如果同时指定name和type,则会找到一个唯一的值
  • 如果只指定name,那么会按照name找,找不到报异常
  • 如果只指定type,那么先按照type找,找不到异常,找到多个,根据字段名匹配取

在这里插入图片描述
在这里插入图片描述
如何进行完全注解开发——完全不需要.xml文件

package com.kfm.spring.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;

/**
 * @author jkk
 */
@Configuration
@ComponentScan({"com.kfm.spring"})
public class SpringConfig {



    @Bean(name = "datasource")
    public DataSource getDatasource(){
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        try {
            comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
            comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/web");
            comboPooledDataSource.setUser("root");
            comboPooledDataSource.setPassword("");
        } catch (PropertyVetoException e) {
            throw new RuntimeException(e);
        }
        return comboPooledDataSource;
    }
    @Bean(name = "queryRunner")
    public QueryRunner getQueryRunner(DataSource dataSource){
        return  new QueryRunner(dataSource);

    }
}

测试‘

package com.kfm.spring.service;

import com.kfm.spring.config.SpringConfig;
import com.kfm.spring.dao.Accountdao;
import com.kfm.spring.model.Account;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.*;

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = "classpath:bean.xml")
@ContextConfiguration(classes = SpringConfig.class)
public class IAccountServiceTest {
    @Autowired
    private AccounrService accounrService;
    @Test
    public void test1FindByid(){
        Account account = accounrService.findByid(1);
        System.out.println(account);
    }


    @Test
    public void testFindByid() {
        ApplicationContext cx = new AnnotationConfigApplicationContext(SpringConfig.class);
        AccounrService accounrService = (AccounrService) cx.getBean("accountservice");
        Account account = accounrService.findByid(1);
        System.out.println(account);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业论文选题推荐|软件工程|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)门窗账务管理系…

C++——类和对象(6)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月10日 内容&#xff1a;C类和对象内容讲解 目录 前言&#xff1a; 1.取地址操作符重载&#xff1a; 2.构造函数&#xff08;进阶&#xff09;&#xff1a; 1.初始化列表&#xff1a; 2.static成员&#xff1a; 结尾…

数据可视化工具 - ECharts饼形图的编写

1 饼形图 1年龄分布模块制作 1.1 官网找到类似实例&#xff0c; 适当分析&#xff0c;并且引入到HTML页面中 <!DOCTYPE html> <html> <head><meta charset"utf-8"/><title>ECharts</title><!-- 引入刚刚下载的 ECharts 文件…

Android WebRTC+SRS/ZLM视频通话(4):Android使用WebRTC推流SRS/ZLMediaKit

Android WebRTCSRS/ZLM视频通话&#xff08;4&#xff09;&#xff1a;Android使用WebRTC推流SRS/ZLMediaKit 来自奔三人员的焦虑日志 接着上一章内容&#xff0c;继续来记录Android是如何使用WebRTC往SRS或ZLMediaKit进行推流。想要在Android设备上实现高质量的实时流媒体推送…

VirtualBox+Vagrant

1.下载VirtualBox 1.下载 VirtualBox官网下载 下载过程无特别注意事项&#xff0c;注意调整到非 C 盘位置即可&#xff0c;其他部分皆为默认设置 2.修改虚拟电脑存储位置 1.将C:\Users\用户名下的VirtualBox VMs文件夹复制到自定义目标文件夹中 2.打开VirtualBox,在全局设置…

嵌入式TCP/IP协议栈-LwIP

文章目录 LWIP是什么基础知识OSI七层模型TCP/IP五层模型LwIP的模型常见协议ARP协议ICMP协议DHCP协议DNS协议 LwIP APISocket大端模式与小端模式地址字节序IP地址转换 网络并发 LWIP是什么 LWIP是一个轻量级的TCP/IP协议栈&#xff0c;其全称为Lightweight IP&#xff0c;它专门…

UNIX网络编程卷一 学习笔记 第十二章 IPv4与IPv6的互操作性

未来数年内&#xff0c;因特网也许会逐渐从IPv4过渡到IPv6&#xff0c;在过渡阶段&#xff0c;基于IPv4的现有应用能与基于IPv6的全新应用协同工作非常重要。例如&#xff0c;厂商不应只提供仅能与IPv6 telnet服务器程序协同工作的telnet客户程序&#xff0c;而应该提供既能与I…

环境搭建:Visual Studio的安装和创建C++项目

Visual Studio的安装和创建C项目 引言前言下载Visual Studio安装包安装Visual Studio创建项目小结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0c;让世界没有难学的技术。 &#x1f449; &#x1f396;️ C…

第五十章 Unity Input Manager 输入系统(上)

Unity的输入系统支持多种输入设备&#xff0c;比如键盘和鼠标&#xff0c;游戏手柄&#xff0c;触摸屏&#xff0c;VR和AR控制器等等。Unity 通过两个独立的系统提供输入支持&#xff1a;第一&#xff0c;输入管理器 (Input Manager) 是 Unity 核心平台的一部分&#xff0c;默认…

数据可视化一、ECharts

零、文章目录 数据可视化一、ECharts 1、数据可视化 &#xff08;1&#xff09;数据可视化 数据可视化主要目的&#xff1a;借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。数据可视化可以把数据从冰冷的数字转换成图形&#xff0c;揭示蕴含在数据中的规律和道理。…

TGANet:用于改进息肉分割的文本引导注意力

文章目录 TGANet: Text-Guided Attention for Improved Polyp Segmentation摘要本文方法编码器模块Feature Enhancement ModuleLabel AttentiondecoderMulti-scale Feature Aggregation损失函数 实验结果 TGANet: Text-Guided Attention for Improved Polyp Segmentation 摘要…

2023年湖北建设厅特种工报名需要什么条件?报名流程是什么?

2023年湖北建设厅特种工报名需要什么条件&#xff1f;报名流程是什么&#xff1f; 建设厅特种工现在已经开始报名考试安排计划了&#xff0c;想要报考建设厅特种工的现在可以了解一下具体的流程以及相关信息哟。为自己报名考试做准备&#xff0c;下面启程别就来给您介绍一下建设…

从入门到精通:接口自动化测试中加密、解密和Sign签名的完整指南

【专业解读】接口自动化测试安全机制剖析&#xff1a;加密、解密和sign签名技术原理与应用&#xff01; 目录 摘要&#xff1a; 1. 加密 2. 解密 3. Sign签名 4. 示例 摘要&#xff1a; 在进行接口自动化测试时&#xff0c;加密、解密和sign签名是非常重要的步骤。这些过…

基于单片机的数字频率计设计

数字频率计概述 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号&#xff0c;方波信号及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试…

基于AT89C52单片机的温度检测设计与仿真

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87770153 源码获取 主要内容: 本设计是基于52系列的单片机进行的设计,可以完成温度的测控,可以实现实际温度与设定温度区域的比较,并在LED上相应的显示结果。设计过程在硬…

算法 DAY57 动态规划13 647. 回文子串 516.最长回文子序列

647. 回文子串 暴力解法&#xff1a;两层for循环&#xff0c;再加一个判断是否是回文子串&#xff0c;时间复杂度O(n3) 五部曲 1、 判断一个子字符串&#xff08;字符串的下表范围[i,j]&#xff09;是否回文&#xff0c;依赖于&#xff0c;子字符串&#xff08;下表范围[i 1,…

CLion安装(详细步骤+截图)

目录 一、CLion-2021.1.3.exe 下载 二、运行环境mingw-w64压缩包下载 三、 安装插件 ---- ide-eval-resetter-2.1.13压缩包下载 一、CLion-2021.1.3.exe 下载 Other Versions - CLion (jetbrains.com) 1、下载 2、更改路径 &#xff08;不要放在含有中文的路径下&a…

【Java面试】Java基础-集合相关知识点(1)

文章目录 1. 集合有哪些类&#xff1f;2. ArrayList3. Map主要有哪些类&#xff1f; 容器主要包括 Collection 和 Map 两种&#xff0c;Collection 存储着对象的集合&#xff0c;而 Map 存储着键值对(两个对象)的映射表。 1. 集合有哪些类&#xff1f; 集合是一组相关对象的容…

ThreadLocal底层源码解析

线程隔离&#xff0c;保证多线性访问安全 每个线程拿到的值私有&#xff0c;相互不干扰 ThreadLocal是JDK包提供的&#xff0c;它提供线程本地变量&#xff0c;如果创建一乐ThreadLocal变量&#xff0c;那么访问这个变量的每个线程都会有这个变量的一个副本&#xff0c;在实际…

跳槽? 我只想多赚点罢了

前言 五一过后也就也就意味着今年的金三银四跳槽季正式结束了&#xff0c;不知道大家是否拿到了offer&#xff0c;面对金三银四的招聘旺季&#xff0c;如果没有精心准备那笔者认为那是对自己不负责任&#xff1b;就我们测试员来说&#xff0c;多数的公司总体上面试都是以自我介…