Spring常用注解及模拟用户登录流程示例

注解

  • @Resource注解实现自动注入 (反射)
    • 代码块
    • xml配置文件
  • @Autowired注解实现自动化注入
    • 代码块
    • xml配置文件
  • 扫描器-四个注解
    • Dao层-@Repository
    • Service层-@Service
    • Controller层-@Controller
    • 测试
    • 任意类-@Component
  • 常用注解示例-模拟用户登录
    • 配置自动扫描的xml文件
    • 实体类User
    • dao层
    • 消息模型对象MessageModel
    • service层
    • controller层
    • 测试Test
      • 第一种:用户密码不正确!
      • 第二种:用户名或密码不能为空
      • 第三种:用户名不存在!
      • 第四种:登陆成功!

@Resource注解实现自动注入 (反射)

  1. 注解默认通过属性字段名称查找对应的bean对象(属性宇段名称与bean标签的id属性值一致)
  2. 如果属性字段名称不一样,则会通过类型 (CLass ) 类型
  3. 属性字段可以提供set方法 也可以不提供
  4. 注解可以声明在属性字段上 或 set 方法级别
  5. 可以设置注解的name属性,name属性值要与bean标签的id属性值一致(如果设置了name属性,则会按照name 属性查询bean对象)
  6. 当注入接口时,如果接口只有一个实现类,则正常实例化;如果接口有多个实现类,则需要使用name 属性指定需要被实例化的bean对象

代码块

//注入JavaBean对象
    @Resource
    private UserDao userDao;
    
    public void test(){
        System.out.println("UserService Test...");
        userDao.test();
    }
public static void main( String[] args )
    {

        ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");

        UserService userService= (UserService) ac.getBean("userService");
        userService.test();
    }

xml配置文件

<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
       http://www.springframework.org/schema/context/spring-context.xsd">

<!--   开启自动化注入(装配) -->
    <context:annotation-config></context:annotation-config>

<!--    配置bean对象-->
    <bean id="userDao" class="com.svt.dao.UserDao"></bean>
    <bean id="userService" class="com.svt.service.UserService"></bean>
</beans>

@Autowired注解实现自动化注入

  1. 注解默认使用类型 (CLass 类型) 查找bean 对象,与属性字名称没有关系
  2. 属性字可以提供set 方法 也可以不提供
  3. 注解可以声明在属性级别 或 set 方法级别
  4. 如果想要通过指定名称查bean对象,需要结合@Qualifier 使用(通过设置value 属性值查找,value 属性值要bean标签的id属性值保持一致)

代码块

@Autowired
    private AccountDao accountDao;

    public void test(){
        System.out.println("UserDao Test...");
        accountDao.test();
    }
public static void main( String[] args )
    {

        ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");

        AccountService accountService= (AccountService) ac.getBean("accountService");
        accountService.test();
    }

xml配置文件

<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
       http://www.springframework.org/schema/context/spring-context.xsd">

<!--   开启自动化注入(装配) -->
    <context:annotation-config></context:annotation-config>

<!--    account-->
    <bean id="accountDao" class="com.svt.dao.AccountDao"></bean>
    <bean id="accountService" class="com.svt.service.AccountService"></bean>
</beans>

推荐使用@Resource注解是属于J2EE的,减少了与Spring的耦合
原因 来源
来源不同:@Autowired 来自 Spring 框架,而 @Resource 来自于(Java)JSR-250

@Autowired功能虽说非常强大,但是也有些不足之处。比如它跟Spring强耦合了,如果换成了其他框架,功能就会失效。而@Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。

依赖查找的顺序不同:@Autowired 先根据类型再根据名称查询,而 @Resource 先根据名称再根据类型查询

Autowired默认按byType自动装配,而@Resource默认byName自动装配。

支持的参数不同:@Autowired 只支持设置 1 个参数,而 @Resource 支持设置 7 个参数

@Autowired只包含一个参数:required,表示是否开启自动准入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name 和 type。

依赖注入的用法支持不同:@Autowired 既支持构造方法注入,又支持属性注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入

@Autowired能够用在:构造器、方法、参数、成员变量和注解上,而@Resource能用在:类、成员变量和方法上。

编译器 IDEA 的提示不同:当注入 Mapper 对象时,使用 @Autowired 注解编译器会提示错误,而使用 @Resource 注解则不会提示错误

@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。

扫描器-四个注解

设置了扫描器就只需要在xml文件内自动设置扫描范围,其余交给注解去实例化即可

<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
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--
            Spring IOC扫描器
            作用:bean对象的统一管理,简化开发配置,提高开发效率。

            1.设置自动化扫描的范围
                如果bean对象未在扫描范围,即使声明了注解,也不会被实例化
            2.在需要被实例化的JavaBean的类上添加指定的注解(注解声明在类级别) (bean对象的id属性默认是 类的首字母小写)
                Dao:
                    @Repository
                Service:
                    @Service
                Controller:
                    @Controller
                任意类:
                    @Component:开发过程中建议按照规则声明注解。
    -->
<!--    设置自动化扫描范围-->
    <context:component-scan base-package="com.svt"></context:component-scan>
</beans>

Dao层-@Repository

@Repository
public class TypeDao {
    public void test(){
        System.out.println("TypeDao Test...");
    }
}

Service层-@Service

@Service
public class TypeService {

    @Resource
    private TypeDao typeDao;

    public void test(){
        System.out.println("TypeService Test...");
        typeDao.test();
    }
}

Controller层-@Controller

@Controller
public class TypeController {

    @Autowired
    private TypeService typeService;

    public void test(){
        System.out.println("TypeController Test...");
        typeService.test();
    }
}

测试

public static void main( String[] args )
    {

        ApplicationContext ac=new ClassPathXmlApplicationContext("spring02.xml");

//        TypeDao typeDao= (TypeDao) ac.getBean("typeDao");
//        typeDao.test();

//        TypeService typeService= (TypeService) ac.getBean("typeService");
//        typeService.test();

        TypeController typeController= (TypeController) ac.getBean("typeController");
        typeController.test();
    }

在这里插入图片描述

任意类-@Component

不在三层架构内,另开了一个类,但是又需要实例化这个类,就可以用@Component注解
注:这个类需要包含在扫描器范围内,否则扫描不到也不会被实例化,最终报错

@Component
public class ProTest {
    public void test(){
        System.out.println("ProTest Test...");
    }
}
public static void main( String[] args )
    {

        ApplicationContext ac=new ClassPathXmlApplicationContext("spring02.xml");

//        TypeDao typeDao= (TypeDao) ac.getBean("typeDao");
//        typeDao.test();

//        TypeService typeService= (TypeService) ac.getBean("typeService");
//        typeService.test();

        TypeController typeController= (TypeController) ac.getBean("typeController");
        typeController.test();

        ProTest proTest= (ProTest) ac.getBean("proTest");
        proTest.test();
    }

在这里插入图片描述

常用注解示例-模拟用户登录

在这里插入图片描述

配置自动扫描的xml文件

自定义扫描范围

<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
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--    设置自动化扫描范围-->
    <context:component-scan base-package="com.svt"></context:component-scan>
</beans>

实体类User

先写一个实体类,放用户名称和用户密码

package com.svt.entity;


/**
 * User实体类
 */
public class User {
    private String userName;//用户名称
    private String userPwd;//用户密码

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPwd() {
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }
}

dao层

有了实体类就可以在dao层开始编写代码,先定义登陆的账号密码,再通过用户名查询用户对象,如果存在,返回对应的用户对象,如果不存在,返回null
这里用了注解@Repository

package com.svt.dao;

import com.svt.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public class UserDao {

    //定义登陆的账号密码
    private final String USERNAME="admin";
    private final String USERPWD="admin";

    /**
     * 通过用户名查询用户对象
     *      如果存在,返回对应的用户对象,如果不存在,返回null
     * @param userName
     * @return
     */
    public User queryUserByUserName(String userName){
        User user=null;

        //判断用户名是否存在
        if (!USERNAME.equals(userName)){
            return null;
        }

        //存在
        user=new User();
        user.setUserName(USERNAME);
        user.setUserPwd(USERPWD);

        return user;
    }
}

消息模型对象MessageModel

return的user需要接受处理,写一个消息模型对象来处理

package com.svt.entity.vo;

/**
 * 消息模型对象
 *  用来接收处理结果
 *      resultCode 状态码
 *      1=成功 0=失败
 *      resultMsg 提示信息
 */
public class MessageModel {
    private Integer resultCode = 1;//状态码
    private String resulyMag;//提示信息

    public Integer getResultCode() {
        return resultCode;
    }

    public void setResultCode(Integer resultCode) {
        this.resultCode = resultCode;
    }

    public String getResulyMag() {
        return resulyMag;
    }

    public void setResulyMag(String resulyMag) {
        this.resulyMag = resulyMag;
    }
}

service层

service层注入dao层的userDao,验证登陆是否成功
这里用了注解@Service@Resource

package com.svt.service;

import com.svt.dao.UserDao;
import com.svt.entity.User;
import com.svt.entity.vo.MessageModel;
import com.svt.util.StringUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserService {
    @Resource
    private UserDao userDao;


    /**
     * 验证登陆是否成功
     * 1. 参数的非空校验
     * 2. 通过用户名查询用户对象(调用Dao 层的查询方法)
     * 3.判断密码是否正确
     * @param uname
     * @param upwd
     * @return
     */
    public MessageModel checkUserLogin(String uname,String upwd){
        //返回消息模型
        MessageModel messageModel = new MessageModel();

        //1. 参数的非空校验
        if (StringUtil.isEmpty(uname) || StringUtil.isEmpty(upwd)){
            //用户名或密码不能为空
            messageModel.setResultCode(0);
            messageModel.setResulyMag("用户名或密码不能为空");
            return messageModel;
        }

        //2. 通过用户名查询用户对象(调用Dao 层的查询方法)
        User user = userDao.queryUserByUserName(uname);
        //判断用户对象是否为空
        if (user==null){
            messageModel.setResultCode(0);
            messageModel.setResulyMag("用户名不存在!");
            return messageModel;
        }

        //3.判断密码是否正确
        if (!upwd.equals(user.getUserPwd())){
            messageModel.setResultCode(0);
            messageModel.setResulyMag("用户密码不正确!");
            return messageModel;
        }

        //登陆成功
        messageModel.setResulyMag("登陆成功!");

        return messageModel;
    }
}

其中非空校验用了一个工具类StringUtil

package com.svt.util;

/**
 * 字符串工具类
 */
public class StringUtil {
    /**
     * 判断字符串是否为空
     * 为空返回true
     * 不为空返回false
     * @param str
     * @return
     */
    public static boolean isEmpty(String str){
        if (str==null || "".equals(str.trim())){
            return true;
        }
        return false;
    }
}

controller层

判断好了用UserController来接收这个对象
这里用了注解@Controller@Autowired

package com.svt.controller;

import com.svt.entity.vo.MessageModel;
import com.svt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    public MessageModel userLogin(String uname,String upwd){
        MessageModel messageModel=userService.checkUserLogin(uname,upwd);
        return messageModel;
    }
}

测试Test

一切准备就绪就在UserTest内进行测试

package com.svt.test;


import com.svt.controller.UserController;
import com.svt.entity.vo.MessageModel;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserTest {

    public static void main(String[] args) {
        //获取spring的上下文环境
        BeanFactory factory=new ClassPathXmlApplicationContext("spring.xml");

        //得到实例化的userController
        UserController userController= (UserController) factory.getBean("userController");
        MessageModel messageModel=userController.userLogin("admin","admin");
        System.out.println("状态码:"+messageModel.getResultCode()+",提示信息:"+messageModel.getResulyMag());
    }
}

不同的用户登录会呈现不同的提示信息

第一种:用户密码不正确!

MessageModel messageModel=userController.userLogin("admin","111");

在这里插入图片描述

第二种:用户名或密码不能为空

MessageModel messageModel=userController.userLogin("","");

在这里插入图片描述

第三种:用户名不存在!

MessageModel messageModel=userController.userLogin("11","11");

在这里插入图片描述

第四种:登陆成功!

MessageModel messageModel=userController.userLogin("admin","admin");

在这里插入图片描述

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

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

相关文章

【机器学习基础】DBSCAN

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;相对完整的机器学习基础教学&#xff01; ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战…

知识图谱企业图谱怎么做

随着人工智能技术的不断发展&#xff0c;知识图谱技术逐渐在各行各业得到了广泛应用&#xff0c;为各行业企业提供了强有力的数据分析手段。尤其是在金融、医疗、电商等领域&#xff0c;企业知识图谱技术可以帮助企业解决数据孤岛、信息孤岛等问题&#xff0c;实现数据整合与共…

腾讯云企业用户优惠活动整理汇总

腾讯云一直致力于为广大企业用户提供高品质、高性价比的云计算产品和服务。为了帮助企业用户更好地了解腾讯云的优惠活动&#xff0c;本文将对腾讯云企业用户的优惠活动进行整理汇总。 一、新客专享福利 腾讯云为新用户提供了一系列的优惠活动&#xff0c;除了可以领取专属代金…

[Mac软件]Boxy SVG 4.20.0 矢量图形编辑器

Boxy SVG 是一款入门级矢量图形编辑器&#xff0c;具有全套基本功能、易于学习的选项卡式界面和可自定义的键盘快捷键。有了它&#xff0c;您可以轻松创建横幅、图标、按钮、图形、界面草图&#xff0c;甚至有趣的表情包。 编辑器支持使用多种工具创建和编辑矢量对象&#xff…

【普中开发板】基于51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

基于普中开发板51单片机的篮球计分器液晶LCD1602显示 1.主要功能&#xff1a;讲解视频&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 基于51单片机的篮球计分器液晶LCD1602显示 ( pr…

【LLM】大型语言模型综述论文

今天我将与大家分享一篇精彩的论文。这项调查提供了LLM文献的最新综述&#xff0c;这对研究人员和工程师来说都是一个有用的资源。 为什么选择LLM&#xff1f; 当参数尺度超过一定水平时&#xff0c;这些扩展的语言模型不仅实现了显著的性能改进&#xff0c;而且还表现出一些…

1*2*3+3*4*5+...+99*100*101python,1加到100的程序算法python

大家好&#xff0c;本文将围绕python中123一直加到100程序怎么写展开说明&#xff0c;计算123456...100的值python是一个很多人都想弄明白的事情&#xff0c;想搞清楚计算1-23-45 … -100的值python需要先了解以下几个事情。 今天下午上python课的时候&#xff0c;老师留了一个…

Nginx 的SSL证书配置

目录 1.申请域名&#xff0c;证书下载 2.准备站点源代码 3.修改nginx 对应网站的配置文件 4.修改 host 文件 http协议访问的网站默认会显示不安全&#xff0c;因为数据默认是明文传输的 https是httpssl&#xff0c;ssl是加密协议&#xff0c;通过证书来进行加密的&#xff…

【Leetcode】2487. 从链表中移除节点

文章目录 题目思路代码 题目 2487. 从链表中移除节点 思路 1、递归移除节点&#xff1a; 如果头节点为空&#xff0c;直接返回空。递归调用函数处理下一个节点 head->next。在递归返回后&#xff0c;判断当前节点的值是否小于之前记录的最大值 maxVal。如果小于 maxVal…

全国计算机等级考试| 二级Python | 真题及解析(7)

一、选择题 1.python中,表达式5%2 = ( )。 A.2.5 B.2 C.1 D.0 2.已知字符串a="python",则a[ 1 : 3 ]的值为( ) A."pyth" B."pyt" C."py" D…

2023年工作初体验

23年终于正式入职&#xff0c;参与了正式上线的电商平台、crm平台等项目的研发&#xff0c;公司规模较小&#xff0c;气氛融洽&#xff0c;没有任何勾心斗角、末位淘汰&#xff0c;几乎没什么压力。虽然是我的第一家公司&#xff0c;但实际是个适合养老的公司&#xff08;笑 总…

郑州大学算法设计与分析实验2

判断题 1 #include<bits/stdc.h> using namespace std;const int N 50; int f[N], n;int main() { // freopen("1.in", "r", stdin);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;f[1] 1; f[2] 1;for(int i 3; i &l…

教程:Centos6迁移旧虚拟机文件后的网络配置教程,完美解决虚拟机移动后的网络ip变化问题

博主在工作后,想整整之前大学的虚拟机集群,因此特意从之前的旧电脑把虚拟机文件给拷贝了过来,在导入到vm-workstation,顺便能启动虚拟机后,发现之前的静态ip已经跟现在的宿主机网络不一样。想着重新配置,但觉得太麻烦,故想到了修改网卡的mac地址+网卡重配置方法,完美解…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)Buffer的创建和销毁、扩容、写入数据

TcpConnection:封装的就是建立连接之后得到的用于通信的文件描述符&#xff0c;然后基于这个文件描述符&#xff0c;在发送数据的时候&#xff0c;需要把数据先写入到一块内存里边&#xff0c;然后再把这块内存里边的数据发送给客户端&#xff0c;除了发送数据&#xff0c;剩下…

Ajax基础入门_Ajax概述,同步与异步,Axios的使用,JSON数据及FastJSON的使用

Ajax 文章目录 Ajax1 概述2 作用3 同步和异步3.1 同步3.2 异步 4 代码编写4.1 服务端4.2 客户端 5 Axios5.1 使用5.2 代码5.2.1 前端5.2.2 后端 5.3 请求方法别名 6 JSON6.1 概述6.2 JSON 基础语法6.2.1 定义格式6.2.2 js 对象与JSON的转换 6.3 发送异步请求携带参数6.4 JSON串…

从0到1入门C++编程——03 内存分区、引用、函数高级应用

文章目录 一、内存分区二、引用三、函数的高级应用1.默认参数2.占位参数3.函数重载 一、内存分区 C程序在执行时&#xff0c;会将内存大致分为4个区&#xff0c;分别是代码区、全局区、栈区和堆区。 代码区用来存放函数体和二进制代码&#xff0c;由操作系统进行管理。 全局区…

docker镜像仓库详解(Docker Registry)

本片文章主要是对docker的镜像仓库进行了详解。其中包含了一些常用了 docker 指令&#xff0c;通过举例进行详解。也详细解释了镜像仓库的工作机制和常见的镜像仓库。也实际拉去和运行了一些镜像。希望本篇文章会对你有所帮助&#xff01; 文章目录 一、什么是Docker Registry …

jQuery图片放大缩小旋转预览代码

jQuery图片放大缩小旋转预览代码-遇见你与你分享

基于SpringBoot的在线考试系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现在线考试的信息化管理。则对于进一步提高在线考试管理发展&#xff0c;丰富在线考试管理经验能起到不少的促进作用。 在线考试系统能够通…

独立看门狗与窗口看门狗

一、简介 STM32F10xxx内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障&#xff1b;当计数器达到给定的超时值时&#xff0c;触发一个中断(仅适用于窗口型看门狗)或产…