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

相关推荐
是梦终空9 分钟前
计算机毕业设计241—基于Java+Springboot+vue的爱心公益服务系统(源代码+数据库+11000字文档)
java·spring boot·vue·毕业设计·课程设计·毕业论文·爱心公益系统
_殊途11 分钟前
项目开发手册-项目结构
java
keke_俩个科11 分钟前
ShardingSphere分库分表基础配置与使用说明
java·数据库·分布式·spring
爬虫程序猿13 分钟前
把“天猫”装进 JVM:Java 关键词商品爬虫从 0 到 1(含完整可运行代码)
java·jvm·爬虫
java_logo16 分钟前
Docker 部署微服务项目保姆级教程
java·运维·docker·微服务·容器·eureka·架构
lecepin30 分钟前
AI Coding 资讯 2025-10-22
前端·javascript·后端
oak隔壁找我30 分钟前
Servlet 三大组件详解
java·后端
南部余额36 分钟前
Spring MVC 拦截器interceptor
java·spring·mvc
oak隔壁找我44 分钟前
SpringBoot 实现 JWT 认证完整方案
java·后端
王中阳Go1 小时前
挑战一周用 AI 开发商业化项目!4 大痛点反思 + 新手专属提示词分享
后端·aigc·openai