0、SpringBoot注解
@SpringBootApplication
申明让spring boot自动给程序进行必要的配置。
包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。
@ComponentScan:组件扫描,可自动发现和装配一些Bean。让spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration :等同于spring的XML配置文件;使用Java代码可以检查类型安全。
@EnableAutoConfiguration :自动配置。
@EnableScheduling
@EnableScheduling的作用与<task:...../>的作用一样,会扫描整个项目中的@Scheduled注解
@Configuration类似于xml配置文件中的<beans...../>
@MapperScan
之前,Mapper类上面添加注解@Mapper,这种方式要求每一个mapper类都需要添加此注解,麻烦。@MapperScan可以指定要扫描的Mapper类的包的路径
详细解释:
@EnableAutoConfiguration:SpringBoot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置你的Spring应用。例如,如果你的classpath下存在HSQLDB,并且你没有手动配置任何数据库连接beans,那么我们将自动配置一个内存型(in-memory)数据库”。你可以将@EnableAutoConfiguration或者@SpringBootApplication注解添加到一个@Configuration类上来选择自动配置。如果发现应用了你不想要的特定自动配置类,你可以使用@EnableAutoConfiguration注解的排除属性来禁用它们。
@ComponentScan:表示将该类自动发现扫描组件。个人理解相当于,如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。可以自动收集所有的Spring组件,包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。如果没有配置的话,Spring Boot会扫描启动类所在包下以及子包下的使用了@Service,@Repository等注解的类。
@Configuration:相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。
@SpringBootApplication
@EnableScheduling
@MapperScan("com...web.*.mapper")
public class OMSAdminApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(OMSAdminApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(OMSAdminApplication.class);
}
}
一、spring注解
1.1 IOC相关注解
1.1.1 基本注解:
创建对象:
@Component: 属性:value:用于指定bean的id。 #默认值: 当前类名,且首字母改小写。
@Controller:一般用在表现层
@RestController:用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。
@Service:一般用在业务层
@Repository:一般用在持久层
@Mapper :mapper类文件中添加,用于映射mapper.xml文件,也可以用@MapperScan在springboot的启动类中配置所有包扫描
注入数据:
@Autowired :自动按照数据类型注入
@Inject:等价于默认的@Autowired,只是没有required属性;
@Qualifier: (value)类上搭配@Autowired 方法单独使用
@Resource (name)直接按照bean的id注入 相当于@Autowired+@Qualifier
@Value :注入基本类型和String类型的数据 @value(“${表达式}”)
改变作用范围的:
@Scope
属性:value:指定范围的取值。 #常用取值:singleton、prototype
生命周期相关:
@PreDestroy 作用:用于指定销毁方法
@PostConstruct 作用:用于指定初始化方法
1.1.2 新注解:
配置相关
作用:代替xml配置文件,用纯注解配置IOC会用到
@Configuration 【标志:没有属性】
作用:指定当前类是一个配置类
@ComponentScan
作用:spring在创建容器时要扫描的包
属性:value:它和basePackages的作用是一样的。
@Bean
作用:只能写在方法上 用于把当前方法的 #返回值作为bean对象存入spring的ioc容器中
属性: name:用于指定bean的id。当不写时,默认值是当前方法的名称
@Import
作用:用于导入其他的配置类
属性:value:用于指定其他配置#类的字节码。有Import注解的类就父配置类,而导入的都是子配置类
@ImportResource
作用:用来加载xml配置文件。
@PropertySource
作用:用于指定properties文件的位置
属性:value:指定文件的名称和路径。
关键字:classpath,表示类路径下==@PropertySource(“classpath : jdbcConfig.properties”)==
@value 作用: 从properties配置文件中获取数据
其他
@Scheduled
定时任务的配置 作用于方法上。
@Async
用于service的方法上,异步调用方法,当controller调用该service的方法时,会立即返回结果,service方法会在后台异步执行,用户体验较好。
Spring容器启动初始化bean时,判断类中是否使用了@Async注解,创建切入点和切入点处理器,根据切入点创建代理,在调用@Async注解标注的方法时,会调用代理,执行切入点处理器invoke方法,将方法的执行提交给线程池,实现异步执行。
注意:和该注解类似的基于AOP的注解,要通过代理对象去执行方法,因此(1)方法要是public修饰的方法,才能进行代理,(2)要在类的角度调用该方法,不能直接调用,不然不会实现AOP
SpringContextHolder.getBean(this.getClass()).handleUserInfo(appId, wxMpUserList);
@Async
public void handleUserInfo(String appId, WxMpUserList wxMpUserList){}
1.2 AOP相关注解
@Aspect #表明当前类是一个切面类
@Pointcut(“execution(* com.service.impl..(…))”) #切入点表达式注解配置
@After(“pt1()”) #通知方法的注解配置
@Before @after-returning @after-throwing @after//方法配置为通知
@Component("transactionManager")
@Aspect#表明当前类是一个切面类
public class TransactionManager {
@Pointcut("execution(* com.service.impl.*.*(..))")#切入点表达式注解配置
private void pt1(){}
@After("pt1()")#通知方法的注解配置
public void release() {
@Before @after-returning @after-throwing @after//方法配置为通知
@ComponentScan(basePackages=“com.itheima”) @EnableAspectJAutoProxy
不使用XML的配置方式
@Configuration
@ComponentScan(basePackages="com...")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
@Transactional 声明式事务
@Transactional(rollbackFor = Exception.class)
二、Springmvc的注解
@RequestMapping注解
作用:用于建立 请求路径 URL 和 处理请求方法之间的映射关系。简言:匹配请求路径,映射到方法
属性:
1. path 指定请求路径的url == value属性
2. mthod 指定该方法的请求方式
3. params 指定限制请求参数的条件。 要求请求参数的 key 和 value 必须和 配置的一模一样。
eg:params = {"accountName=张三"},表示请求参数必须有 ?accountName=张三
4. headers 发送的请求中必须包含的请求头
四个属性只要出现 2 个或以上时,他们的**关系是与的关系**。
@RequestParam注解
作用:当前端页面传递的属性名称和后台的控制器方法中的参数不一样时,进行参数名称指定。
把请求中的指定名称的参数传递给控制器中的形参赋值
属性:
1. value:请求参数中的名称 name属性意义一样
2. required:
1. 是否必须,默认值是true,必须提供 如果参数没出现,报错400。
2. false,如果参数没出现,null
3. defaultValue:默认值
@RequestMapping("/testRequestParam") #请求必须提供name的key值
public String testRequestParam(@RequestParam(name="name") String username
@RequestBody注解
作用:用于获取请求体的内容(注意:get方法不可以,没有请求体)
直接使用得到是 key=value&key=value…结构的数据
属性:required:是否必须有请求体,默认值是true
当取值为 true 时,get 请求方式会报错。如果取值 为 false, get 请求得到是 null。
@RequestMapping(path="/hello")
public String sayHello(@RequestBody String body) 获取请求体的内容
@ModelAttribute注解
作用 【该方法先执行】
- 出现在方法上:表示当前方法会在控制器方法执行前先执行。 【修饰的方法有返回值】
- 出现在参数上:获取指定的数据给参数赋值。【修饰的方法没有返回值】
属性:value:用于获取数据的 key。 key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
作用过程理解**:
(1)被它修饰的方法先执行,进行数据库查找值,
(2)将数据封装在map集合中。
(3)然后修饰在参数上,通过value属性获取值,给对应的参数进行赋值。
应用场景: 当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。
@RequestHeader注解
作用:获取指定请求头的值
属性: value:请求头的名称
@PathVariable注解
作用:获取请求参数中,占位符中的值.用于RESTFUL风格的编程方式。
例如:url中有/delete/{id},{id}就是占位符
属性:value:指定url中的占位符名称
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志
@CookieValue注解
作用:用于获取指定cookie的名称的值
属性: value:cookie的名称 【注意】value=“JSESSIONID”
@SessionAttributes注解
作用:用于多次执行控制器方法间的参数共享
属性: value:指定存入属性的名称
三、Mybatis注解
@Insert:实现新增 直接跟sql语句
@Update:实现更新
@Delete:实现删除
@Select:实现查询
----------------------------------
@Results:可以与@Result 一起使用,封装多个结果集
属性:
id:唯一标识 后续可以被@ResultMap引用
value:装@Result中对应关系的的数组
@Result:实现结果集封装
属性:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()
many 需要使用的@Many 注解(@Result(many=@many)()
@ResultMap:方法上,实现引用@Results定义的封装
------------------------------------
@One:实现一对一结果集封装 代替了<assocation>标签
属性:
select = "com.itheima.dao.IUserDao.findById",【关联查询语句】
fetchType = FetchType.EAGER 【立即加载】
@Many:实现一对多结果集封装 代替了<Collection>标签
属性:
select = "com.itheima.dao.IAccountDao.findByUid",【关联查询语句】
fetchType = FetchType.LAZY 【延迟加载】
------------------------------------
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用
四、JPA注解
@Entity:@Table(name=”“):表明这是一个实体类。
一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table可以省略
@Column:如果字段名与列名相同,则可以省略。
@Id:表示该属性为主键。
@MappedSuperClass:用在确定是父类的entity上。父类的属性子类可以继承。
@NoRepositoryBean:一般用作父类的repository,有这个注解,spring不会去实例化该repository。
GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”):表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。
@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式
@JsonIgnore:作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
@JoinColumn(name=”loginId”):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。
@OneToOne、@OneToMany、@ManyToOne:对应hibernate配置文件中的一对一,一对多,多对一。
五、lombok相关注解
直接看编译文件更直观https://zhuanlan.zhihu.com/p/32779910
@Data
注解在 类 上;提供类所有属性的 get 和 set 方法,此外还提供了equals、canEqual、hashCode、toString 方法。
@Setter
@Getter
注解在 属性 上;为单个属性提供 set 方法;
注解在 类 上,为该类所有的属性提供 set 方法, 都提供默认构造方法。
@Builder
作用在类上:使用builder模式创建对象
User user = User.builder()
@slf4j
注解在 类 上;为类提供一个 属性名为 log 的 log4j 日志对象,提供默认构造方法。 自动生成日志对象。
@AllArgsConstructor
注解在 类 上;为类提供一个全参的构造方法,加了这个注解后,类中不提供默认构造方法了。
@NoArgsConstructor
注解在 类 上;为类提供一个无参的构造方法。
@EqualsAndHashCode
注解在 类 上, 可以生成 equals、canEqual、hashCode 方法。
@ToString
这个注解用在 类 上,可以生成所有参数的 toString 方法,还会生成默认的构造方法。
@NonNull
注解在 属性 上,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常,也会有一个默认的无参构造方法。
一般使用@NotNull
@Cleanup
注解用在 变量 前面,可以保证此变量代表的资源会被自动关闭,默认是调用资源的 close() 方法,如果该资源有其它关闭方法,可使用 @Cleanup(“methodName”) 来指定要调用的方法,也会生成默认的构造方法
@RequiredArgsConstructor
这个注解用在 类 上,使用类中所有带有 @NonNull 注解的或者带有 final 修饰的成员变量生成对应的构造方法。
@Value
这个注解用在 类 上,会生成含所有参数的构造方法,get 方法,此外还提供了equals、hashCode、toString 方法。
@SneakyThrows
这个注解用在 方法 上,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 把异常抛出,可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常,也会生成默认的构造方法。
@Synchronized
这个注解用在 类方法 或者 实例方法 上,效果和 synchronized 关键字相同,
区别:在于锁对象不同,对于类方法和实例方法,
synchronized 关键字的锁对象分别是类的 class 对象和 this 对象,
而@Synchronized 的锁对象分别是 私有静态 final 对象 lock 和 私有 final 对象 lock,当然,也可以自己指定锁对象,此外也提供默认的构造方法。
@Accessors(chain = true)
使用链式设置属性,set方法返回的是this对象。
userChain.setId("1").setName("chain").setAge(1);
六、MybatisPlus
@Data
lombok相关
@TableName
指定数据库表名
@TableId
指定表的主键 因为MP默认匹配主键“id”
@TableField
指定表的列名 MP默认,下划线换大写的驼峰方式
@version
乐观锁注解
@EnumValue
描述:通枚举类注解(注解在枚举字段上)
@TableLogic
描述:表字段逻辑处理注解(逻辑删除)
@SqlParser
描述:租户注解 3.1.1开始支持注解在mapper上和mapper的方法上
@KeySequence
描述:序列主键策略 oracle
七、全局异常处理
@ControllerAdvice:包含@Component。可以被扫描到。统一处理异常。
@RestControllerAdvice:
@ExceptionHandler(Exception.class):用在方法上面表示遇到这个异常就执行以下方法。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler//处理所有异常
public ResponseMessage exceptionHandler(Exception e, HttpServletResponse response) {
}