当前位置: 首页 > 后端技术 > Java

关于Spring注解开发教程,为你打包

时间:2023-04-01 22:08:43 Java

摘要:Spring是我们web开发中不可或缺的一个框架。基于传统的xml方式配置bean总是太麻烦。自从spring2.5之后出现了注解,可以大大简化我们的配置。本文分享自华为云社区《如何高效提升Java开发效率—Spring注解开发全套教程!》,作者:灰小猿。1.使用注解来标识组件为了不在IOC中对类对象一一声明,首先Spring根据各个类的不同功能,首先规定了基于组件的注解,大致可以分为以下四种类型:①普通组件:@Component标识一个由SpringIOC容器管理的组件。我们也可以理解为除了数据库层、业务逻辑层、控制层组件之外的其他组件使用的注解。②持久层组件:@Respository标识一个由SpringIOC容器管理的持久层组件,一般用于标记数据库层③业务逻辑层组件:@Service标识一个由SpringIOC容器管理的业务逻辑层组件,④表现层控制器组件:@Controller标识一个由SpringIOC容器管理的表现层控制器组件。同时,也可以在这些注解后面加上一些参数。比如比较常用的是在注解的括号中加上value属性,表示组件在容器中的ID。如果未设置该值,则默认ID是类名。全名(首字母小写)。在下面的例子中,我们给一个Dao层组件添加@Respository注解/***数据库层注解**/@RepositorypublicclassBookDao{publicvoidsaveBook(){System.out.println("bookDao中的书籍已经保存..”);}}通过这四个注解,我们可以先对所有组件进行一一分类。为什么我们要用注解来分类?说到底就是方便快捷的知道哪个类做了什么类型的功能,同时也方便通过这四个注解给IOC容器添加组件。所以你也可以把这四个注解理解为Spring分发给不同功能组件的一张“身份证”。只有有了这四张“身份证”,那么这个组件才能加入到IOC容器中。这里有一点要注意:其实Spring是没有能力去识别一个组件是否是它所标记的类型的。即使@Respository注解用在表现层控制器组件上,也不会产生任何错误,所以@Respository、@Service和@Controller这些注解只是为了让开发者明确当前组件所扮演的角色。向容器中添加组件很方便。二、组件扫描1、普通扫描现在对所有的组件进行了详细的分类,但是这是否意味着所有的组件都已经添加到IOC容器中了呢?如果真是这样,那我们就真正实现了低代码时代了……那么现在我们应该如何在IOC容器中添加带有注解标识的组件呢?这里Spring在IOC中提供了包扫描功能。从这个名字我们可以知道,Spring可以自动扫描整个项目中标有这四个注解的组件,并添加到IOC容器中。包扫描的具体操作如下:包扫描依赖于Context命名空间,所以需要在IOC中加入这个命名空间。添加命名空间有两种方法。一种是在IOC的头文件中加入如下代码:xmlns:context="http://www.springframework.org/schema/context"但是不推荐,因为比较难记。另一种方式是直接在界面下方点击Namespaces,在里面找到并勾选Context,容器中包扫描的代码为:其中base-package属性指定了一个需要扫描的基类包,Spring容器会扫描这个基类包及其子包中的所有类。当需要扫描多个包时,可以用逗号分隔。比如上面的代码就是扫描com.spring包下的所有类。2.包含和排除特定组件但是这种方式扫描的范围有时候太大了,那么能不能缩小包扫描的范围呢?当然有可能。如果只想扫描特定类而不是base包下的所有类,可以使用resource-pattern属性过滤特定类,如:(1)扫描包含特定的组件如果我们只想扫描包含特定特征的组件,那么我们可以这样做:子节点表示需要包含的目标类不过需要注意的是,由于context:component-scan默认会添加所有的类,在此基础上添加是没有用的。需要给context:component-scan过滤器添加属性参数use-default-,use-default-filters="true"表示默认添加所有类,false表示不添加所有类。下面的代码表示只扫描包含include-filter中指定的特征的组件,whichtype用于表示使用哪种类型的扫描表达式,expression后面是表达式。(2)扫描排除特定组件即使扫描包含特定组件,也有扫描排除特定组件,子节点表示目标类被排除在外。以下代码表示扫描除以下特征之外的其他组件。而组件-scan可以有多个include-filter和exclude-filter子节点,表示可以包含特征的多个组件或者可以排除特征的组件。上面提到的类型填写的过滤表达式的类型和作用如下:上面两种是最常用的,下面三种几乎没有用到:type="aspectj"aspectjexpressiontype="custom"定义一个TypeFile并且自己写一个类定义应该使用哪个type="regex"使用正则表达式注意bug:有的朋友在开发注解的时候写注解扫描完美,但是就是不行,原因可能是缺少对应特定功能的jar包,这里需要额外导入一个aop包spring-aop-4.0.0.RELEASE.jar到这里,组件添加到容器的操作就完成了,我们添加组件成功后,我们可以在组件图标的右上角看到一个小S图标。这个时候就代表组件已经成功添加到容器中了。3.实现注解的三步总结实现注解的三步:添加上下文依赖上下文:component-scan在类中添加相应的注解导入aop包spring-aop-4.0.0.RELEASE.jar3.组件自动组装但这是结束了吗?有那么容易吗?之前学的bean的作用域和生命周期是不是没用了?当然不是!!!更重要的是,材料还没拿到!!!那我就给大家说说使用注解开发的高端操作,让你知道使用注解是多么的美味!!!我们平时在使用类的时候,难免会调用类中的其他自定义类,对吧?比如Controller组件经常需要使用Service组件的实例,Service组件经常需要使用Repository组件的实例。那么如果我们在类中将这些需要实例化的组件一一实例化,岂不是太麻烦了?哎,聪明机智的程序员怎么可能没有想到这一点!于是出现了组件的自动装配。在spring中我们可以通过注解的形式自动组装组件,那么如何组装组件呢?事实上,情况就是这样。在IOC中指定要扫描的包时,元素会自动注册一个bean后处理器:AutowiredAnnotationBeanPostProcessor的一个实例。此后处理器可以自动装配使用@Autowired、@Resource或@Inject注释的属性。以上@Autowired、@Resource或@Inject这三个注解是我们自动组装组件时最常用的注解。下面分别介绍一下这三个注解的具体使用。1、@autowired注解@autowired注解可以实现按类型自动组装。无论是构造函数、普通字段(即使是非公共的),或者任何带参数的方法,都可以应用@Autowired注解。默认情况下,需要设置所有带有@Autowired注释的属性。当Spring找不到匹配的bean连接属性时抛出异常。(一)@autowired的组装原理下面给大家详细说一下@autowired注解的组装原理:1.使用自动组装时,会先根据类型在容器中查找对应的组件,类似于getBean("bookService.class"),2.找不到就抛异常,找到就赋值。3、如果找到一个以上,拼装是有一定依据的,不是随便找一个拼装的。首先按照属性名作为ID继续查找,找到对应的属性名就组装组件,找不到就报错。报错原因是:使用变量名作为id进行匹配时,没有找到对应的属性名(2)@Qualifier通过指定程序集ID,其实还有一种解决方法:使用@Qualifier("bookService")来指定搜索ID,找到就组装,找不到就报错。指定搜索ID的代码示例如下://添加注解表示自动填充@Autowired@Qualifier("bookdao")privateBookDaobookDao;(3)required——汇编错误解决方法如果每次都找不到,就会报错,这样程序会崩溃?遇到这种情况我们该怎么办?其实还有一个办法解决找不到报错的问题:使用required参数,@Autowired(required=false)required=false的意思是如果找不到,那就汇编null。不管怎么说,组装的基础就是根据各种规则,找到合适的对象进行组装,直到搜索成功,不成功则返回null。(4)特殊属性的自动组装以上就是使用@Autowired注解的基本原理和步骤。直到spring的注解开发非常强大。下面说说几个特殊属性的组装。@Autowired注解可以应用于数组类型的属性,Spring会自动组装所有匹配的bean。@Autowired注解也可以应用于集合属性,此时Spring读取集合的类型信息,然后自动装配所有兼容的bean。在java.util.Map上使用@Autowired注解时,如果Map的key值为String,那么Spring会自动组装一个兼容value类型的bean作为value,并使用bean的id值作为关键。这样@Autowired注解的自动组装就很强大了,妈妈再也不用担心我的新对象了!!!2.@Resource注释@Resource注释需要一个bean名称属性。如果该属性为空,注解处的变量名或方法名将自动用作bean名。3.@Inject注解@Inject和@Autowired注解也是按类型注入匹配的bean,但是没有reqired属性。以上就是自动装配中用到的三个注解。在这里总结一下。@autoWried自带spring,功能更强大。可以实现required=false。@Resource也是用java构建的,扩展性更强,所以如果切换到其他容器框架,@Resource仍然可以使用,而@Inject和@Autowired注解一样,也是按类型注入匹配的bean,只是没有reqired属性。其实在日常开发中,最常用也是最强大的注解就是@Autowired注解了。所以记住这个基本上没问题。然后总结一下使用注解的好处。主要是为了省去新建对象的麻烦。直接使用@Autowired注解,spring可以自动为属性赋值。一般来说,添加组件到IOC注解和@Autowired是组合使用。四、注解使用的小细节其实在使用注解进行开发的时候还是有一些小细节需要注意的。我将在这里为您总结。1.整合多个配置文件当我们开发的项目比较大的时候,在一个配置文件中写这样的配置有时候不能满足我们的需求,所以Spring允许通过将多个配置文件引入到一个文件中,在配置文件整合中.这样,在启动Spring容器时,只需要指定合并后的配置文件即可。import元素的resource属性支持Spring的标准路径资源。在下面的例子中,我们有两个配置文件,springmvc.xml和spring.xml。现在我们要将spring.xml引入到springmvc.xml中。方法是:在springmvc.xml中写入如下代码:2.路径写入问题对于spring中常见的地址写入,有时需要使用classpath,有时需要其他,writefordifferentpaths,有不同的含义和用途:详见下表:3.获取组件时出现的问题对于使用注解方式添加到容器中的组件,我们在IOC容器中是看不到的,那么如何获取呢什么时候获得呢绒布?上面我们也说过,在注解中没有指定id的前提下,spring会自动将组件的全名首字母小写作为每个组件的ID(比如Book类的ID是默认预订)。获取容器中组件的方法和之前一样,但是如果是单实例,一般建议使用类作为参数来获取。如:Bookbook=(Book)ioc.getBean(Book.class);5.写在最后,以上就是Spring注解开发的所有知识点。是不是觉得使用注解开发比原生代码简单很多,而且注解也是SSM框架,甚至是以后开发中会经常用到的东西,点击关注,第一时间了解华为云的新鲜技术~