1.@Autowired 自动装配注释
作用:实现自动装配,使用范围:用在成员变量、方法以及构造函数上。
用在类属性上,可以免写setter方法
@Resource和@Autowired的区别:
@Resource:
@Resource(name=”pd”)
private PersonDao p;
这时候spring注入p的过程是
1:先查找xml中是否有id为p的元素
2:如果没有找到,则看是否有name属性(@Resourcename=“”),有则查找name
3:否则查找PersonDao类型的元素
@Autowired:
@Autowired
private PersonDao p;
他会去xml文件里查找类型为PersonDao的元素
2.@Component 用于标识该类为bean
对于Spring,在XML文件中启动Spring的自动扫描功能后,目录下的带有此注解的类都会自动创建bean,这样就不再需要在 XML 中显式使用 <bean/>
进行Bean 的配置。
对于Springboot,由于不用配置XML,所以此注解成为了标注bean的重要手段。
除了@Component
以外,还有几个注解,都可以用来标识bean,并且这些注解都有特别的含义,当组件不好归类的时候,我们可以使用@Component
进行标注。
3. @Controller和@RestController的区别?
@RestController注解相当于@ResponseBody+ @Controller合在一起的作用。
1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return里的内容。
例如:本来应该到success.jsp页面的,则其显示success.
2)如果需要返回到指定页面,则需要用@Controller配合视图解析器InternalResourceViewResolver才行。
3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
说明:
@Controller,方法返回String,实际上是返回stringcontent.jsp,并且把model中的内容赋值到jsp中。如果在项目中,找不到该jsp,就会报错。
@RestController,方法返回String,就真的是返回String,这个String一般是json内容,前端获取到这些内容后,解析到当前页面上(前端打开一个页面,使用ajax异步加载),从而实现前后端的完全分离。
4.@Transactional 事务注解
此注解需要注意的地方:
5.@RequestMapping 用于映射url
1.RequestMapping(value=”/view”,method=RequestMethod.GET,params=”add”):
主要用于方法注解,用于定义该方法接收哪个路径以及类型,必须包含什么参数
Value可以写集合,例如@RequestMapping(value={”/view”,“/hello”})
6.@GetMapping和@PostMapping
1、@GetMapping(value =“/say”)
等价于@RequestMapping(value=”/say”,method= RequestMethod.GET)
2、 @PostMapping(value= “/say”)
等价于@RequestMapping(value=”/say”,method= RequestMethod.POST)
7.@ModuleAttribute
用于方法的参数中,标识该参数(entity)是用来承接request的同名参数。
8.@SpringBootApplication
Springboot专有注解,用于标注该类为项目的启动类,入口类。
9.@Aspect 表示该类是AOP类
要想把一个类变成切面类,需要两步,
①在类上使用 @Component 注解把切面类加入到IOC容器中
②在类上使用 @Aspect 注解使之成为切面类
10.@Pointcut
用于方法层面的注解,方法返回类型必须为void,用于标注切入点。下面提到的注解,其value值=@Pointcut指定的方法,即可将切面方法与切入点关联。
execution
匹配方法执行的连接点
within
限定匹配特定类型的连接点
this
匹配特定链接点的bean引用是指定类型的实例的限制
target
限定匹配特点链接点的目标对象参数是指定类型的实例
args
限定匹配特点链接点的参数是给定类型的实例。
下面的方法都有一个参数,value = “methodName()”,methodName方法必须有@Pointcut注解。从而实现关联。
11.@Before 前置增强
表示该切面是在方法执行前处理
12.@After 最终增强
表示该切面是在方法执行后处理
13.@AfterReturning 后置增强
返回之后处理,可以用来记录返回内容
14. @Configuration 用于定义配置类
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
15.@Bean
@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名。Bean有很多属性,例如name,id,class,initMethod,destoryMethod等。
16.@Scope 定义@Bean的作用域
用于定义@Bean的作用域。默认是singleton。写法:@Scope("prototype")
singleton
:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。
prototype
:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
request
:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效。
session
:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效。
globalsession
:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效。
17.@Param
在dao层中使用,作用是为了传递多个参数,解决的是可读性和直观性
List<BldDto> selectBy(@Param("cinemaId") Integer cinemaId,
@Param("bldDate") LocalDate bldDate,
@Param("organizationId") Integer organizationId,
@Param("tenantId") Integer tenantId);
18.@RequestParam
在Controller层中使用,作用是为获取前端参数,解决的是前后端参数不一致的问题
@GetMapping("/getRateList")
public Result getFilmRateList(@RequestParam(name = "organizationId",required = false) Integer organizationId,
@RequestParam(name = "cinemaId",required = false) Integer cinemaId,
@RequestParam(name = "planId",required = true) String planId) {
return Result.success(bldService.getRateList(organizationId,cinemaId,planId));
}
19.@RequestHeader
在Controller层中使用,作用是获取请求信息的header部分绑定到方法的参数上
@RequestHeader("suId") Integer organizationId
20.@DateTimeFormat
获取一个符合自定义格式的时间格式存储到数据库,前后到后台的时间格式的转换
@DateTimeFormat(pattern = Constant.DEFFAULT_DATE_FORMAT) LocalDate bIbDate
21.@Validated
在Controller层中使用,用来对数据进行校验
@PostMapping("/cinemaTime/save")
public Result saveCinemaTime(@RequestBody @Validated OpenTimeInputDto cinemaOpenTimeDto) {
bldBuilderService.saveCinemaOpenTime(cinemaOpenTimeDto);
return Result.success();
}
然后在实体类中进行详细的校验:
public class User {
//在分组addUser时,验证id不能为空,其他情况下不做验证
@NotEmpty(groups={addUser.class})
private String id;
@NotEmpty(message = "用户名不能为空")
private String username;
@Size(min=6 ,max= 20 ,message = "密码最少6位,最高20位")
private String password;
......
}