Spring学习之-各注解的含义总结
注解配置
@ComponentScan("spittr.web"):/在加载Spring上下文时,会扫描spittr.web包查找组件
- @ComponentScan注解扫描的组件有@Component、@Controller、@Repository注解的类,并为其创建bean。如果@ComponentScan没有带参数,默认会扫描配置类相同的的包以及子包。
- @ComponentScan注解同等于XMLSpring context命名空间的<context:component-scan base-package="spring_chapter_02.writingbean">
- 设置@ComponentScan注解的属性值,可以指定扫描的包:@ComponentScan注解的value属性@ComponentScan(basePackages={"package1","package2",..."packageN"})
- 还可以指定包中所含的类或接口,如果代码重构导致基础包发生变化,这样指定是相对比较安全的@ComponentScan(basePackageClasses={SgtPeppers.class,......,n})。
- @Component:注解在类上,表明该类会作为组建类,并告诉Spring要为这个类创建bean
- 如果@Componet注解没有带参数,创建的bean为类名第一字母小写,如果想指定自己特定的bean ID可以带上参数@Componet(“bean-name”)。
- @RequestMapping({"/","/homepage"}):将方法映射到对”/”和” /homepage”的GET或者POST请求url
- 服务器上运行网址: http://localhost:8080/Spring_shizhan4ban_Chapter05/和http://localhost:8080/Spring_shizhan4ban_Chapter05/homepage/
- @RequestMapping注解可以用在方法或者类级别
- @Controller:注解在类上,声明为一个控制器
- @Configuration:注解在类上,表明这是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。一般搭配@Bean注解一起使用,同等于XML中bean的装配。
@ContextConfiguration:告诉Spring容器需要在指定的配置类中加载配置
- @ContextConfiguration (classes=JavaConfig.class)指定配置类加载配置,该配置类可以使用@ComponentScan(basePackageClasses={SgtPeppers.class})注解扫描组件来创建上下文bean。
- @ContextConfiguration (classes=JavaConfig.class)指定配置类加载配置,该配置类可以使用组件扫描@Configuration注解结合JavaConfig显示配置@Bean注解来创建Java bena。
@ImportResource和@Import注解:这两种可以一起使用来用来创建Spring上下bean
- @ImportResource("classpath:Spring_XMLconfigure/*.xml"):导入xml配置来加载Spring上下文bean
- @Import(CDPlayerConfig.class):导入JavaConfig配置来创建Spring上下文中的bean
- @Bean:该注解使用在方法级别上,这个方法会创建所需类型的实例,@Bean注解会告诉Spring容器,这个方法返回的对象注册为Spring上下文中的bean
- @Bean注解默认情况下,bean的ID与@Bean注解的方法名一致;@Bean(name=“bean-name”)可以指定特定的beanID
- @Autowired:该注解实现制动装配,就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。
- @Autowired注解可以用在构造器上(构造函数的参数为依赖注入的对象),就是构造器自动注入
- @Autowired注解可以用在Setter方法上(Setter函数的参数为依赖注入的对象),属性的setter方法注入
- 不管是构造器、Setter方法还是其他方法,Spring都会尝试满足方法参数上所声明的依赖,假如有且只有一个bean匹配依赖需求的话,那么这个bean将会被装备进来。如果没有匹配的bean,Spring会抛出一个异常,你可以将@Autowired注解的required属性设置为false->@Autowired(required=false)
- 如果有多个bean都满足依赖关系,Spring将会抛出一个异常表明没有明确指定选择哪个bean来装配,这种情况小可以使用@Qualifier注解消除二义性,请关注@Qualifier的用法。
- @Qualifier:
- @Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了,@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。
- @Cacheable、@CacheEvict注解:
- @Cacheable注解可以用在方法或者类级别。当他应用于方法级别的时候,就是如上所说的缓存返回值了;当应用在类级别的时候,这个类的所有方法的返回值都将被缓存。
- @Valid:
- @Valid注解的作用是:在@RequestMapping这个注解所在的方法上使用@Valid注解进行数据的校验,结合@InitBinder注解一起使用。
第一步:在控制层(@Controller)中在@RequestMapping注解的方法中的参数进行@Valid注解(例如:public String singleFileUpload(@Valid FileBucket fileBucket,BindingResult result, ModelMap model) throws IOException)
第二步:写一个MyValidator校验类实现Validator接口中的supports和validate方法(public class myValidator implements Validator{})
第三步:在控制层(@Controller)中对MyValidator myValidator进行@InitBinder(myValidator)进行绑定
创建bean的方式
自动装配方式;组件扫描和自动注入
- 组件扫描创建bean:一般都要用到@ComponentScan注解来扫描需要加载的组件类
- 显示装配方式;Java和XML配置:@bean是Java显示配置来创建bean,和@Configuration注解搭配使用,表明这是一个配置类。
Java配置装配Spring替代web.xml配置文件
- 使用Java将DispatcherServlet装配Sverle容器中,来代替web.xml文件配置。容器会在类路径中查找实现
- 在Servlet3.0环境中,容器会在类路径查找实现了
- javax.servlet.ServletContainerInitializer虚拟接口的类
- 而spring提供了这样一个接口的实现了:SpringServletContainerInitializer->public class SpringServletContainerInitializer implements ServletContainerInitializer。
- SpringServletContainerInitializer类反过来又会查找实现了WebApplicationInitializer的类并将配置任务交给他们来完成
- AbstractContextLoaderInitializer虚拟类实现了WebApplicationInitializer接口->Implements org.springframework.web.WebApplicationInitializer。
- AbstractDispatcherServletInitialize类继承了AbstractContextLoaderInitializer,而AbstractAnnotationConfigDispatcherServletInitializer类继承了AbstractDispatcherServletInitialize类。
- 最终只要实现AbstractAnnotationConfigDispatcherServletInitializer类的方法即可
- 在应用程序中,程序员自己定义一个类继承AbstractAnnotationConfigDispatcherServletInitializer,重新父类的方法来实现DispatcherServlet在容器的加载工作。所以我们只要关注AbstractAnnotationConfigDispatcherServletInitializer类即可
- 总结如下:
MY_DispatcherServletInitializer(自己定义的类,最终的配置由该类来完成,该类的主要工作是重新父类的方法)
--extends->AbstractAnnotationConfigDispatcherServletInitializer
--extends->AbstractDispatcherServletInitialize
--extends->AbstractContextLoaderInitializer
--Implements->WebApplicationInitializer(将配置任务交给该类)
<--Implements--SpringServletContainerInitializer(查找实现了该类的实例)
--Implements-->ServletContainerInitializer(在Servlet3.0环境中,容器会在类路径查找实现了该类的实例)
9.MY_DispatcherServletInitializer(自己定义的类,最终的配置由该类来完成,该类的主要工作是重新父类的方法)
9.1:重写AbstractAnnotationConfigDispatcherServletInitializer方法解析:
第一方法getServletMappings():它会将一个或多个路径映射到DispatcherServlet上
protected String[] getServletMappings() {return new String[] { "/" };}
“/”表示它会是应用的默认Servlet,它会处理进入引用的所有请求。
protected String[] getServletMappings() {return new String[] { "/homepage" };}
“/homepage”表示指定了只有应用下的homepage的请求方法才能进人该应用
第二方法getRootConfigClasses():方法返回的带有@Configuration注解的类将会用来装配ContextLoaderListener创建的应用上下文中的bean
第三方法getServletConfigClasses():方法返回的带有@Configuration注解的类将会用来定义DispatcherServlet应用上下文中的bean。
XML配置转配Spring
中央库pom.xml的配置
//<artifactId>spring-webmvc</artifactId>
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import static org.springframework.web.bind.annotation.RequestMethod.*;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
//<artifactId>spring-test</artifactId>
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
import org.springframework.test.web.servlet.MockMvc;
//<artifactId>mockito-core</artifactId>
import static org.mockito.Mockito.*;
//<artifactId>spring-matchers</artifactId>
import static org.hamcrest.Matchers.*;
//<artifactId>junit</artifactId>
import org.junit.Test;
//<artifactId>commons-lang3</artifactId>
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
//<artifactId>spring-jdbc</artifactId>
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.RowMapper;
Spring学习之-各注解的含义总结的更多相关文章
- Spring学习之事务注解@Transactional
今天学习spring中的事务注解,在学习Spring注解事务之前需要明白一些事务的基本概念: 事务:并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通 ...
- Spring学习之常用注解(转)
使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...
- spring学习笔记二 注解及AOP
本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...
- Spring学习笔记5——注解方式AOP
第一步:注解配置业务类 使用@Component("Pservice")注解ProductService 类 package com.spring.service; import ...
- spring学习 十四 注解AOP 通知传递参数
我们在对切点进行增强时,不建议对切点进行任何修改,因此不加以使用@PointCut注解打在切点上,尽量只在Advice上打注解(Before,After等),如果要在通知中接受切点的参数,可以使用Jo ...
- Spring学习之路-注解
Spring的注解总结. 地址:https://docs.spring.io/spring/docs/4.3.12.RELEASE/spring-framework-reference/htmlsin ...
- Spring学习笔记--使用注解装配
使用@Autowired注解 从Spring2.5开始,最有趣的一种装配Spring Bean的方式是使用注解自动装配Bean的属性.Spring默认禁用注解装配,最简单的启用方式是使用Spring的 ...
- Spring学习--用 ASpectJ 注解实现 AOP
用 AspectJ 注解声明切面: 要在 Spring 中声明 AspectJ 切面 , 只需要在 IOC 容器中将切面声明为 bean 实例.当在 Spring IOC 容器中初始化 AsjectJ ...
- Spring Boot常用的注解以及含义<持续更新>
1.@RestController和@RequestMapping注解 @RestController 和 @RequestMapping 注解是Spring MVC注解(它们不是Spring Boo ...
随机推荐
- Robot Framework_Ride(Run标签)
前言 我一直在想 Robot Framework 不要 RIDE 可不可以.对于编写测试用例来说,只要掌握 RobotFramework 的语法规则,随便在一个你顺手的编辑器下编写也没问题,甚至效率更 ...
- 解决JavaScript拖动时同时触发点击事件的BUG
在做在线地图项目的时候,在给marker点绑定事件时,因为有点击事件click,同时又存在拖动dragEnd事件,首先没有重大缺陷,就是在用户在点击的时候,有时候本想是点击,但是他触发了drag的事件 ...
- 【随笔】 MyEclipse2014的安装和破解
MyEclipse,是在eclipse 基础上加上了自己的插件.MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及 ...
- Java TCP/IP与HTTP协议个人总结(原创)
首先举个例子方便理解: 1.应用层(http.ftp)就类似:淘宝.京东.易购等网购网站,主要用来负责选择购买商品(制定协议). 2.传输层(TCP.UDP)就类似:中通.申通等物流公司,主要负责传送 ...
- c#异步编程async await
可以代替协程了 但是需要.net4 版本 unity2017以上版本可以用了 再也可以不用蛋疼的没有返回值的协程了 //异步编程,和Task一起用 async void TestAsync(){ // ...
- 【LESS系列】一些常用的Mixins
在我们平时的开发中,对于一些使用频率很高的方法函数,我们一般都会将其归纳到一起,整理出一个核心库来. 其实这个思想,借助 LESS 也可以在 CSS 中得以实现. 下面是几个在 W3CPLUS 中偷过 ...
- Wordpress 忘记密码怎么办?
最近一段时间很忙,很久没更新自己博客了,结果忘记了密码? 这里提供两种方法解决. 1. 点击忘记密码,会根据你的邮箱发送一封密码重置邮件,如果没配制邮件或是空间没开启支持,那就有点悲剧了,可以用第二 ...
- Java Collection.Map
/** * Map集合的特点: * 将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. * * Map集合的功能和概述: * 1.添加功能 * V put(K key , V ...
- FileReader实现上传图片前本地预览
平时做图片上传预览时如果没有特殊的要求就直接先把图片传到后台去,成功之后拿到URL再渲染到页面上.或者使用前端插件.这篇博客使用的是HTML5的新特性——FileReader.由于兼容性,这种方法不适 ...
- pyhon-爬虫实战抓取豆瓣top250到mysql
采集地址https://movie.douban.com/top250 一.创建mysql数据库 CREATE TABLE `t_doubantop` ( `id` int(11) unsigned ...