类注解之间的关系
@Component 是 @Controller, @Service, @Repository, @Configuration 的父类
利用方法注解进行存储
方法注解需搭配类注解一同使用
(目的是为了提高效率)
新建一个 Student 类
新建一个 StudentBeans 类
为 getStu() 添加方法注解(@Bean)
为 StudentBeans 添加类注解(@Component)
关于Id
- 默认情况下 getBean() 对应的 Id 为方法名
- @Bean 后可以跟 name
- (例如
@Bean(name = {"s1", "s2"})
)
- 当 @Bean 后添加了 name 时, 所对应的 Id 只能为 name 名, 不允许设置为方法名
默认情况下 getBean() 对应的 Id 为方法名
@Bean 后可以跟 name
🔎Spring—获取Bean
从 Spring 中获取 Bean 也称为对象装配, 对象注入
对象装配(对象注入)的方式可以划分为 3 种
- 属性注入
- Set 注入
- 构造方法注入
属性注入
属性注入的效果等同于赋值
举个栗子🌰
@Autowired private StudentService studentService; private int num = 10;
StudentService studentService
利用属性注入, 由 Spring 框架赋值
int num
未利用属性注入, 由程序员赋值
综上, 再次说明了 Spring 是一个包含众多工具方法的 IOC 容器
(IOC → 控制反转)
属性注入的优点🍂
- 实现简单
属性注入的缺点🍂
- 不能注入不可变对象(final 修饰)
- 只适用于 IOC 容器
- 更容易违背单一设计原则
不能注入不可变对象(final 修饰)
final 修饰的对象有 2 种赋值方式
- 直接赋值
- 在构造方法中赋值
只适用于 IOC 容器
@Autowired 来自于 Spring
Spring 是一个包含众多工具方法的 IOC 容器
因此只适用于 IOC 容器
更容易违背单一设计原则
属性注入的方式实现简单
因此也更容易将其他无关的对象一并注入
也就更容易违背单一设计原则
Set注入
Set 注入的优点🍂
- 更符合单一设计原则
Set 注入的缺点🍂
- 不能注入不可变对象(final 修饰)
- 注入的对象可被修改
更符合单一设计原则
Set 注入的实现方式相比于属性注入较复杂
因此相较于属性注入也就避免了将其他无关的对象一并注入的情况
(更符合单一设计原则)
不能注入不可变对象(final 修饰)
final 修饰的对象有 2 种赋值方式
- 直接赋值
- 在构造方法中赋值
注入的对象可被修改
Set 注入相较于属性注入更危险!
属性注入的对象也可被修改
但 Set 注入除通过属性注入的方式修改注入的对象
也可通过 set() 方法修改注入的对象
set() 方法既可以被 Spring 调用
也可以被其他对象调用
构造方法注入
注意
- 当只存在一个构造方法时, @Autowired 可省略
- 当存在多个构造方法时, @Autowired 不可省略
构造方法注入的优点🍂
- 能注入不可变对象(final 修饰)
- 注入的对象不可被修改
- final 修饰
- 构造方法随着类的加载只执行一次
- 注入的对象会被完全初始化(类加载时就会将对象进行初始化, 当执行其他方法时, 对象已被初始化 → 构造方法的机制)
- 通用性更好(任何一个类都会有构造方法)
构造方法注入的缺点🍂
- 实现方式不如属性注入简单
总结(Spring的注入方式? 它们之间的区别?)
@Resource
- @Resource
- 可以实现属性注入
- 可以实现 Set 注入
- 不可以实现构造方法注入
使用 @Resource 实现属性注入
使用 @Resource 实现 Set 注入
使用 @Resource 不能实现构造方法注入
对比@Resource与@Autowired
来源不同🍭
@Resource
@Autowired
支持参数不同🍭
@Resource
@Autowired
Tips
存在返回同一个类型的多个方法时
利用@Resource(name = "")
可以将其进行区分
@Autowired 无法设置 name
只能填写对应的对象
如果想写成 student 形式
需搭配@Qualifier()
进行使用, 括号中填写的内容为对应的对象
🔎结尾
创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油