Spring注解
Bean常用注解:
1.声明Bean的注解:
@Component
声明为spring组件,配置Bean
@Controller
注册在类上,声明这个类是SpringMVC的Controller,将其声明为spring的Bean,一般用于写后台(有页面)
@Service
在业务逻辑层(service层)使用,作用于serviceImpl上
@Repository
在数据访问层(dao层)使用,将这个接口定义为一个资源库,使它能够被其他程序引用,并为其他程序提供存取数据库的功能,作用于daoImpl上
2.注入Bean的注解:
@Autowired
作用于字段上,用来装配bean,默认按type注入,默认情况必须要求依赖对象必须存在,如果要允许null值,设置required=false,如:@Autowired(required=false)
@Resource
作用于字段上,用来装配bean,默认按name注入,当找不到匹配名称的bean再按type装配,@Resource(name=”beanName”)指定了name,则按名称注入,但没找到bean也不会按照类型装配了
@Inject
按type装配bean,功能比@Autowired少,没使用必要
springBoot注解:
@SpringBootApplication
声明是一个spring boot应用
@Entity
作用于类上,实体类定义
@Table
作用于类上,执行关联的数据库的表名,如:@Table(name = “department”)
@Id
作用于字段上,定义一条记录的唯一标识
@GeneratedValue
作用于字段上,将其设置为自动生成,如:@GeneratedValue(strategy = GeneratedType.IDENTITY)
@ManyToOne
作用于字段上,定义该类与定义的对象是多对一的关系
@ManyToMany
作用于字段上,定义该类与定义的对象是多对多的关系
@DateTimeFormat
作用于字段上,日期类型的数据必须使用该注解进行格式化,以保证它在存取时能提供正确的格式,避免保存失败,如:@DateTimeFormat(pattern=”yyyy-MM-dd HH:mm:ss”)
@JsonBackReference
作用于字段上,用于防止关系对象的递归访问
@RestController
相当于@Controller + @ResponseBody 组合注解,声明Rest风格的控制器,一般用于写API,给移动客户端提供数据,一般是返回json数据。
@EnableAutoConfiguration
作用于类上,自动配置,相当于写了spring的配置文件
@ComponentScan
一般作用于App类上,用于组件扫描,配置一个或多个扫描的包,如:@ComponentScan(basePackages = {"com.springboot.*"})
@MapperScan
一般作用于App类上,用于扫描mapper类注解,不能使用com.springboot.*
区别:
@ComponentScan是组件扫描注解,用来扫描@Controller @Service @Repository这类,主要就是定义扫描的路径从中找出标志了需要装配的类到Spring容器中。
@MapperScan 是扫描mapper类的注解,就不用在每个mapper类上加@MapperScan了。
这两个注解是可以同时使用的。
@Primary
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Qualifier
Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,添加@Qualifier注解,需要注意的是@Qualifier的参数名称为我们之前定义@Service注解的名称之一。
@ConditionalOnExpression
在配置文件中设置一个开关,enabled,在开关为true的时候才实例化bean,进行相关业务逻辑的操作。
如:@ConditionalOnExpression("${enabled:false}")
@Validated和@Valid
配合BindingResult可以直接提供参数验证结果。
@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)。@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上。
spring常用注解:
@EnableScheduling + @Scheduled(cron = "*/1 * * * * ?")
定时任务注解,每秒钟
@RequestMapping
一般作用在Controller的方法上,映射WEB请求(访问路径和参数)
@ResponseBody
作用于方法上,返回结果不会被解析为跳转路径,会直接返回json数据
@RequsetBody
作用于形参列表上,用于将前台发送过来的固定格式的数据(xml或json数据)封装为JavaBean对象,如:login(@RequestBody User loginUser,HttpSession session)
@PathVariable
用来接收路径参数,如:
@RequestMapping("saveNotes/{conferId}")
public String xxx(@PathVariable String conferId)
@RequestParam
用于将请求参数区(如url)中的参数映射到功能处理方法的参数上,如:public String xxx(@RequestParam String userName),如果不加@RequestParam参数userName为非必传,加上则为必传。
@RequestParam:
1.可以使用required设置为非必传,默认为true如:@RequestParam(required=false)
2.可以指定参数名,如:@RequestParam(value=”userName”)
3.可以使用defaultValue设置参数默认值,如:@RequestParam(defaultValue=”lee”)
@Lazy
作用于类或方法上,指定bean是否延迟初始化,默认为false,如:@Lazy(true)相当于<bean id=”xx” lazy-init=””>,注:此处初始化不是指不执行init-method,而是不创建bean实例和依赖注入,只有当该bean(被@Lazy修饰的类或方法)被其他bean引用或执行getBean方法获取,才会真正的创建bean实例
@ExceptionHander
作用于方法上,定义全局处理控制器的异常,通过value属性可以过滤拦截的条件,如:@ExceptionHander(value=Exception.class) 表示拦截所有的Exception
@ControllerAdvice或@RestControllerAdvice
作用于类上,controller 的一个辅助类(控制器切面),最常用的就是作为全局异常处理的切面类
@PostConstruct
解决调用service层时为null的问题
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
@PreConstruct
被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。(详见下面的程序实践)
@Deprecated
被注解@Deprecated标记的程序元素是不鼓励使用的程序元素,通常是因为它很危险,或者是因为存在更好的替代方案。 即被废弃的代码。
AOP切面编程注解:
@Transactional
作用于方法上,声明事务,加入 @Transactional 注解,使用 默认配置,抛出异常之后,事务会自动回滚,数据不会插入到数据库。
Java配置类相关注解:
@Bean
作用于方法上,该方法的返回值定义为容器中的bean,向spring容器注册自定义类
@Configuration
作用于类上,被修饰的类相当于一个xml文件,相当于<beans></beans>,在spring boot中大量使用了该注解,该注解提供了一种使用Java类方式配置bean
@PropertySource
作用于类上,用于加载配置文件,如:@PropertySource(value=”classpath:jdbc.properties”)
@Value
作用于成员变量,常用于注入文件属性中的值,如:@Value(“${spring.datasource.url}”),@Value(“普通字符”) 注:@Value不能对static属性注入
@Scope
作用于方法上,设置spring容器如何新建bean实例,如@Scope(“prototype”)声明Scope为ProtoType
其设置类型包括(bean的5个作用域):
Singleton(单例,一个spring容器中只有一个bean实例)
ProtoType(每次调用创建一个bean实例)
Request(web项目中,给每一个http request 新建一个bean实例)
Session(web项目中,给每一个http session 新建一个bean实例)
GlobalSession(给每一个global http session 新建一个bean实例)
JDK自带注解
- @Override 重写, 标识覆盖它的父类的方法
- @Deprecated 已过期,表示方法是不被建议使用的
- @Suppvisewarnings 压制警告,抑制警告
元注解
@Target 表示该注解用于什么地方,可取的值包括:
- ElemenetType.CONSTRUCTOR 构造器声明
- ElemenetType.FIELD 域声明(包括 enum 实例)
- ElemenetType.LOCAL_VARIABLE 局部变量声明
- ElemenetType.METHOD 方法声明
- ElemenetType.PACKAGE 包声明
- ElemenetType.PARAMETER 参数声明
- ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
- ElementType.ANNOTATION_TYPE 注解
@Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
- RetentionPolicy.SOURCE 注解将被编译器丢弃
- RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
- RetentionPolicy.RUNTIME JVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
@Documented 将此注解包含在 javadoc 中
@Inherited 允许子类继承父类中的注解
常见第三方注解
@Repository: 用于标注数据访问组件,即DAO组件
@Service: 用于标注业务层组件
@Transactional: 声明这service所有方法都需要事务管理。每一个业务方法开始时都会打开一个事务
@Controller: 控制层
@Component: 把该中立的类交给spring管理
@Autowired: 自动装配,将bean容器里的值自动注入到bean
@Path: 处理REST请求,接口路径
@Method:
常用的HTTP动词有下面五个(括号里是对应的SQL命令)。
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
- DELETE(DELETE):从服务器删除资源。
还有两个不常用的HTTP动词。
- HEAD:获取资源的元数据。
- OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
@Accept和@Content-Type
有几种格式如下:
(1)@Produces("text/plain") 文本类型
(2)@Produces("text/html") Html类型
(3)@Produces({"application/xml"}) Xml类型
(4)@Produces({ "application/json"}) Json类型
可以一次注解两种或多种的MIME类型,格式如:{"application/xml", "application/json"}这表示两者都可以使用,但是选择的时候一般会选择前者,即application/xml,因为它第一次出现。
@Queryparam:指定的是URL中的参数是以键值对的形式出现的,而在程序中 @QueryParam("from") int from则读出URL中from的值,
例如:URL输入为:users?from=100&to=200&orderBy=age&orderBy=name
@Pathparam:URL中只出现参数的值,不出现键值对
例如: /users/100