发布时间:2023-04-30 16:30
目录
一、Spring常用注解
1、@Configuration
2、@Import
3、@ImportResource
4、@Bean
5、@Value
6、@Primary
7、@Autowired
8、@Qualifier
9、@Resource(J2EE里面的注解)
10、@controller
11、@Service
12、@Repository
13、@Mapper(Mybatis的注解)
14、@Component
15、@Scope
16、@Lazy(true)
17、@PostConstruct
18、@PreDestory
19、@DependsOn
20、@Async
二、SpringMVC常用注解
1、@RestController
2、@RequestMapping
handler method 参数绑定常用的注解
3、@PathVariable(处理requet uri 部分)
4、@RequestHeader, @CookieValue(处理request header部分)
5、@RequestParam, @RequestBody(处理request body部分)
6、@ModelAttribute和 @SessionAttributes
6、@ResponseBody
三、SpringBoot常用注解
1、@SpringBootApplication
2、@SpringBootConfiguration
3、@EnableAutoConfiguration
4、@ComponentScan
5、RequestMapping简化注解
6、@Profiles
四、全局异常处理注解
1、@ControllerAdvice
2、@ExceptionHandler(Exception.class)
五、JPA注解
相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。
把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
用来导入其他配置类。
第一种用法:
@Import
({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名第二种用法:
ImportSelector
:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 】第三种用法:
ImportBeanDefinitionRegistrar
:手动注册bean到容器
用来加载xml配置文件。
用@Bean标注方法等价于XML中配置的bean。
@Value的值有两类:
- ① ${ property : default_value }
- ② #{ obj.property? : default_value }
就是说,第一个注入的是外部参数对应的property,第二个则是SpEL表达式对应的内容。
那个 default_value,就是前面的值为空时的默认值。注意二者的不同。
第一种主要是配置文件上的值获。
第二种是对象属性的获取,需要注意的是,如果是获取一个方法的值时,需要在前面增加@,比如#{@obj.getProperty()}
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。
默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用
当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者
@Resource注解与@Autowired注解作用非常相似。
@Resource的装配顺序:
- @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
- 指定了name或者type则根据指定的类型去匹配bean
- 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
@Autowired和@Resource两个注解的区别:
- @Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
- @Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了。 Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
@Controller对应表现层的Bean,使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为\"userAction\"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其
value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=“UserAction”)】或者【@Controller(“UserAction”)】,则使用value作为bean的名字。
@Scope(“prototype”)表示将Action的范围声明为原型,可以利用容器的scope=\"prototype\"来保证每一个请求有一个单独的Action来处理,避免线程安全问题。spring 默认scope 是单例模式(scope=“singleton”),这样只会创建一个Action对象,每次访问都是同
一Action对象,数据不安全,每次次访问都对应不同的Action,scope=“prototype” 可以保证当有请求的时候都创建一个Action对象
@Service对应的是业务层Bean,@Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做\"userService\",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的\"userService\",然
后注入给Action:在Action只需要声明一个名字叫\"userService\"的变量来接收由Spring注入的\"userService\"即可
@Repository对应数据访问层Bean ,
@Repository(value=“userDao”)注解是告诉Spring,让Spring创建一个名字叫\"userDao\"的UserDaoImpl实例。
当Service需要使用Spring创建的名字叫\"userDao\"的UserDaoImpl实例时,就可以使用@Resource(name = “userDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可
使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。
在用idea写一个实现类时引用了mapper类的来调用dao层的处理,使用@Autowired注解时被标红线,找不到bean。
解决办法:在mapper加@mapper或者@repository注解。
这两种注解的区别在于:
1、使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。
2、@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中
(把普通pojo实例化到spring容器中,相当于配置文件中的 )
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
a.singleton单例模式 -- 全局有且仅有一个实例
b.prototype原型模式 -- 每次获取Bean的时候会有一个新的实例
c.request -- request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
d.session -- session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
e.globalsession -- global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义
Spring IoC容器一般都会在启动的时候实例化所有单实例 bean 。如果我们想要 Spring 在启动的时候延迟加载 bean,即在调用某个 bean 的时候再去初始化,那么就可以使用 @Lazy 注解。
value 取值有 true 和 false 两个 默认值为 true,true 表示使用 延迟加载, false 表示不使用。
@Lazy注解注解的作用主要是减少springIOC容器启动的加载时间,当出现循环依赖时,也可以添加@Lazy
用于指定初始化方法(用在方法上)。
@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
用于指定销毁方法(用在方法上)
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
定义Bean初始化及销毁时的顺序
有很多场景需要bean B应该被先于bean A被初始化,从而避免各种负面影响。我们可以在bean A上使用
@DependsOn
注解,告诉容器bean B应该先被初始化。如果我们注释掉
@DependsOn(\"eventListener\")
,我们可能不确定获得相同结果。尝试多次运行main方法,偶尔我们将看到EventListenerBean 没有收到事件。为什么是偶尔呢?因为容器启动过程中,spring按任意顺序加载bean。那么当不使用
@DependsOn
可以让其100%确定吗?可以使用@Lazy
注解放在eventListenerBean ()
上。因为EventListenerBean
在启动阶段不加载,当其他bean需要其时才加载。这次我们仅EventListenerBean
被初始化。现在重新增加
@DependsOn
,也不删除@Lazy
注解,输出结果和第一次一致,虽然我们使用了@Lazy
注解,eventListenerBean
在启动时仍然被加载,因为@DependsOn
表明需要EventListenerBean
。
创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。
@RestController 是Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
当@RequestMapping 标记在Controller 类上的时候,里面使用@RequestMapping 标记的方法的请求地址都是相对于类上的@RequestMapping 而言的;当Controller 类上没有标记@RequestMapping 注解时,方法上的@RequestMapping 都是绝对路径。这
种绝对路径和相对路径所组合成的最终路径都是相对于根路径“/ ”而言的。
方式一:通过常见的类路径和方法路径结合访问controller方法
@Controller
@RequestMapping ( \"/test\" )
public class MyController {
@RequestMapping ( \"/showView\" )
public ModelAndView showView() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName( \"viewName\" );
modelAndView.addObject( \" 需要放到 model 中的属性名称 \" , \" 对应的属性值,它是一个对象 \" );
return modelAndView;
}
}
方式二:使用uri模板
URI 模板就是在URI 中给定一个变量,然后在映射的时候动态的给该变量赋值。如URI 模板http://localhost/app/{variable1}/index.html ,这个模板里面包含一个变量variable1 ,那么当我们请求http://localhost/app/hello/index.html 的时候,该URL 就跟模板相匹配,只是把模板中的variable1 用hello 来取代。这个变量在SpringMVC 中是使用@PathVariable 来标记的。在SpringMVC 中,我们可以使用@PathVariable 来标记一个Controller 的处理方法参数,表示该参数的值将使用URI 模板中对应的变量的值来赋值。
@Controller
@RequestMapping ( \"/test/{variable1}\" )
public class MyController {
@RequestMapping ( \"/showView/{variable2}\" )
public ModelAndView showView( @PathVariable String variable1, @PathVariable ( \"variable2\" ) int variable2) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName( \"viewName\" );
modelAndView.addObject( \" 需要放到 model 中的属性名称 \" , \" 对应的属性值,它是一个对象 \" );
return modelAndView;
}
}
方式三:支持通配符
定义变量之外,@RequestMapping 中还支持通配符“* ”。如下面的代码我就可以使用/myTest/whatever/wildcard.do 访问到Controller 的testWildcard 方法。
@Controller
@RequestMapping ( \"/myTest\" )
public class MyController {
@RequestMapping ( \"*/wildcard\" )
public String testWildcard() {
System. out .println( \"wildcard------------\" );
return \"wildcard\" ;
}
}
1、当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。
@Controller
@RequestMapping(\"/owners/{ownerId}\")
public class RelativePathUriTemplateController {
@RequestMapping(\"/pets/{petId}\")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// implementation omitted
}
}
2、若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable(“name”)指定uri template中的名称。
@Controller
public class TestController {
@RequestMapping(value=\"/user/{userId}/roles/{roleId}\",method = RequestMethod.GET)
public String getLogin(@PathVariable(\"userId\") String userId,
@PathVariable(\"roleId\") String roleId){
System.out.println(\"User Id : \" + userId);
System.out.println(\"Role Id : \" + roleId);
return \"hello\";
}
@RequestMapping(value=\"/product/{productId}\",method = RequestMethod.GET)
public String getProduct(@PathVariable(\"productId\") String productId){
System.out.println(\"Product Id : \" + productId);
return \"hello\";
}
@RequestMapping(value=\"/javabeat/{regexp1:[a-z-]+}\",
method = RequestMethod.GET)
public String getRegExp(@PathVariable(\"regexp1\") String regexp1){
System.out.println(\"URI Part 1 : \" + regexp1);
return \"hello\";
}
}
@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。
@RequestMapping(\"/displayHeaderInfo.do\")
public void displayHeaderInfo(@RequestHeader(\"Accept-Encoding\") String encoding,
@RequestHeader(\"Keep-Alive\") long keepAlive) {
}
@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。
@RequestMapping(\"/displayHeaderInfo.do\")
public void displayHeaderInfo(@CookieValue(\"JSESSIONID\") String cookie) {
}
@RequestParam常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String–> 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以
- 处理get 方式中queryString的值,也可以处理post方式中 body data的值;
- 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;
- 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;
示例代码:
@Controller
@RequestMapping(\"/pets\")
@SessionAttributes(\"pet\")
public class EditPetForm {
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam(\"petId\") int petId, ModelMap model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute(\"pet\", pet);
return \"petForm\";
}
}
@RequestBody该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。
因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap
里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api; 示例代码:
@RequestMapping(value = \"/something\", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
@SessionAttributes该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。
该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象;
示例代码:
@Controller
@RequestMapping(\"/editPet.do\")
@SessionAttributes(\"pet\")
public class EditPetForm {
// ...
}
@ModelAttribute该注解有两个用法,一个是用于方法上,一个是用于参数上;
用于方法上时: 通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;
用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:
- @SessionAttributes 启用的attribute 对象上;
- @ModelAttribute 用于方法上时指定的model对象;
上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。
用到方法上@ModelAttribute的示例代码:
这种方式实际的效果就是在调用@RequestMapping的方法之前,为request对象的model里put(“account”, Account)。
@RequestMapping(value=\"/owners/{ownerId}/pets/{petId}/edit\", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) {
}
用在参数上的@ModelAttribute示例代码:
首先查询 @SessionAttributes有无绑定的Pet对象,若没有则查询@ModelAttribute方法层面上是否绑定了Pet对象,若没有则将URI template中的值按对应的名称绑定到Pet对象的各属性上。
@RequestMapping(value=\"/owners/{ownerId}/pets/{petId}/edit\", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) {
}
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
此注解是个组合注解,包括了@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan注解。
@SpringBootConfiguration 继承至@Configuration,对于熟悉spring的开发者而言,此标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
@EnableAutoConfiguration 这个注解就是springboot能自动进行配置的魔法所在了。主要是通过此注解,能所有符合自动配置条件的bean的定义加载到spring容器中,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就
会自动的帮你配置web项目中所需要的默认配置。具体的使用,会在后期自定义实现一个自动启动类时,会讲解到它的一些机制。此章节就不深入了,只需要它是这个用途即可,一般上也单独使用不要这个注解,但比如需要排除一些无需自动配置的类时,可
利用exclude进行排除。
@ComponentScan 这个熟悉spring的开发者也应该熟悉,会扫描当前包及其子包下被@Component,@Controller,@Service,@Repository等注解标记的类并纳入到spring容器中进行管理。
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,
并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于 spring-boot-starter-web 添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。Starter POMs和Auto-Configuration:设计
auto-configuration的目的是更好的使用\"Starter POMs\",但这两个概念没有直接的联系。你可以自由地挑选starter POMs以外的jar依赖,并且Spring Boot将仍旧尽最大努力去自动配置你的应用。
你可以通过将 @EnableAutoConfiguration 或 @SpringBootApplication 注解添加到一个 @Configuration 类上来选择自动配置。
注:你只需要添加一个 @EnableAutoConfiguration 注解。我们建议你将它添加到主 @Configuration 类上。
如果发现应用了你不想要的特定自动配置类,你可以使用 @EnableAutoConfiguration 注解的排除属性来禁用它们。
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
@ComponentScan会扫描指定路径下的的类,并将其加入到Ioc容器中。在springboot中,@ComponentScan默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。
也可以使用@ComponentScan(basePackageClasses = com.qingtian.web.controller)来制定扫描包路径
- @GetMapping 等同于 @RequestMapping(method = RequestMethod.GET)
- @PostMapping 等同于 @RequestMapping(method = RequestMethod.POST)
- @PutMapping 等同于 @RequestMapping(method = RequestMethod.PUT)
- @DeleteMapping 等同于 @RequestMapping(method = RequestMethod.DELETE)
- @PatchMapping 等同于 @RequestMapping(method = RequestMethod.PATCH)
Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。任何@Component或@Configuration都能被@Profile标记,从而限制加载它的时机。
@Configuration
@Profile(\"production\")
public class ProductionConfiguration {
// ...
}
包含@Component。可以被扫描到。统一处理异常。
用在方法上面表示遇到这个异常就执行以下方法。
1、@Entity: @Table(name=”“)
表明这是一个实体类。一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table可以省略
2、@MappedSuperClass
用在确定是父类的entity上。父类的属性子类可以继承。
3、@NoRepositoryBean
一般用作父类的repository,有这个注解,spring不会去实例化该repository。
4、@Column
如果字段名与列名相同,则可以省略。
5、@Id
表示该属性为主键。
6、@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”):
表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。
7、@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):
name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
8、@Transient:
表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式
9、@JsonIgnore
作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
10、@JoinColumn(name=”loginId”):
一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。
11、@OneToOne、@OneToMany、@ManyToOne:
对应hibernate配置文件中的一对一,一对多,多对一。