这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
精彩干货索引
Hello,你好呀,我是灰小猿,一个超会写bug的程序猿!
《SSM编程日记》系列文章正在持续更新中,欢迎小伙伴们一起关注学习!
之前在文章中和大家讲解了有关Spring开发的基础入门,其中有讲到了在IOC中对bean对象的实例化和从IOC中如何获取相关对象的一系列操作!但是真正在进行开发的时候,**如果类比较多,那么再一个一个的添加并实例化中是不是就太麻烦了呢?想想就头秃...**今天就来教你如何高效的提升java开发效率!!!
优秀的程序员们怎么会没有想到这一点呢?所以针对于更加简洁开发的注解就出现了...今天就继续和大家介绍剩下的部分。
一、组件自动装配
但是这样就结束了嘛?就这么轻松了嘛?之前学习的bean的作用域与生命周期这些都没用了嘛?当然不是!!!更重要的是组件还没获取呢!!!
那么接下来就来和大家讲一下使用注解开发的高端操作,让你知道使用注解是多么的香!!!
我们平常在使用类的时候,难免会在类中调用其他自定义的类对吧,就比如说,Controller组件中往往需要用到Service组件的实例,Service组件中往往需要用到Repository组件的实例。
那么如果我们对这些需要实例化的组件一个一个的在类中进行实例化,是不是就显得太麻烦了呢?哎,聪明机智的程序员们怎么会没有想到这一点呢!所以组件的自动装配就出现了,
在spring中我们可以通过注解的形式来对组件进行自动的装配,那么到底如何对组件进行装配的呢?
其实是这样的,在IOC中指定要扫描的包时,context:component-scan 元素会自动注册一个bean的后置处理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记了@Autowired、@Resource或@Inject注解的属性。
而上面的@Autowired、@Resource或@Inject这三个注解,就是我们在进行组件的自动装配时最常用的注解,
下面我和大家介绍一下这三种注解的具体使用。
1、@autowired注解
@autowired注解能够根据类型实现自动装配。无论是构造器、普通字段(即使是非public)、还是一切具有参数的方法都可以应用@Autowired注解
默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。
(1)@autowired装配原理
接下里我来和大家详细的讲一下@autowired注解的装配原理:
1、使用自动装配时,首先会根据类型去容器中查找相应的组件,这就类似于
getBean("bookService.class"),
2、如果没有找到就抛异常,如果找到一个就赋值
3、如果找到多个,那么也是有一定的装配依据的,并不是随便找一个进行装配。
首先根据属性名作为ID进行继续寻找,找到对应属性名的组件就进行装配,没有找到就报错,报错的原因是:使用变量名作为id进行匹配时候,没有找到对应的属性名
(2)@Qualifier指定装配ID
对于这种报错其实还有一种解决:就是使用@Qualifier("bookService")指定查找ID,找到就装配,找不到报错,指定查找ID的代码示例如下:
// 添加注解表示自动装填
@Autowired
@Qualifier("bookdao")
private BookDao bookDao;
(3)required—装配报错解决
那么要是每次找不到就报错,这样程序不是就崩了吗?对于这样的情况应该怎么办呢?其实还有一种解决办法,解决找不到报错:使用required参数,
@Autowired(required=false) required=false表示如果实在找不到,就装配null
反正装配的依据就是,按照多种规则查找合适的装配对象,直到查找成功,实在不成功就返回null。
(4)特殊属性的自动装配
上面是使用@Autowired注解的基本原理与步骤,我们直到spring的注解开发是十分强大的,下面我们再来说几个特殊的属性的装配。
@Autowired注解可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行自动装配。
@Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。
@Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。
这样一来,@Autowired注解的自动装配是不是就显得十分的强大了,以后妈妈再也不用担心我new对象了!!!
2、@Resource注解
@Resource注解要求提供一个bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为bean的名称。
3、@Inject注解
@Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。
以上就是进行自动装配时使用的三个注解,在这里再总结一下,
@autoWried是spring自带的,更强大一些,能够实现required=false
@Resource也是java自带的,扩展性更强,所以如果切换成另一个容器框架,@Resource还是可以用的,而@Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。其实在日常开发中,我们最常用到的、功能最强大的注解还是@Autowired注解。所以记住这一个基本上就可以了。
然后再总结一下使用注解的好处,主要就是节省了new对象时麻烦,直接使用一个@Autowired注解,spring就可以自动的为该属性赋值,一般来说将组件加入到IOC的注解和@Autowired是结合使用的。
二、注解使用的小细节
其实在使用注解进行开发时还有一些小细节需要注意,我在这里给大家总结一下。
1、整合多个配置文件
当我们开发时的项目过大的时候,在一个配置文件写如配置有时候就不能满足我们的需求,所以Spring允许通过将多个配置文件引入到一个文件中,进行配置文件的集成。这样在启动Spring容器时,仅需要指定这个合并好的配置文件就可以。import元素的resource属性支持Spring的标准的路径资源,
如下示例,我们有springmvc.xml和spring.xml两个配置文件,现在我们想要将spring.xml引入到springmvc.xml中,方法是:在springmvc.xml中写入下面代码:
<import resource="spring.xml"/>
2、路径书写问题
对于spring中常用地址书写,有时候需要使用classpath,而有时候又需要其他,针对不同的路径书写,有不一样的含义和使用:具体看下表:
3、获取组件时的问题
对于使用注解方法添加到容器中的组件,我们在IOC容器中是看不到的,那么获取它的时候应该如何获取呢?
我们上面也说了,**在注解中不指定id的前提下,spring是会自动的为每一个组件设置一个第一个字母小写的组件的全称作为ID,(如Book类的ID默认是book)。**在容器中获取组件的方法和以往一样,但是如果是单实例的话,一般建议以类为参数进行获取。如:
Book book = (Book)ioc.getBean(Book.class);
三、写在最后
以上就是Spring注解开发的全部知识点了,是不是觉得使用注解开发比原生代码简洁多了,注解也是SSM框架乃至之后开发会经常用到的东西,
所以小伙伴们一定要认真学习,有问题可以直接私信我或留言评论。点赞收藏,肝起来!!!
我是灰小猿,我们下期见!