1、SpringBoot的注解
1.1、一些程序步骤的注解
@Service
用于标注业务层组件。
@Repository
用于标注数据访问组件,即DAO组件。
@Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Configuration
表名类里的包含@Bean注解标注的方法。
被标注@Configuration的配置类为Full模式,否则为Lite模式。
在Spring 5.2之后新增了一种case也算作Lite模式:@Configuration(proxyBeanMethods = false),此值默认是true。
Full模式下运行时会给该类生成一个CGLIB子类放进容器,有一定的性能、时间开销。@Bean方法 不可以是private、不可以是final。
Lite模式下运行时不再需要给对应类生成CGLIB子类,提高了运行性能,降低了启动时间。@Bean方法 可以是private、可以是final。
@Bean
用在@Configuration注解下的类里面的方法上。
@MapperScan 和 @Mapper
在SpringBoot中集成MyBatis,可以在mapper接口上添加@Mapper将mapper注入到Spring,但是如果每一给mapper都添加@mapper注解会很麻烦,这时可以使用@MapperScan注解来扫描包。
经测试发现,@MapperScan注解只会扫描包中的接口,不会扫描类,所以可以在包中写Provider类。
@MapperScan(“com.demo.mapper”)
扫描指定包中的接口。
@MapperScan(“com.demo.*.mapper”)
一个*代表任意字符串,但只代表一级包,比如可以扫到com.demo.aaa.mapper,不能扫到com.demo.aaa.bbb.mapper。
@MapperScan(“com.demo.**.mapper”)
两个*代表任意个包,比如可以扫到com.demo.aaa.mapper,也可以扫到com.demo.aaa.bbb.mapper。
@AutoWired 和 @Qualifier
当一个接口有2个不同实现时,使用@Autowired注解时会报错,这时可以和 @Qualifier 配合使用。
@AutoWired
自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。
注:如果多个实现时可用 Map<String,Service> map处理,取值时用 map.get(实现类名) 获取。
xxx [] arys;
@Qualifier
当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定(为实现类上注解的名字),与@Autowired配合使用。
@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者
@scope(“prototype”)
singleton单例模式(全局有且仅有一个实例)。
prototype原型模式(每次获取Bean的时候会有一个新的实例)。
request(request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效)。
session(session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效)。
global session(global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。)。
@Value("${xxx}")
注入Spring boot application.properties配置的属性的值。
1.2、一些跟前端交互的注解
@RestController 和 @Controller
@RestController 相当于 @Controller+@ResponseBody 合在一起的作用。
1.如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
2.如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
@ResponseBody的作用
是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
@ResponseBody
public User login(User user){
return user;
}
相当于:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
@RequestMapping(value="/addUser/{userName}", method= RequestMethod.PUT)
提供路由信息,负责URL到Controller中的具体函数的映射。
@PathVariable
从url中获取参数值,可以定义多个,跟@RequestMapping结合使用(使用方括号加参数名)。
@RequestParam 和 @RequestBody
可以一起用,这时的@RequestBody 是输出所有参数(后端接口参数类型只能是 String)--可以不用看。
@RequestParam
需要前端传递单独参数。
@RequestBody
需要前端传递请求体。后端接口参数最多只能有一个,后端接口参数可以是基本类型,可以是类类型(前端必须传递 json)。
@Valid
启动参数验证,验证@RequestBody的实体参数校验。
@Validated
启动参数校验。
注:当用方法来调用接口验证时可用如下
import javax.validation
// 定义验证组
interface NewValid{};
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
public static<T> Map<String, StringBuffer> validate(T obj, Class.. groups){
Map<String, StringBuffer> errorMap = null;
Set<ConstraintViolation<T>> set;
if(groups == null || groups.length == 0){
set = validator.validate(obj, Default.class);
} else {
set = validator.validate(obj, groups);
}
if(set != null && set.size() >0){
errorMap = new HashMap<>();
String property;
for(ConstraintViolation<T> cv : set){
property = cv.getPropertyPath().toString();
if(errorMap.get(property) != null){
errorMap.get(property).append(",").append(cv.getMessage());
} else {
StringBuffer sb = new StringBuffer();
sb.append(cv.getMessage());
errorMap.put(property, sb);
}
}
}
return errorMap;
}
public void test(){
Map<String, StringBuffer> validate = validate(user, NewValid.class);
}
1.3、一些模型验证的注解
@Min(value = 0, message = “状态格式不正确”)
最小值。
@Max(value = 1, message = “状态格式不正确”)
最大值。
@NotBlank(message = “用户名不能为空”)
不能null和空字符串。
@Pattern(regexp = RegexUtils.password,message = “密码格式不正确”)
正则表达式。
注:如果是List,则在里面写注解。
1.4、一些大范围的注解
@SpringBootApplication(scanBasePackages=“xxx.xxx”):
属性作用是增加其他模块的包的扫描。
该注解替代@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。
@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。
@ComponentScan:ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,将这些bean定义加载到IoC容器中。
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。
@ServletComponentScan
Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册。
@WebFilter(filterName=“logCostFilter”, urlPatterns="/*")
过滤器。
@Order(1)
过滤器排序。
@WebListener
监听器。
@WebServlet
Servlet。
1.5、全局异常的注解
@ControllerAdvice 和 @ExceptionHandler(value = { Exception.class })
激活全局异常的注解。
1.6、定时任务的注解
@EnableScheduling
定时任务开关。
@EnableAsync
方法按周期新启动一个线程异步开关。
@Scheduled(cron = “0/5 * * * * ?”)
配置定时任务。
@Async
方法按周期新启动一个线程。
2、第3方组件的一些注解
2.1、Swagger的注解
@Api(tags={“xxx操作接口”})
修饰整个类,描述Controller的作用。
@ApiOperation(value=“添加用户”, notes="")
描述一个类的一个方法,或者说一个接口。
@ApiParam(name = “reqVO”)
单个参数描述。
@ApiModel
用对象来接收参数。
@ApiModelProperty(value=“用户名”)
用对象接收参数时,描述对象的一个字段。
2.2、Shiro的注解
@RequiresPermissions(“pm-account:add”)
注解在方法中,所需要的权限值。
2.3、Apollo的注解
@EnableApolloConfig({“application”,“tec.base”})
启动项目会在resource寻找Apollo的url配置文件。
@ApolloConfig(“tec.base”)
将Apollo服务端的中的配置注入这个类中。
@ApolloConfigChangeListener
监听配置中心配置的更新事件,若该事件发生,则调用refreshLoggingLevels方法,处理该事件。
2.4、Dubbo的注解
@Service(version = “1.0.0”,interfaceClass = ProviderService.class)
标记为服务。
@Reference(version = “1.0.0”,loadbalance=“roundrobin”, check = false)
服务引用。
2.5、slf4j日志的注解
@Slf4j
在类上打上@Slf4j注解,然后log变量使用,需要安装Lombok插件。