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.hqwc.cn/news/319880.html

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

相关文章

椭球面系列---大地坐标和笛卡尔坐标的相互转换

目录 大地坐标笛卡尔坐标大地坐标 ( λ , φ , h ) (\lambda,\varphi,h) (λ,φ,h)转换为笛卡尔坐标 ( x , y , z ) (x,y,z) (x,y,z)笛卡尔坐标 ( x , y , z ) (x,y,z) (x,y,z)转换为大地坐标 ( λ , φ , h ) (\lambda,\varphi,h) (λ,φ,h) 椭球体下&#xff0c;尤其是地球的…

高端大气的在线文档

背景 产品介绍&#xff0c;帮助手册&#xff0c;操作手册&#xff0c;开发说明&#xff0c;个人的简单网站等等&#xff0c;都需要一个在线的文档&#xff0c;特别是开源社区的在线文档也非常需要&#xff0c;开源社区也为此提供了大量的工具。如何找到一款高端大气的&#xf…

支付宝小程序源码系统:自由DIY+完整的安装部署教程

随着移动互联网的快速发展&#xff0c;支付宝小程序已成为众多企业及开发者关注的焦点。然而&#xff0c;市面上的支付宝小程序源码系统往往难以满足个性化需求&#xff0c;且安装部署过程复杂。今天来给大家分享一款支付宝小程序源码系统。这款自由DIY的支付宝小程序源码系统&…

析构和友元函数

1. 类的析构函数 析构函数的作用&#xff0c;用于释放该类所占用的资源&#xff08;或者说释放对象&#xff09;在类的对象使用完时&#xff08;当类的对象超出了作用域&#xff09;&#xff0c;会自动调用析构函数&#xff1b;如果是在堆区实例化的对象&#xff0c;那么当手动…

Redis 持久化—RDB

文章目录 1. 为什么需要Redis持久化&#xff1f;2. Redis持久化的几种方式3. RDB简介4. 持久化触发4.1 手动触发4.1.1 save命令4.1.2 bgsave 命令 4.2 自动触发4.2.1 save m n4.2.2 flushall4.2.3 主从同步触发 5. 配置说明6. 配置配置7. 配置配置8. RDB 文件恢复9. RDB 优缺点…

如何计算非线性负载的功率需求?

非线性负载的功率需求计算是一个相对复杂的过程&#xff0c;因为非线性负载的电流和电压之间的关系不是简单的正比关系。在计算非线性负载的功率需求时&#xff0c;需要考虑负载的特性、工作状态以及电源电压等因素。 确定负载的类型&#xff1a;首先需要了解负载的具体类型&am…

基于Kettle开发的web版数据集成开源工具(data-integration)-部署篇

目录 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 下载编译&#x1f4d7;下载&#x1f4d7;编译 &#x1f4da;第三章 部署&#x1f4d7;准备工作&#x1f4d5; 安装数据库&redis&consul&#x1f4d5; 修改…

四则运算 C语言xdoj20

问题描述&#xff1a; 输入两个整数和一个四则运算符&#xff0c;根据运算符计算并输出其运算结果&#xff08;和、差、积、商、余之一&#xff09;。注意做整除及求余运算时&#xff0c;除数不能为零。 输入说明&#xff1a; 使用scanf()函数输入两个整数和一个运算符&#xf…

Application layer

title: 应用层 date: 2023-12-20 21:03:48 tags: 知识总结 categories: 计算机网络 应用层&#xff1a;负责最直观的应用请求的封装、发起 一、域名系统DNS 连接在互联网上的主机不仅有IP地址&#xff0c;还有便于用户记忆的主机名字。域名系统DNS能够把互联网上的主机的名字…

Wireshark本地回环网络抓包

背景 因为发往本机的数据包是通过回环地址的&#xff0c;即&#xff1a;数据包不会通过真实的网络接口发送&#xff0c;因此我们需要通过设置路由规则来让本来发到虚拟网络接口的数据包发送到真实网络接口即可。 场景描述&#xff1a;在网络程序开发的过程中&#xff0c;有时…

深入理解可变参数

1.C语言方式 1.1.宏介绍 C语言中的可变参数是指函数可以接受可变数量的参数。这些参数的数量在编译时是未知的。在这些可变参数中的参数类型可以相同&#xff0c;也可以不同&#xff1b;可变参数的每个参数并没有实际的名称与之相对应&#xff0c;用起来是很灵活&#xff1b;…

Docker安装sentinel控制台

1、拉取镜像&#xff0c;直接使用run命令&#xff0c;如果说本地没有镜像就会直接去远程仓库拉取&#xff1a; docker run -d \ -p 8858:8858 \ --name sentinel-dashboard \ --network demo \ -e AUTH_USERNAMEsentinel \ -e AUTH_PASSWORD123456 \ bladex/sentinel-dashboa…