Spring学习|Bean的作用域、自动装配Bean、注解实现自动装配、Spring注解开发

Bean的作用域

单例模式(Spring默认机制)

原型模式:每次从容器中get的时候,都会产生一个新对象!

Bean的自动装配

自动装配是Spring满足bean依赖一种方式!

Spring会在上下文中自动寻找,并自动给bean装配属性!

在Spring中有三种装配的方式

1.在xml中显示的配置

2.在java中显示配置

3.隐式的自动装配bean

用一个demo理解Bean的自动装配

创建一个cat类,有一个shout方法,会发出miao~

创建一个dog类,有一个shout方法,会发出wang~

创建一个people类,包含的属性有一个cat、一个dog,以及name,并设置相应的get/set方法

在bean.xml中注册cat类和dog类、people类的bean对象,并且在注册people类对象的时候,给其属性赋值,dog,和cat属性用ref来赋值,spring容器会根据id,去找对应的bean对象去注入people属性

编写测试类,获取people的bean对象,调用其属性dog,cat的两个shout方法,发现这两个dog,cat属性已经被注入进去,发出了miao~和wang~

ByName自动装配

在bean.xml中也可用autowire="byName",来简化上面操作,会根据people的属性名来去spring容器中找相同的名字的bean来去注入,结果和上面是一样的

如果我们将dog的bean对象的id名更改为dog222,则在注册people的bean对象时,在spring容器中找不到其属性dog一样的id名的bean,故会报错

ByType自动装配

也可以在注册bean对象时,按照其属性的类型,来去spring容器中找类型一样的bean来注入到属性的值中去,比如我们将dog的bean对象的id改成dog11,在注册people的bean对象时,其属性有一个dog,类型为Dog,那么spring容器会找到上面bean的类型为Dog的名字为dog11的bean对象,注入people的属性dog中,即使名字不一样。

小结

byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!

bytype的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!

注解实现自动装配

jdk1.5支持的注解,Spring2.5就支持注解了!

要使用注解须知:

1.导入约束: context约束

2.配置注解的支持: context:annotation-config/

在bean.xml中导入context约束

在其下面开启注解的支持

在people类的cat、dog两个属性上增加@Autowired注解,相当于上面的在bean.xml中配置的自动导入属性值的配置,这里也是先根据属性的类型去spring容器中找类型相同的bean去自动注入值

将people、cat、dog简单的注册bean,因为实体类上有注解,故在此不用设置过多的属性自动装配的操作

编写测试类,拿到people类的bean对象,依然可以执行其属性cat和dog的shout方法,说明这两个属性在people类的bean对象注册的时候,依然被自动注入了,这就是刚才在people实体类的属性上加的@Autowired注解的作用。

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解[@Autowired] 完成的时候、我们可以使用@Qualifierlvalue="xxx")去配置@Autowired的使用,指定一个唯一的bean对象注入!

可以搭配@Qualifier注解来定义自动注入bean的id名,来在spring容器中找到名字为value定义的那个id名字的bean注入到该属性中。

@Resource注解也是类似的操作,不过和@Autowired注解略有不同

@Resource 和@ Autowired 的区别

都是用来自动装配的,都可以放在属性字段上

@Autowired 通过byType的方式实现,而且必须要求这个对象存在![常用](如果byType不行,也会走byname)

@ Resource 默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况9下,就报错![常用]

执行顺序不同: @ Autowired 通过byType的方式实现。@ Resource 默认通过byname的方式实现。

Spring注解开发

在Spring4之后,要使用注解开发,必须要保证aop的包导入了,在我们之前文章提到的导入springwebmvc那个依赖中就包含aop的包,故不用再多导了

使用注解需要导入context约束,增加注解的支持!

也就是我们上面demo中提到的在bean.xml中先导入约束和支持

多加一个配置,就是这里指定扫描的位置,这个配置的位置下的注解才会生效,范围可大一些,比如com.kuang,因为后面dao层,servcie层.controller层都可能会有注解

用一个demo理解Spring注解开发

@Component注解

创建一个User类,并设置一个属性,然后在该类上添加一个@Component注解,就等价于之前在bean.xml中注册该类为一个bean对象的配置

编写测试类,获取context对象后直接调用getBean方法能够直接获取到这个实体类所对应的bean对象。这里这个bean对象的名字应该默认为实体类的名字开头字母变小写。

@Value注解,给属性赋值,相当于以前在bean.xml中的property配置,给bean对象的属性赋值。

衍生的注解

@Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层!

dao层的[@Repository]

service层的[@Service]

controller层的[@Controller]

这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean

也可在@Component注解下面用@Scope注解来配置该bean的作用域,单例模式或者原型模式

小结

xml与注解:

xml更加万能,适用于任何场合!维护简单方便

注解不是自己类使用不了,维护相对复杂!

xml与注解最佳实践:

xml用来管理bean;

注解只负责完成属性的注入;

相关推荐
要开心吖ZSH1 分钟前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程21 分钟前
深入解析CompletableFuture源码实现
java·性能优化·源码
考虑考虑22 分钟前
Springboot3.4.x中的@Bean使用
spring boot·后端·spring
努力的小雨22 分钟前
AI编程实战:云开发疯狂助攻,React + Vite 做出 FPS 网页游戏不是梦
后端
蓝澈11211 小时前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
Kali_071 小时前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl021 小时前
java web5(黑马)
java·开发语言·前端
时序数据说1 小时前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
君爱学习1 小时前
RocketMQ延迟消息是如何实现的?
后端
guojl2 小时前
深度解读jdk8 HashMap设计与源码
java