传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事务,这么做有两个缺点:
1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低
2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率
为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。
1.@Controller注解标记在类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类是一个控制器。
2.@RestController和@Controller的区别,其实@RestController的作用相当于@Controller注解和@ResponseBody注解的同时使用,倘若我们使用@RestController注解Controller时,则controller中的方法无法返回jsp页面,配置的视图解析器不起作用。当返回的是对象的时候,需要通过适应的HttpMessageContext转化为指定格式后,写入到Response对象的Body的数据区中进行返回
3.@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。用于方法上,表示方法的响应请求是已该地址作为具体的路径。还可以设置post请求或get请求。
4.@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到 特定的处理方法上。
5.@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.Post)的缩写。该注解将HTTP Post 映射到 特定的处理方法上。
6.@RequestParam注解用于将请求参数映射到controller方法的参数上,顾名思义,是从请求中获取参数。value:参数名字,即入参的请求参数名字。required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
7.@PathVariable注解可以将 URL 中占位符参数绑定到controller方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable("xxx") 绑定到操作方法的入参中。顾名思义,是从路径里面去获取变量,也就是变量是路径的部分。
8.@Value需要参数,这里参数可以是两种形式:@Value("#{configProperties['upload.url']}")或者@Value("${upload.url}")
①@Value("#{configProperties['upload.url']}")这种形式的配置中有“configProperties”,其实它指定的是配置文件的加载对象:配置如下:
classpath:/config/custom.properties
②@Value("${upload.url}")这种形式不需要指定具体加载对象,这时候需要一个关键的对象来完成PreferencesPlaceholderConfigurer,如果使用配置①中的配置,可以写成如下情况:
如果直接指定配置文件的话,可以写成如下情况:
config/custom.properties
9.@Autowired注解顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
一句最简单的配置,告诉spring使用了注解,spring会自动扫描xxx路径下的注解。当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。
如果接口有多个实现类,Spring并不知道应当引用哪个实现类。这种情况通常有两个解决办法:
①、删除其中多余的实现类,Spring会自动去base-package下寻找接口的实现类,发现接口只有一个实现类,便会直接引用这个实现类
②、实现类就是有多个该怎么办?此时可以使用@Qualifier注解:
注意@Qualifier注解括号里面的应当是接口实现类的类名
10.@Resource注解:①、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
②、指定了name或者type则根据指定的类型去匹配bean
③、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
@Autowired和@Resource区别
1、@Autowired默认按照Type方式进行bean匹配,@Resource默认按照Name方式进行bean匹配
2、@Autowired是Spring的注解,@Resource是J2EE的注解,在注解的时候查看这两个注解的包名就明白了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
11.@Service注解通过@Autowired或者@Resource注解,减少bean配置文件的property属性,spring的配置文件里面还有bean.可以使用@Service注解进行简化。简化是把bean也给去掉.使得spring配置文件里面只有一个自动扫描的标签,增强Java代码的内聚性并进一步减少配置文件。
@Service注解,其实做了两件事情:以注解在类A上为例
①、声明类A是一个bean,这点很重要,因为类A是一个bean,其他的类才可以使用@Autowired将类A作为一个成员变量自动注入
②、A在bean中的id是"a",即类名且首字母小写
12.@Scope注解。Spring默认产生的bean是单例的,如果想要使用多例,xml文件里面可以在bean里面配置scope属性。注解也是一 样,配置@Scope即可,默认是"singleton"即单例,"prototype"表示原型即每次都会new一个新的出来。