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对象@Resourceprivate 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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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属性值保持一致)

代码块

@Autowiredprivate 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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--Spring IOC扫描器作用:bean对象的统一管理,简化开发配置,提高开发效率。1.设置自动化扫描的范围如果bean对象未在扫描范围,即使声明了注解,也不会被实例化2.在需要被实例化的JavaBean的类上添加指定的注解(注解声明在类级别) (bean对象的id属性默认是 类的首字母小写)Dao:@RepositoryService:@ServiceController:@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 {@Resourceprivate TypeDao typeDao;public void test(){System.out.println("TypeService Test...");typeDao.test();}
}

Controller层-@Controller

@Controller
public class TypeController {@Autowiredprivate 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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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 {@Resourceprivate 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 {@Autowiredprivate 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");//得到实例化的userControllerUserController 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");

在这里插入图片描述

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

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

相关文章

几个有趣的go服务框架

开篇先吐槽几句&#xff5e; 我个人有一些习惯&#xff0c; 比如在服务设计时会考虑的比较长远&#xff0c;会考虑到到未来的扩展等等…然后程序设计的抽象成度就会比较高&#xff0c;各个模块之间解耦&#xff0c;但这样往往就会带来程序的复杂度提升。 这其实在一些公司里面…

Qt之explicit作用及用法

在 Qt 中&#xff0c;explicit 是一个关键字&#xff0c;用于修饰类构造函数。explicit 的主要作用是防止隐式类型转换&#xff0c;即禁止编译器使用该构造函数进行隐式类型转换。 在 C 中&#xff0c;当一个构造函数只接受一个参数的时候&#xff0c;它可能会被用于执行隐式类…

微信小程序 ---- 通过 URLScheme 或 URLLink 从短信、邮件、微信外网页等场景打开小程序

1. 用于短信、邮件、网页、微信内等拉起小程序的方法 《URL Scheme 拉起小程序》《URL Link 拉起小程序》 2. 功能描述 URL Scheme: 该接口用于获取小程序 scheme 码&#xff0c;适用于短信、邮件、外部网页、微信内等拉起小程序的业务场景。目前仅针对国内非个人主体的小程…

奇技淫巧:如何给项目中的RabbitMQ添加总开关

本文主要分享了如何给项目中的RabbitMQ添加总开关&#xff0c;通过简单配置开/关RabbitMQ。 一、需求背景 SpringBoot项目里使用了RabbitMQ&#xff0c;但某些场景下&#xff0c;不希望项目启动时自动检查RabbitMQ连接 例如&#xff1a; 在开发不需要RabbitMQ的功能过程中&…

WEB:探索开源PDF.js技术应用

1、简述 PDF.js 是一个由 Mozilla 开发的开源 JavaScript 库&#xff0c;用于在浏览器中渲染 PDF 文档。它的目标是提供一个纯粹的前端解决方案&#xff0c;摆脱了依赖插件或外部程序的束缚&#xff0c;使得在任何支持 JavaScript 的浏览器中都可以轻松地显示 PDF 文档。 2、…

C语言中指针变量如何使用

一、指针变量的定义与声明 1.1 定义 指针变量是用来存储另一个变量的内存地址的变量。在C语言中&#xff0c;指针变量的类型是指向某个类型的指针。例如&#xff0c;int *p; 表示一个整型指针变量p。 1.2 声明 指针变量的声明分为两种形式&#xff0c;一种是直接声明&#…

linux-磁盘扩容 -- 小黑日常超细教程

hi~ 这次小黑带来的是linux磁盘扩容超细教学&#xff0c;按照步骤来&#xff0c;超容易~ 目录 模拟实验对象&#xff1a; 1、查看磁盘分区和挂载点 2、查看新增磁盘 3、将新磁盘格式化&#xff0c;建立新分区 4、查看vg卷组信息 5、分区添加卷组 6、扩容 问题&…

单测结果不稳定的终极解决方案(Maven单测参数调优)

一、前言 近期&#xff0c;在公司平台执行单测任务时&#xff0c;我发现到一个显著的问题&#xff1a;我们的一个应用&#xff0c;在公司平台上执行单测时&#xff0c;即使是相同的代码&#xff0c;每次的执行结果&#xff08;包括行覆盖率以及单测通过率&#xff09;都存在差…

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…

《Redis实战》学习笔记

特点 &#xff1a;1、是一个高性能的key/value内存型数据库 2、支持丰富的数据类型(string,List,Set,ZSet,Hash) 3、支持持久化 内存数据&#xff0c; 可以持久化到硬盘中 4、单进程&#xff0c;单线程 效率高 redis实现分布式锁 一、redis的相关指令 1、flushDB 清空当前…

LDD学习笔记 -- Linux设备驱动概述

LDD学习笔记 -- Linux设备驱动概述 概述分类字符设备驱动块设备驱动 设备文件 概述 设备驱动&#xff1a;配置和管理设备的一段代码。 负责与硬件设备进行交互&#xff0c;并导出应用程序和其他内核模块可以用来访问设备的接口。 该代码能够通过向设备发送数据来配置设备&am…

Flink实时电商数仓之旁路缓存

撤回流的处理 撤回流是指流式处理过程中&#xff0c;两表join过程中的数据是一条一条跑过来的&#xff0c;即原本可以join到一起的数据在刚开始可能并没有join上。 撤回流的格式&#xff1a; 解决方案 定时器&#xff1a;使用定时器定时10s&#xff08;数据最大的时间差值&am…

7.14解数独(LC37-H)

算法&#xff1a; 二维递归&#xff08;递归时需要两层for循环&#xff09; 一个for循环放行 另一个for循环放列 画树&#xff1a; 因为这个树形结构太大了&#xff0c;我抽取一部分&#xff0c;如图所示&#xff1a; 回溯三部曲&#xff1a; 1.确定函数参数和返回值 返…

在Gradle工程中使用checkstyle来规范你的项目

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项…

CSS transition详解

文章目录 属性transition-propertytransition-durationtransition-timing-functiontransition-delaytransition 简写属性 方法Element&#xff1a;transitionrun 事件Element&#xff1a;transitionstart 事件Element&#xff1a;transitionend 事件Element&#xff1a;transit…

音频DAC,ADC,CODEC高性能立体声

想要让模拟信号和数字信号顺利“交往”&#xff0c;就需要一座像“鹊桥”一样的中介&#xff0c;将两种不同的语言转变成统一的语言&#xff0c;消除无语言障碍。这座鹊桥就是转换器芯片&#xff0c;也就是ADC芯片。ADC芯片的全称是Analog-to-Digital Converter, 即模拟数字转换…

【白盒测试】逻辑覆盖和路径测试的设计方法

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

互联网演进历程:从“全球等待”到“全球智慧”的技术革新与商业变革

文章目录 一、导言二、World Wide Wait (全球等待)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 三、World Wide Web (万维网)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 四、World Wide Wisdom (全球智慧)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 五、…

Vue 3.4 正式版发布,带来多项更新

12 月 28 日,Vue 3.4 正式版发布,代号为“🏀 Slam Dunk”,即灌篮高手。据尤大接收,这个版本进行了许多重要的内部改进,其中最引人瞩目的是重写的模板解析器。新的解析器将速度提高了 2 倍,显著提升了整体性能。 此外,响应性系统也经过了重构,使得 effect 触发更为精…

Java编程中的IO模型详解:BIO,NIO,AIO的区别与实际应用场景分析

IO模型 IO模型就是说用什么样的通道进行数据的发送和接收&#xff0c;Java 共支持3种网络编程IO 模式&#xff1a;BIO,NIO,AIO BIO(Blocking lO) 同步阻塞模型&#xff0c; 一个客户端连接对应一个处理线程 代码示例&#xff1a; package com.tuling.bio; import java.io.…