Spring---更简单的存储和读取对象

文章目录

  • 存储Bean对象
    • 配置扫描路径
    • 添加注解存储Bean对象
      • 使用类注解
          • 为什么需要五个类注解呢?
          • Bean命名规则
      • 使用方法注解
          • 重命名Bean
  • 读取Bean对象
    • 属性注入
    • Setter注入
    • 构造方法注入
    • 注入多个相同类型的Bean
    • @Autowired vs @Resource

存储Bean对象

配置扫描路径

在这里插入图片描述

注:

  1. 只有在扫描路径下的所有类,添加了注解才能被正确的识别并保存到 Spring 中
  2. 即使添加了注解,但是该类不在扫描路径下也是不能被保存到 Spring 中的

添加注解存储Bean对象

使用注解把 Bean 对象存储到 Spring 中,有两种注解类型可以选择:类注解 和 方法注解,我们下面分别来介绍:

使用类注解

//一共有五种类注解可以进行对象的注册:@Controller
public class ArticleController {public String sayHello(){return "hello,controller";}
}@Service
public class UserService {public String sayHello(){return "hello,service";}
}@Repository
public class UserRepository {public String sayHello(){return "hello,repository";}
}@Configuration
public class UserConfiguration {public String sayHello(){return "hello,configuration";}
}@org.springframework.stereotype.Component
public class Component {public String sayHello(){return "hello,component";}
}
//先使用上下文的方式来获取对象,下面介绍更简单的获取对象的方式://当使用5大类注解获取bean时,默认 只需要将类名首字母小写即可,  如果bean对象的首字母和第二个字母都是大写时,需要使用原类名才能正确获取到bean对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");ArticleController articleController = context.getBean("articleController",ArticleController.class);System.out.println(articleController.sayHello());UserService userService = context.getBean("userService",UserService.class);System.out.println(userService.sayHello());UserRepository userRepository = context.getBean("userRepository",UserRepository.class);System.out.println(userRepository.sayHello());Component component = context.getBean("component",Component.class);System.out.println(component.sayHello());UserConfiguration userConfiguration = context.getBean("userConfiguration",UserConfiguration.class);System.out.println(userConfiguration.sayHello());
为什么需要五个类注解呢?

在这里使用五个类注解,是为了让程序员看到类注解之后就能直接了解到当前类的用途,不同的类注解的用途是不同的:

  • @Controller:表示业务逻辑层
  • @Service:表示服务层
  • @Repository:表示持久层
  • @Configuration:表示配置层
  • @Component:表示组件

在这里插入图片描述

注:@Component注解是其他四个注解的父类

Bean命名规则

我们配置扫描路径来注册 Bean 对象时并没有设置对象的 id ,那我们通过上下文的方式来获取对象时该使用什么 id 呢?

//我们查看Spring的源码来获取答案:public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;}// 如果第⼀个字⺟和第⼆个字⺟都为⼤写的情况,是把 bean 的⾸字⺟也⼤写存储了if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){return name;}// 否则就将⾸字⺟⼩写char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]);return new String(chars);
}

注:通过源码我们可以知道:

  1. 我们通过上下文获取对象的时候,直接使用类名作为 id 即可
  2. 默认情况下,直接将类名的首字母小写作为 id 使用即可;如果类名的首字母和第二个字母都是大写时,需要使用原类名作为 id 使用。

使用方法注解

@Component
public class StudentBeans {@Beanpublic Student student(){Student student = new Student();student.setId(1);student.setName("张三");student.setAge(18);return student;}
}

注:

  1. 类注解是添加到某个类上的;方法注解是添加到某个方法上的。
  2. 方法注解要搭配五大类注解一起使用
  3. 方法注解是为了解决不能多次注册同一个类的问题
重命名Bean
@Component
public class StudentBeans {@Bean(name = {"s1","s2"})public Student student(){Student student = new Student();student.setId(1);student.setName("张三");student.setAge(18);return student;}
}

注:

  1. 重命名Bean后,使用Spring上下文来获取对象时,必须把重命名后的名字作为 id 来使用
  2. 方法注解重命名Bean后解决了不能多次注册同一个类的问题

读取Bean对象

我们通过 Spring 注入的方式来更加简单的获取 Bean 对象,一共有三种注入方式:

属性注入

    @Autowiredprivate StudentService studentService;

优点:使用简单
缺点:

  1. 不能注入不可变对象(final对象),因为final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,基于字段的注入是使用set形式注入的
  2. 只适用于Ioc容器
  3. 更容易违背单一设计原则:针对类级

Setter注入

    private StudentService studentService;@Autowiredpublic void setStudentService(StudentService studentService){this.studentService = studentService;}

优点:更符合单一设计原则:针对方法级别
缺点:

  1. 不能注入不可变对象(final对象),因为final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,基于字段的注入是使用set形式注入的
  2. 注入对象可被修改

构造方法注入

	private StudentService studentService;//当类中只有一个构造方法时   @Autowired可以省略//如果类中有多个构造方法(重载)时,需要加上@Autowired来明确使用哪个构造方法来注入对象@Autowiredpublic StudentController(StudentService studentService){this.studentService = studentService;}

优点:

  1. 可以注入一个不可变对象(final对象)
  2. 注入的对象可以被修改(可以被final修饰、构造方法只执行一次)
  3. 注入的对象会被完全初始化
  4. 通用性更好

缺点:没有属性注入简单

注入多个相同类型的Bean

注入多个相同类型的 Bean 对象,有两种解决方案:

  • 使用@Resource(name=“ ”)
	@Resource(name="student1")private Student student1;@Resource(name="student2")private Student student2;
  • 使用@Autowired + @Qualifier(value=“ ”)
	@Autowired@Qualifier(value="student1")private Student student1;@Autowired@Qualifier(value="student2")private Student student2;

@Autowired vs @Resource

相同点:都是用来实现依赖注入的
不同点:

  1. 功能支持不同。@Autowired支持属性注入、setter注入、构造方法注入;而@Resource支持属性注入、setter注入却不支持构造方法注入
  2. 出身不同:@Autowired来自于Spring框架;@Resource来自于JDK
  3. 参数支持不同:@Autowired只支持required参数;@Resource支持更多的参数设置
  4. 依赖识别方式不同:@Autowired默认是以 byType 的方式。也可以使用 @Qualifier 指定 Bean的名称转用 byName 的方式;@Resource默认是以 byName 的方式,当 byName方式无法匹配时,会使用 byType方式

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

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

相关文章

【开源】基于JAVA的厦门旅游电子商务预订系统

项目编号: S 030 ,文末获取源码。 \color{red}{项目编号:S030,文末获取源码。} 项目编号:S030,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒…

Collection集合的遍历方式-迭代器,增强for循环,Lambda

集合体系概述 Collection是单列集合的祖宗&#xff0c;它规定的方法&#xff08;功能&#xff09;是全部单列集合都会继承的 public class Work1 {public static void main(String[] args) {//简单认识一下Collection集合的特点ArrayList<String> list new ArrayList&…

数据挖掘实战:基于 Python 的个人信贷违约预测

本次分享我们 Python 觅圈的一个练手实战项目&#xff1a;个人信贷违约预测&#xff0c;此项目对于想要学习信贷风控模型的同学非常有帮助。 技术交流 技术要学会交流、分享&#xff0c;不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。 好的文章离不开粉丝的分享、…

接口自动化测试思路和实战之模块化测试脚本框架

模块化测试脚本框架 需要创建独立的可描述的模块、程序片断以及待测试应用程序的脚本。这些小脚本进行组合&#xff0c;就能组成用来独立运行特定的测试的测试用例脚本。 场景一: 开发把 access_token接口地址由/cgi-bin/token 改为/cgi-bin/get_token或者修改参数等 》开发把…

SpringCloud原理-OpenFeign篇(四、请求原理)

文章目录 前言正文一、书接上回&#xff0c;从代理对象入手二、ReflectiveFeign.FeignInvocationHandler#invoke()三、SynchronousMethodHandler#invoke(...) 的实现原理3.1 invoke(...)源码3.2 executeAndDecode(...) 执行请求并解码 四、如何更换client 的实现 附录附1&#…

module java.base does not “opens java.io“ to unnamed module

环境 如上图所示&#xff0c; Runtime version的版本是JAVA 17 项目所需要JDK版本为JAVA 8 解决

工业交换机一键重启和恢复出厂功能

工业交换机通常具有一键重启和恢复出厂设置的功能&#xff0c;这些功能可以通过设备的管理界面或物理按钮来实现。为用户提供了便捷的操作体验。一键重启功能可以帮助用户快速解决网络故障&#xff0c;节省时间和成本。具体的步骤可能因不同的交换机品牌和型号而有所不同&#…

用HeidiSQL在MySQL中新建用户

用HeidiSQL登录到MySQL数据库&#xff0c;注意登录的时候要使用有权限的用户&#xff1a; 选择工具-》用户管理&#xff1a; 点击左上角的“添加”&#xff1a; 输入用户名、密码&#xff0c;并且分配权限&#xff1a; 点击右边的“添加对象”&#xff1a; 可以根据自己…

桶装水订水送水小程序具备以下主要功能

桶装水订水送水小程序具备以下主要功能&#xff1a; 对比传统的电话订水&#xff0c;订水小程序展现出显著的优势&#xff1a; 1. 便捷性&#xff1a;用户通过小程序就能轻松预订水桶&#xff0c;无需亲自出门&#xff0c;极大提升了生活的便捷度。 2. 即时性&#xff1a;送水…

GAMMA权威指南【数字色彩】

如果你曾经编写过或计划编写任何类型的图像处理代码&#xff0c;你应该完成以下测验。 如果你对一个或多个问题的回答是肯定的&#xff0c;那么你的代码很可能做错了事情并产生不正确的结果。 这对你来说可能不会立即显而易见&#xff0c;因为这些问题可能很微妙&#xff0c;并…

圆通速递查询,圆通速递单号查询,批量复制查询好的物流信息

圆通速递单号物流信息查询&#xff0c;批量复制查询好的物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&#xff0c;然后登录…

机器学习(2)回归

0.前提 上一期&#xff0c;我们简单的介绍了一些有关机器学习的内容。学习机器学习的最终目的是为了服务我未来的毕设选择之一——智能小车&#xff0c;所以其实大家完全可以根据自己的需求来学习这门课&#xff0c;我做完另一辆小车后打算花点时间去进行一次徒步行&#xff0…