Spring五大类注解 || Bean的更简单存储

本文介绍了Spring框架中的五大类注解,包括@Controller、@Service、@Repository、@Component和@Configuration的用途。详细讲解了JavaEE标准和阿里的分层架构,以及BeanName的命名规则。讨论了@Bean方法注解在创建bean时的作用,和@Autowired、@Resource等注入方式的优缺点,强调了构造方法注入的安全性和重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言:

五大类注解

@Controller

@Service

@Repository

@Component

@Configuration

JavaEE标准分层

阿里分层结构

BeanName命名规则

方法注解

@Bean

注入方式取Bean

属性注入

Setter注入

构造方法注入

@Resource


前言:

    使用Spring容器,为我们程序开发带来了很大的遍历。那么我们就需要学习Spring带来的一些机制,灵活的使用和理解这些机制,相信会有很多收获。

五大类注解

@Controller

    控制器,验证用户请求数据的正确性(安保系统)。直接和前端打交到,验证前端发来请求是否正确。

@Service

    服务,编排和调度具体执行方法的(客服中心)。不会直接操作数据库,根据请求判断具体调用哪个方法。

@Repository

    数据持久层,直接和数据库交互(执行者)(DAO层 data access object)

@Component

    组件(工具类)。为整个项目存放一些需要使用的组件,放在其他位置不是很合适。

@Configuration

    配置项(项目中的一些配置)。当项目启动时,如果遇到哪个类被这个注解修饰,那么就会加载其中的一些配置。

注意:

    1)上述五大类注解,xml配置的路径中只要能查找到(递归查询),其所修饰的类都会作为bean存储到spring中(类名需不同)。当然如果没有上述五大类注解那么当前类是不能作为bean存储到spring中的。

    2)五大类注解存在不同含义,当我们看到某一个注解就可以明确这个了类是做什么的。

    3)除了Component以外的其他四大类注解,都有Component注解的功能,也就是它的扩展。(看源码可发现其他四大类注解上面都有@Component注解)。

JavaEE标准分层

阿里分层结构

注意:阿里分层结构是对JavaEE标准分层在服务层(Service)做了一个扩展。

BeanName命名规则

注意:

    逐级向下看源码,发现Spring中使用的jdk中的方法来作为BeanName的命名规则。

    1)默认是第一个字母小写。

    2)如果前两个字母的大写,即BeanName就是原类名。

方法注解

@Bean

注意:

    1)可以将方法的返回值添加到spring中。

    2)方法注解必须搭配类注解使用,spring不会扫描所有类的方法,只扫描类注解下的方法(提升效率)

    3)@Bean的命名规则,默认是方法名,也可以起多个名字(name属性),这个时候默认的名字就无效了

    4)控制注入顺序(@Order注解)值越大,注入越迟,是类注解。如果对象一样,名字也一样(覆盖式注入)

注入方式取Bean

@Autowired

属性注入

    属性注入(spring会自动的将spring对象注入到@Autowired修饰的属性这里)

    根据类型和名字(spring中的对象Id),来确定唯一的一个对象,

优点:

    使用非常简单,只需要在属性上加@Autowired注解即可。

缺点:

    1)无法实现final修饰的变量注入

    2)兼容不好,只适用于IoC容器

    3)风险:因为写法简单,所以违背单一设计原则概率更大(可以注入多个对象,使用多个属性)

Setter注入

    Setter注入(使用set方法,spring会将对象传入到set方法中)(根据类名和对象名来确定)

优点:

    符合单一设计原则(每个方法只能传递一个对象)

缺点:

    1)不能注入不可变对象(final修饰)

    2)使用Setter注入的对象可能会被修改(可以调用set方法进行修改参数)

构造方法注入

    构造方法注入(官方推荐的做法),使用构造方法。

    如果只有一个构造方法,可以省略@Autowired,有多个构造方法就不能省略了。

优点:

    1)可以注入不可变对象(final修饰的)。

    2)注入的对象不会改变,构造方法只执行一次。

    3)构造方法可以保证对象完全被初始化(类加载时就会执行)。

    4)通用性更好。

提出问题:

    为什么构造方法可以注入不可变的对象而Setter和属性注入却不可以呢?

    答:final修饰的对象需要直接赋值或者在构造方法里进行初始化。类加载过程中就会执行构造方法,那么就可以初始化final修饰的对象。而Setter注入和属性注入是spring实现的,执行时机在类加载之后,所以就不能修改final修饰的对象。

@Resource

    使用JDK 提供的的@Resource注解也可以实现对象的注入。

注意:

    1)出身不同:@Autowired 来自于 Spring,而@Resource 来自于 JDK 的注解

    2)使用时设置的参数不同:相比于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name 设置,根据名称获取 Bean。

    3)@Autowired 可用于 Setter 注入、构造函数注⼊和属性注入,而@Resource 只能用于 Setter 注入和属性注入,不能用于构造函数注入

    4)@Autowired先根据类型查找,之后再根据名称查找。

    5)@Resource先根据名称查找,再根据类型查找。

小结:

    使用五大类注解和Bean的更简单存储可以快速提升我们开发的效率,学习框架我们要理解框架的本质作用。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小太空人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值