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

相关推荐
一只叫煤球的猫3 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9654 小时前
tcp/ip 中的多路复用
后端
bobz9654 小时前
tls ingress 简单记录
后端
皮皮林5515 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友5 小时前
什么是OpenSSL
后端·安全·程序员
bobz9655 小时前
mcp 直接操作浏览器
后端
前端小张同学8 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康9 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在9 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net