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注解定义名称

相关推荐
互联网全栈架构1 小时前
遨游Spring AI:第一盘菜Hello World
java·人工智能·后端·spring
优秀的颜2 小时前
计算机基础知识(第五篇)
java·开发语言·分布式
BillKu2 小时前
Java严格模式withResolverStyle解析日期错误及解决方案
java
网安INF2 小时前
ElGamal加密算法:离散对数难题的安全基石
java·网络安全·密码学
AWS官方合作商3 小时前
在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署
java·云原生·aws
gadiaola4 小时前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
coderSong25686 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy7 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?8 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
年老体衰按不动键盘8 小时前
快速部署和启动Vue3项目
java·javascript·vue