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;

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

相关推荐
Asthenia04123 分钟前
理解词法分析与LEX:编译器的守门人
后端
uhakadotcom4 分钟前
视频直播与视频点播:基础知识与应用场景
后端·面试·架构
Asthenia04121 小时前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz9651 小时前
ovs patch port 对比 veth pair
后端
Asthenia04122 小时前
Java受检异常与非受检异常分析
后端
uhakadotcom2 小时前
快速开始使用 n8n
后端·面试·github
JavaGuide2 小时前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
bobz9652 小时前
qemu 网络使用基础
后端
Asthenia04122 小时前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia04123 小时前
Spring 启动流程:比喻表达
后端