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

相关推荐
蓝澈11212 分钟前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
Kali_079 分钟前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl0221 分钟前
java web5(黑马)
java·开发语言·前端
君爱学习27 分钟前
RocketMQ延迟消息是如何实现的?
后端
guojl40 分钟前
深度解读jdk8 HashMap设计与源码
java
Falling4244 分钟前
使用 CNB 构建并部署maven项目
后端
guojl1 小时前
深度解读jdk8 ConcurrentHashMap设计与源码
java
程序员小假1 小时前
我们来讲一讲 ConcurrentHashMap
后端
爱上语文1 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端