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

Spring中,提供了注解来更简单的存储和读取对象。

一、存储Bean对象

1、配置扫描路径

java 复制代码
<?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:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--    <bean id="user" class="User"></bean>-->
    <content:component-scan base-package="com.demo.component"></content:component-scan>
</beans>

base-package中存放的是spring中的Bean的根路径

2、添加注解存储Bean对象

2.1方式一:五大类注解

通过五大类注解,可以了解当前类的用途。

2.1.1 @Controller 控制器存储

Controller归属于业务逻辑层,用来控制用户的行为,它用来检测用户参数的有效性。比如说我要写一个用户注册的功能,控制器的作用就是检查你有没有输入用户名,密码,密码是否有效。

(是前端的请求合理性负责)

获取Bean对象时,可以发现我们并不能给注解添加Id,这是因为Spring有命名规则:

⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean。 如果⾸字⺟和第⼆个 字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。

2.1.2 @Service : 服务存储

Service归属于服务层,调用持久化类实现响应的功能。接着上面的例子,程序拿到你输入的账号和密码后,并不直接调用数据库,而是调用一些持久层方法:添加用户表中的账号和密码。

(不能直接和数据库叫交互,类似于控制中心,是对前端请求功能负责)

2.1.3 @Repository : 仓库存储

Repository归属于持久层,是直接和数据库进行交互的,通常每一个表都会对应一个@Repository,对应上面的例子就是负责写添加用户表中的账号和密码的方法的。

(对数据库的某一个表负责,一个仓库会对应一张表的增删查改操作)

2.1.4 @Component : 组件存储

Component归属于公共工具类,提供一些公共方法

(是其他4个类的父类)

2.1.5 @Configuration : 配置存储

Configuration归属于配置层,是用来配置当前项目信息

(是项目的全局配置)

2.2 方式二:方法注解

@Bean方法注解: 将当前修饰方法的方法对象存储到Spring中

注意:@Bean注解一定要配合五大类注解一块使用,否则是无效的方法注解。

@Bean默认情况下,Bean name = 方法名

@Bean是可以添加name的,这和五大类注解的情况不一样。因为类几乎不能重名,但方法名重名的概率还是很大的。

当然,给@Bean设置了name属性后,使用原来的方法名就不能获取对象了。

二、获取Bean对象

获取 Bean 对象也叫做对象装配,是把对象取出来放到某个类中,也叫作对象注入

1、属性注入

使用@Autowired实现属性注入

优点:实现简单

缺点:

1、不能注入final对象

2、只适用于IoC容器

3、更容易违背单一设计原则 (针对对象是类)

2、Setter注入

优点:符合单一设计原则。因为一个set就针对一个对象

缺点:

1、不能注入final对象

2、注入对象可被修改

(set方法是普通set方法,可以被重复调用,在被调用时就存在修改的风险。这与属性注入不一样,属性注入的修改可以看成是覆盖,set注入与之相比更加危险)

3、构造方法注入

ps:当一个类中只有一个构造方法,可以省略@Autowired

优点:

1、可以注入一个不可变的对象

2、注入的对象不会被修改

1)加入了final修饰符

2)构造方法是随着类加载只执行一次(不能像set有可能执行多次被修改的分享)

3、注入的对象会被完全初始化

4、通用性更好

缺点:

没有属性注入实现简单

除了@Autowired外,Java还提供了@Resource进行注入

那么他俩有什么区别呢?

1)功能支持不同:Autowired可用于Setter注入 ,构造函数注入和属性注入。而Resource只能用于Setter注入和属性注入,不能用于构造方法注入。

2)出生不同:Autowired来自Spring,而Resource来自于JDK

3)参数支持不同:Resource支持更多的参数设置,而Autowired只支持required参数。

将一个类型的对象注入多次的问题的解决办法

两种解决办法:

1、使用@Resource(name = " ")定义

2、使用@Qualifier注解定义名称

相关推荐
IGAn CTOU31 分钟前
王炸级更新!Spring Boot 3.4 正式发布,新特性真香!
java·spring boot·后端
C雨后彩虹37 分钟前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
柯西劝我别收敛38 分钟前
Koordinator-Scheduler 调度器源码解析
后端·云原生
tycooncool1 小时前
Spring中的IOC详解
java·后端·spring
014-code1 小时前
日志规范:怎么写才不算写废话
java·开发语言·设计模式·日志
303781 小时前
消息推送削峰落地方案
后端
爱敲代码的小黄1 小时前
我重新梳理了一遍 RAG,终于明白它不只是接个向量库
后端·面试·agent
CQU_JIAKE1 小时前
4.17[Q]
java·linux·服务器
亦暖筑序2 小时前
Spring AI Alibaba 报错合集:我踩过的那些坑
java·后端
石榴树下的七彩鱼2 小时前
OCR 识别不准确怎么办?模糊 / 倾斜 / 反光图片优化实战(附完整解决方案 + 代码示例)
图像处理·人工智能·后端·ocr·api·文字识别·图片识别