Annotation笔记

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MyNmQXEB-1603719183882)(Annotation笔记.assets\165.jpg)]

Author:高小昂

Since:2020年9月2日

Count:109个

文章目录

前言

该笔记中的所有注解类型,只举例了最常用的,而不一定是全部的类型

一、常见:7个

1.1、元注解

用来描述注解的注解

1.1.1、@Retention()
  1. 类型:类
  2. 作用:指定注解可以保留的域。
  3. 取值:详情内容请参阅 java.lang.annotation.RetentionPolicy
    1. CLASS:注解记录在class⽂件中,运⾏Java程序时, JVM不会保留,此为默认值。
    2. RUNTIME:注解记录在 class⽂件中,运⾏Java程序时,JVM会保留,程序可以通过反射获取该注释
    3. SOURCE: 编译时直接丢弃这种策略的注释。
1.1.2、@Target()
  1. 类型:类
  2. 作用:指定注解用于修饰类中的哪个成员(也就是本笔记中的类型)
  3. 取值:详情内容请参阅 java.lang.annotation.ElementType 枚举类
    1. TYPE:类、接口(包括注解)、枚举
    2. FIELD:属性(包括枚举常量)
    3. METHOD:方法(包括注解方法)
    4. PARAMETER:参数
    5. CONSTRUCROT:构造函数
    6. LOCAL_VARIABLE:局部变量
    7. ANNOTATION_TYPE:注解
    8. PACKAGE:包
    9. TYPE_PARAMETER:类型参数,1.8后出现
    10. TYPE_USE:类型使用,1.8后出现

1.2、@AliasFor()

  1. 类型:方法
  2. 作用:起别名
  3. 取值:别名的名称

1.3、@Override

  1. 类型:方法
  2. 作用:声明该方法是由父类继承后自身重写的

1.4、@SupperssWarnings

  1. 类型:几乎所有类型
  2. 作用:抑制编译警告
  3. 取值:unchecked、rawtypes、all…

1.5、@Deprecated

  1. 类型:几乎所有类型
  2. 作用:将所修饰的代码变为过时代码

1.6、@Documented

  1. 类型:注解
  2. 作用:可以理解为给注解类型添加一个javadoc也就是文档注释类型

二、Servlet:2个

2.1、@WebServlet()

  1. 类型:类
  2. 作用:定义java类能被服务器访问到的规则
  3. 取值:/路径
  4. 注:被注解的类需要继承javax.servlet.http.HttpServlet类

2.2、@WebFilter()

  1. 类型:类
  2. 作用:当访问服务器的某些资源时,过滤器可以把请求拦截下来,完成一些特殊的功能,例如登录验证、统一处理编码格式、敏感字的过滤······
  3. 取值:/*
  4. 注:被注解的类需要实现java.servlet.Filter接口,重写dofilter方法

三、IOC:8个

<!--告知spring哪些包中有被注解的类、方法以及属性-->
<context:component-scan base-package="包名"/>

3.1、@Component

  1. 类型:类

  2. 作用:供扫描器扫描以创建对象

  3. 取值:

//无取值:默认驼峰命名法类名
@Component
//有取值:为取值的值
@Component("userDao")
3.1.1、@Controller
  1. 类型:类
  2. 作用:表现层专用(可读性,非规定)的@Component子注解
  3. 取值:同@Component
3.1.2、@Service
  1. 类型:类
  2. 作用:业务层专用(可读性,非规定)的@Component子注解
  3. 取值:同@Component
3.1.3、@Repository
  1. 类型:类
  2. 作用:持久层专用(可读性,非规定)的@Component子注解
  3. 取值:同@Component

3.2、@Scope()

  1. 类型:类

  2. 作用:定义当前注解所标记的类在被创建时的单例、多例模式

  3. 取值(可以自己直接写,也可以使用静态常量):

//单例模式:销毁时由Spring容器销毁
@Scope(value=ConfigurableBeanFactroy.SCOPE_SINGLETIM)
@Scope(value="singleton")
//多例模式:销毁时等待JVM销毁
@Scope(value=ConfigurableBeanFactroy.SCOPE_PROTOTYPE)
@Scope(value="prototype")  

3.3、@Lazy()

  1. 类型:类

  2. 作用:

    1. 延迟加载(lazy init):创建对象时再进行加载,而非工厂准备完毕时就进行加载(不会立即创建对象)
    2. 可以减少springIOC容器启动的加载时间
  3. 取值:

    //延迟加载(不写时,默认取值为true):
    @Lazy
    //非延迟加载(效果跟不写一摸一样,所以,你懂的~):
    @Lazy(false)
    

3.4、@PostConstruct

  1. 类型:方法
  2. 作用:初始化方法,类完全创建完成之后执行的方法(init-method)

3.5、@PreDestroy

  1. 类型:方法
  2. 作用:“销毁”方法,类销毁之前执行的方法(destroy-method)

四、DI:4个

4.1、@Value()

  1. 类型:属性
  2. 作用:给八大基本数据类型以及String类型注入
  3. 取值:括号内填值或者使用EL表达式("${id}")添加引用(properties或者yml等文件)变量

4.2、@Autowired

  1. 类型:属性

  2. 作用:引用数据类型注入(按照类型)

  3. 取值:无(自动装配:根据类型来实现自动注入值)。

  4. 缺点:多态时如果有多个子(实现)类有可能会报异常(NoUniqueBeanDefinitionException):

    org.springframework.beans.factory.NoUniqueBeanDefinitionException:No qualifying bean of type 'XXX' available: expected single matching bean but found 2: XXX,XXX
    

4.3、@Qualifier()

  1. 类型:属性,参数
  2. 作用:引用数据类型注入(按照名称)
  3. 取值:类名
  4. 注:
    1. 多依赖于Autowired存在,限定要自动注入的bean的id,以弥补Autowired的缺点
    2. 可以明确引用名称是XXX的对象,括号内填写所需对象的name
    3. 作为参数注解时,可以绑定固定的属性

4.4、@Resource()

  1. 类型:属性
  2. 作用:引用数据类型注入
  3. 取值:
    1. 按照类型:@Resource
    2. 按照名称:@Resource(name)
  4. 注:
    1. 效果等同于@Autowired+@Qualifier(name="")
    2. ()可以删除,如果删除效果等同于@Autowired,缺点相同

***五、Test(集成JUnit)***:2个

此模块为spring中的测试用注解,@RunWith()和@ContextConfiguration()相互依附存在。

可以免去工厂的创建过程,直接将要测试的组件注入到测试类。

5.1、@RunWith()

  1. 类型:类

  2. 作用:spring测试用注解

  3. 取值:

    //默认值,几乎不用,作为spring的注解你用junit?
    @RunWith(JUint4CalssRunner.class)
    //spring中负责测试类的运行的值(常用,不对,是必用)
    @RunWith(SpringJUnit4ClassRunner.class)
    

5.2、@ContextConfiguration()

  1. 类型:类

  2. 作用:读取配置文件

  3. 取值:

    //小提示:使用idea时,写文件名有快捷提示
    @ContextConfiguration("classpath:[配置文件的文件名]")
    

六、AOP:8个

<!--告知spring开启AOP注解功能-->
<aop:aspectj-autoproxy/>
  1. 执行顺序:

    1. 无异常时:环绕前->前置->环绕后->最终->后置
    2. 有异常时:环绕前->前置->最终->异常
  2. 五大通知的方法中可以有一个共同参数,可以得到目标类的对象、方法:

    public void 方法名(JoinPoint joinPoint){}
    

6.1、@Aspect

  1. 类型:类
  2. 作用:声明切面类

6.2、@Order()

  1. 类型:类

  2. 作用:多个切面切入同一个切入点时定义切面类的执行优先级,效果等同于继承Ordered接口

  3. 取值:int类型,取值越小优先级越高

    //默认为0,默认时可不写
    @Order(-1)
    public class UserQieMian{}
    

6.3、@Pointcut()

  1. 类型:方法

  2. 作用:定义指向切点类的方法(切入点)

  3. 取值:切入点表达式

    //方法的方法体为空,使用时请删掉中括号及其中内容并注意精确度,包名与类名的通配符可以合并
    @Pointcut(value="execution(*[意指返回值] *[意指包名].*[意指类名].*[意指方法名](..[两个点代表所有参数列表]))")
    public void pointCut(){}
    

6.4、@Before()

  1. 类型:方法

  2. 作用:定义切面类前置通知方法

  3. 取值:切面方法

    @Before(value="[被pointcut所注解的方法名]()")
    public void before(JoinPoint joinPoint){}
    

6.5、@AfterReturning()

  1. 类型:方法

  2. 作用:定义切面类后置通知方法

  3. 取值:切面方法和返回值名

    //通过returning获取切点的返回值,两个#VALUE#请保持一致
    @AfterReturning(value="[被pointcut所注解的方法名]()",returning = "#VALUE#")
    public void afterReturning(Object #VALUE#){}
    

6.6、@Around()

  1. 类型:方法
  2. 作用:定义切面类环绕通知方法
  3. 取值:切面方法
@Before(value="[被pointcut所注解的方法名]()")
public Object arond(ProceedingJoinPoint joinPoint){
    //TODO:前置(条件)代码
    //相当于调用切点方法(不使用则不会环绕)
    return point.proceed();
    //TODO:收尾代码
}

6.7、@AfterThrowing()

  1. 类型:方法

  2. 作用:定义切面类异常通知方法

  3. 取值:切面方法和异常名

    //通过throwing获取目标类的异常信息,两个#VALUE#请保持一致
    @AfterThrowing(value="#被pointcut所注解的方法名#()",throwing = "#VALUE#")
    public void afterThrowing(Exception #VALUE#){}
    

6.8、@After()

  1. 类型:方法

  2. 作用:定义切面类最终通知方法

  3. 取值:切面方法

    @After(value="#被pointcut所注解的方法名#()")
    public void after(){}
    

七、事务:1个

<!--告知spring和@Transactional在定制事务时,基于txManager=DataSourceTransactionManager-->
<tx:annotation-driven transaction-manager="transactionManager"/>

7.1、@Transactional()

  1. 类型:类、方法

  2. 作用:为类/方法添加事务

  3. 取值:

    //作用于类上时,对该类中的每个方法都切入事务(有自己的事务控制的方法除外)
    //作用于方法上时,仅对该方法有效
    //参数建议不写(默认)
    @Transactional(isolation=Isolation.READ_COMMITTED,propagation=Propagation.?????,readOnly=false,rollbackFor=Exception.class,timeout = -1)
    

八、SpringMVC:10个

<!--告知springMVC哪些包中存在被注解的类-->
<context:component-scan base-package="com.qf.controller"/>
<!--注册注解开发驱动,简化处理器映射器和处理器适配器,5.几版本后可省略-->
<mvc:annotation-driven/>
<!--视图解析器,配置访问逻辑视图名-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀--> 
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <!--后缀--> 
    <property name="suffix" value=".jsp"></property>
</bean>

8.1、@RequestMapping()

  1. 类型:方法、类

  2. 作用:设置浏览器访问路径

  3. 取值:下例的访问方法:http://localhost:8080/lofty/index

    1. 类注解:

      //类似于根目录下的父目录,访问该类下的资源时,需要有此路径
      @RequestMapping("/lofty")
      
    2. 方法注解:

      //value代表url地址
      @RequestMapping(value="/index",method=RequestMethod.GET)
      public String showIndex(){
          retrun "jsp页面名";
      }
      
    3. produces属性:解决乱码问题

8.1.1、@GetMapping()
  1. 类型:方法
  2. 作用:@RequestMapping的get方法子注解
  3. 取值:直接写路径
8.1.2、@PostMapping()
  1. 类型:方法
  2. 作用:@RequestMapping的post方法子注解
  3. 取值:直接写路径
8.1.3、@PutMapping()
  1. 类型:方法
  2. 作用:@RequestMapping的put方法子注解
  3. 取值:直接写路径
8.1.4、@DeleteMapping()
  1. 类型:方法
  2. 作用:@RequestMapping的delete方法子注解
  3. 取值:直接写路径

8.2、@RequestParam()

  1. 类型:参数

  2. 作用:可以理解为给前端传来的参数起个别名

  3. 取值:

    //requRired含义可以理解为false时变为可有可无参数
    //defaultValue含义为如果没有传则给默认值
    public String lofty(@RequestParam("username") String name,
                        @RequestParam(value="uid",required = false) Integer id, @RequestParam(value="uage",defaultValue="18") Integer age)
    {}
    
  4. 注:需要保证前端传来的参数的类型、长度、格式(比如日期,yyyy/MM/dd HH:mm:ss)完全一致

8.3、@PathVariable()

  1. 类型:参数

  2. 作用:路径变量(设计动态url)

  3. 取值:

    //变量名和前端参数键名相同时可以不写括号
    @PathVariable(name="路径变量大括号里的值") String id
    
  4. 注:在springCloud中使用时

    image-20201021113732765

8.4、@CookieValue()

  1. 类型:参数
  2. 作用:在请求头中获取单个Cookie,等效getCookie
  3. 取值:Cookie中的键,可获取其中的值

8.5、@RequestHeader()

  1. 类型:参数
  2. 作用:获取请求头中单个的值,等效getHeader()
  3. 取值:请求头中的键,可获取其中的值

8.6、@SessionAttribute(s)

  1. 类型:类

  2. 作用:在session域中开辟新属性,即session的key

  3. 取值:

    @SessionAttributes(value = {"id","name","password"})
    
  4. 注:可以用session,也可以用model默认存值(此时便不存于request中)

九、Json:9个

使用时需要导入依赖包

<!--jackson-databind:负责Java类与json字符串之间互相转换!-->
<dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.9.6</version>
</dependency>
<!--上面的依赖了下面的,根据依赖传递特性,下面的依赖不需要写-->
<!--<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-annotations</artifactId>
	<version>2.9.6</version>
</dependency>-->

9.1、@RequestBody

  1. 类型:参数

  2. 作用:将前端传来的json字符串转化为相应的对象

  3. 取值:

    //不写括号默认为true,false时相当于不写该注解
    public String lofty(@RequestBody User user){}
    
  4. 注:需要类中的每一个属性名与前端传值的name相同,如果不相同,可参照9.6注解处理

9.2、@ResponseBody

  1. 类型:方法
  2. 作用:
    1. 将对象处理成json响应给页面,等效writeValueAsString()
    2. 将字符串直接响应给页面,等效getWriter().write()

9.3、@RestController

  1. 类型:类
  2. 作用:相当于给类中的每个方法都加了@ResponseBody

9.4、@JsonFormat()

  1. 类型:属性

  2. 作用:在Bean中将Data属性格式化,使用方式与@DateTimeFormat()相反

  3. 取值:

    @JsonFormat(pattern="yyyy/MM/dd HH:mm:ss")
    private Date time;
    
  4. 注:在响应的时候要注意和前端的联系,格式有不一样会报400,仅在json传参中有效

9.5、@DateTimeFormat()

  1. 类型:参数【常用】、属性

  2. 作用:将前端传来的Date类型的日期格式化

  3. 取值:

    1. 参数注解

      public String lofty(@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date time){}
      
    2. 属性注解

      @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss")
      private Date time
      
  4. 注:仅仅是前端接收参数,而非后端代码

9.6、@JsonProperty()

  1. 类型:属性

  2. 作用:用json时起别名,会覆盖原名,只在json字符串中生效

  3. 取值:别名,不写值等同于不写该注解

9.7、@JsonIgnore

  1. 类型:属性

  2. 作用:忽略敏感字段的写入与输出(常用于密码)

9.8、@JsonInclude()

  1. 类型:属性

  2. 作用:参见取值

  3. 取值:

    //忽略值为空的字段,长度为0时不会被忽略
    @JsonInclude(JsonInclude.Include.NON_NULL)
    //忽略长度为0或本身为null的字段
    //举例:
    //String s = "";
    //List<String> strings = new ArrayList<>();
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    

9.9、@JsonSerialize

  1. 类型:属性
  2. 作用:浮点数的保留位数设置
  3. 取值:字节码文件,using= Clazz
  4. 注:需要设置一个继承JsonSerializer的类以共同实现

十、FastJson:1个

<!--需要导入依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.49</version>
</dependency>
<!--需要配置于spring-web.xml中-->
<mvc:annotation-driven>
     <mvc:message-concerters>
           <!--配置fastjson中的消息转换器-->
           <bean class="FastJsonHttpMessageConverter+回车">
               <property name="supportedMediaTypes">
                   <list>
                       <value>application/json</value>
                   </list>
               </property>
           </bean>
     </mvc:message-concerters>
</mvc:annotation-driven>

10.1、JSONField()

  1. 类型:属性

  2. 作用:同@JsonProperty()

  3. 取值:

    //设置字段别名
    name=??
    //设置字段限制
    serialzeFeatures=SerialzeFeature.???
    //设置敏感字段的忽略
    serialize = flase
    //设置日期格式化
    format = "yyyy/MM/dd"
    //设置钱币相关
    serialzeUsing
    

十一、Error:2个

11.1、@ControllerAdvice

  1. 类型:类
  2. 作用:@Component的子注解,@Controller的增强,多用于全局异常处理
  3. 取值:参考@Controller

11.2、@ExceptionHandler()

  1. 类型:方法

  2. 作用:对异常进行处理

  3. 取值:想要捕获的字节码文件,效果可认作catch

    @ExceptionHandler(Exception.class)
    

十二、跨域请求:1个

12.1、@CrossOrigin()

  1. 类型:方法、类(使该类的所有方法生效)

  2. 作用:可以让其他项目进行跨域ajax请求,克服同源策略

  3. 取值:

    //定义可以被访问的请求地址
    origis={"http://localhost:8080","",""...}
    //定义可以被访问的请求方式
    methods={RequestMethod.GET,...}
    

十三、MyBatis:10个

配置:

  1. 于application-dao.xml中:
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
</bean>
  1. 于mybatis-config.xml中(常用):
<!-- 打印查询语句 -->
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--配置类型别名-->
<typeAliases>
    <typeAlias type="com.yyg.redis.domain.Msg"/>
</typeAliases>
<!--配置分页插件-->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

13.1、@Param

  1. 类型:参数

  2. 作用:在多参数的查询语句中,给形参定义一个别名以防止ORM映射失败(就可以不使用它的默认形参,可视为逆向sql中的AS关键字)

  3. 取值:别名值

13.2、@Insert

  1. 类型:方法

  2. 作用:数据库添加语句,格式与xml中相同

  3. 取值:sql语句

13.3、@Delete

  1. 类型:方法
  2. 作用:数据库删除语句,格式与xml中相同
  3. 取值:sql语句

13.4、@Update

  1. 类型:方法
  2. 作用:数据库修改语句,格式与xml中相同
  3. 取值:sql语句

13.5、@Select

  1. 类型:方法
  2. 作用:数据库查询语句,格式与xml中相同
  3. 取值:sql语句

13.6、@SelectKey()

  1. 类型:方法
  2. 作用:执行添加语句时获取新增的位置或新增之前的位置
  3. 取值:(缺一不可)
    1. keyProperty:类里对应表主键的属性名
    2. keyColumn:表里主键名
    3. before:是否在添加之前查询(T/F)
    4. statement:sql语句
    5. resultType:返回值类型的字节码文件

13.7、@Options()

  1. 类型:方法
  2. 作用:执行添加语句时获取新增的位置或新增之前的位置
  3. 取值:其他不写默认即可
    1. useGeneratedKeys=true

13.8、返回值相关

  1. 类型:均为方法
  2. 作用:防止ORM映射失败
13.8.1、@ResultMap
  1. 作用:引用别的方法上的@Results
  2. 取值:value=别的方法上的@Results的id
13.8.2、@Results
  1. 作用:字段名与属性名不一致时起别名,效果等于数据中的AS
  2. 取值:
    1. id:起个id给@ResultMap用
    2. value={@result,…}
13.8.3、@Result
  1. 作用:字段名与属性名不一致时起别名,效果等于数据中的AS
  2. 取值:
    1. id:是否为主键
    2. column:表中字段名
    3. property:类中属性名

十四、 springBoot:9个

14.1、@SpringBootApplicatin

  1. 类型:类
  2. 作用:标记启动类

14.2、@SpringBootConfiguration【重点理解

  1. 类型:类
  2. 作用:代表启动类就是一个配置类

14.3、@EnableAutoConfiguration【重点理解

  1. 类型:类
  2. 作用:实现自动装配

14.4、@ComponentScan

  1. 类型:类
  2. 作用:扫描注解标记类
  3. 取值:一般不需要

14.5、@Configuration

  1. 类型:类
  2. 作用:声明配置类(组件类)
  3. 取值:一般不需要

14.6、@ConfigurationProperties()

  1. 类型:类
  2. 作用:声明配置类,“协助”@Configuration存在
  3. 取值:prifix : yml配置的前缀

14.7、@Bean

  1. 类型:方法
  2. 作用:创建实体类,等效于xml中的标签
  3. 注:在注解所标记的方法内返回需要的类

14.8、@MapperScan()

  1. 类型:类(写在启动类上)
  2. 作用:等同于MapperScannerConfiguration类的作用,扫描mapper包位置
  3. 取值:basepackages = “com.???”(mapper的位置)

14.9、@ServletComponentScan()【了解

  1. 类型:类(写在启动类上)
  2. 作用:开启servlet,(针对@WebServlet()注解)
  3. 取值:basepackages = “所在包名”(servlet或Filter的位置)

十五、JPA:6个

15.1、@Table()

  1. 类型:类
  2. 作用:实体类对应表名
  3. 取值:name = 对应数据库表名

15.2、@Entity

  1. 类型:类
  2. 作用:使得当前类称为一个实体类,此时该类可以被JPA进行管理.

15.3、@Query

  1. 类型:方法
  2. 作用:自定义配置sql语句
  3. 取值:nativeQuery = 原生sql语句

15.4、@GeneratedValue()

  1. 类型:属性
  2. 作用:主键注解
  3. 取值:strategy = GenerationType.AUTO

15.5、@Id

  1. 类型:属性
  2. 作用:主键注解

15.6、@Column

  1. 类型:属性
  2. 作用:其他属性注解,对应数据库“别名”
  3. 取值:name = 对应数据库键名

十六、Redis:4个

想要注解生效需要配置xml文件 | config类:

<!--略-->
<bean id="cacheManager" class="巴拉巴拉"></bean>

@Configuration
@EnableCaching
public class RedisCacheConfig{
       //yml文件中自定义key
       @Value("${cache.default-exp}")
       private long exps;
       @Value("${spring.redis.host}")
       private String host;
       @Value("${spring.redis.port}")
       private int port;
       //@Value("${spring.redis.timeout}")
       //private int timeout;
       //@Value("${spring.redis.password}")
       //private String password;
       /**
         * 设置redis中key的生成规则
         */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuffer sb = new StringBuffer();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

    /**
         * RedisTemplate配置
         */
    @Bean
    public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer<JSON> serializer = new Jackson2JsonRedisSerializer<>(JSON.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);
        template.setValueSerializer(serializer);
        template.setHashValueSerializer(serializer);
        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        //使得上面的配置生效
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        // 使用Jackson2JsnRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer<JSON> serializer = new Jackson2JsonRedisSerializer<>(JSON.class);
        // 配置序列化
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer));
        config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer));
        // 设置缓存的默认过期时间
        config.entryTtl(Duration.ofSeconds(exps));
        // 不缓存空值
        config.disableCachingNullValues();
        return  RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
    }
}

16.1、@EnableCaching

  1. 类型:类
  2. 作用:rebis的key的序列化器,写在config类上

16.2、@Cacheable()

  1. 类型:方法

  2. 作用:开启redis缓存,常用于select方法

  3. 取值:

    //最终缓存结果等效语句:set string::id zhangsan
    //         key的前缀       参数的值       缓存条件:返回值非空
    @Cacheable(value = "string", key = "#id", unless = "#result eq null")
    public String function(int id){
        return "zhangsan";
    }
    
  4. redis结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQBhOs8f-1603719183885)(Annotation笔记.assets\image-20201013162043401.png)]

16.3、@CachePut()

  1. 类型:方法
  2. 作用:开启redis缓存,常用于update方法
  3. 取值:见@Cacheable

16.4、@CacheEvict()

  1. 类型:方法
  2. 作用:开启redis缓存,常用于delete方法
  3. 取值:见@Cacheable

十七、RabbitMQ:2个

17.1、@RabbitListener

  1. 类型:方法

  2. 作用:声明监听特定队列,进行消费处理的方法

  3. 取值:queues = 多个队列

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hhhAjDdw-1603719183886)(Annotation笔记.assets\image-20201018155340251.png)]

17.2、@RabbitHandler【了解,不常用

  1. 类型:方法
  2. 作用:用来声明处理接收消息的方法

十八、SpringCloud:14个

父项目依赖声明

<!--父项目依赖声明-->
<packaging>pom</packaging>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <!--版本号与spring对应-->
            <version>Hoxton.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

18.1、Eureka

依赖配置

<!--服务端依赖-->
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

<!--客户端依赖-->
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

application.yml中配置

  1. 简略配置
server:
  # 端口号
  port: 8761
eureka:
  instance:
    # ip地址
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

  1. 详解配置
eureka:
  client:
    #设置eureka服务器地址
    service-url:
      #defaultZone: http://localhost:8761/eureka/
      #defaultZone: http://admin:admin@localhost:8761/eureka/
      defaultZone: http://admin:admin@localhost:8762/eureka/,http://admin:admin@localhost:8763/eureka
    #默认情况下,eureka会自己也注册自己身上,也就是会把eureka的信息记录到服务列表中!
    #如果要搭建eureka集群,实现eureka的高可用,需要把该值变为true
    register-with-eureka: true
    #是否从自身拉取自身的配置信息
    fetch-registry: true
  #eureka常用的调优
  instance:
    #默认情况下,服务器之间是利用服务名称来发现对象的!当把下面的配置改为true之后,就可以利用ip地址来发现别的服务了!
    prefer-ip-address: true
    #每隔多久客户端需要向服务器发送一次心跳,续约间隔,默认值30秒!
    lease-renewal-interval-in-seconds: 30
    #如果在90秒内,客户端实例没有给服务器发送一次心跳,服务器就认为该客户端失效了,就把该服务从服务列表中移除!
    lease-expiration-duration-in-seconds: 90
  server:
    #开启自我保护模式,默认已开启.一般在开发阶段需要关闭这个功能,可以置为false;而在上线后,一般需要开启该功能,把这个值置为true,
    #避免因为网络问题而造成心跳发送不成功,而把服务给剔除掉!也就是开启了自我保护之后,即使在90秒内一次心跳也没发,也不会剔除该服务!
    enable-self-preservation: true
    #默认情况下,eureka服务器一般希望在15分钟内,客户端发来心跳成功的次数,所占的比例要>85%!
    #如果低于这个0.85,就会在eureka后台展示一个红色的告警信息,说明心跳发送的有问题!
    #计算公式: 15*2=30,其实只需要大于等于30*0.85=25.5值,我们就认为没问题!
    renewal-percent-threshold: 0.85
18.1.1、@EnableEurekaServer
  1. 类型:类(写在启动类上)
  2. 作用:服务端启动类注解
18.1.2、@EnableEurekaClient
  1. 类型:类(写在启动类上)
  2. 作用:客户端启动类注解
18.1.3、@EnableWebSecurity
  1. 类型:类(写在启动类上)

  2. 作用:开启Eureka安全认证功能的配置类注解

  3. 需要添加依赖:

     <!--Eureka安全认证依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    

18.2、Ribbon

依赖配置

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

ribbonConfig配置

public class RibbinConfig{
       @Bean
       public IRule iRule() {
           //设置一个轮询的负载均衡策略
           //return new RoundRobinRule();
           //随机
           //return new RandomRule();
           //基于响应时间进行权重的分配
           return new WeightedResponseTimeRule();
       }

       @Bean
       @LoadBalanced
       public RestTemplate restTemplate(){
           return new RestTemplate(); 
       }
}
18.2.1、@LoadBalanced
  1. 类型:方法
  2. 作用:让RestTemplate在请求时拥有客户端负载均衡的能力,即开启负载均衡的功能

18.3、Feign

依赖配置

<!-- 客户端依赖 -->
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

创建一个接口,并和search模块映射

@FeignClient("SEARCH") // 指定eureka的服务名称
public interface SearchClient {
       // value -> 指定服务名称,method -> 指定请求方式
       @RequestMapping(value = "/search",method = RequestMethod.GET)
       //@getMapping("/search")
       String search(); 
}
18.3.1、@EnabelFeignClients
  1. 类型:类(写在启动类上)
  2. 作用:开启FeignClient注解功能
18.3.2、@FeignClient()
  1. 类型:类

  2. 作用:自定义一个接口以完成远程服务映射

  3. 取值:

    1. name = “远程服务名称”

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2pIutTWj-1603719183889)(Annotation笔记.assets\image-20201021110629989.png)]

    1. path = “/url” 防止接口冲突,提供前缀

18.4、Hystrix

依赖配置

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
   </dependency>
18.4.1、@EnableCircuitBreaker
  1. 类型:类(写在启动类上)
  2. 作用:启动Hystrix降级服务
18.4.2、@EnableHystrixDashboard
  1. 类型:类(写在启动类上)

  2. 作用:配置断路器的监控界面

  3. 需要添加依赖

     <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    </dependency>
    
18.4.3、@HystrixCommand()
  1. 类型:方法
  2. 作用:给当前方法开启降级服务
  3. 取值:
    1. fallbackMethod = “降级方法名”

      @HystrixCommand修饰的函数必须和这个回调函数定义在同一个类中,因为定义在了同一个类中,所以fackback method可以是public/private均可。

    2. defaultFallback = “默认降级方法名”

    3. commanProperties = { 每一个18.4.4、@HystrixProperty注解 }

    4. CommandKey = “当前方法名(可改别的)”;作用请参阅18.4.5、@CatchResult

18.4.4、@HystrixProperty
  1. 类型:方法
  2. 作用:配置线程隔离
  3. 取值:详细内容请参阅 com.netflix.hystrix.HystrixCommandProperties[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-73AysmaT-1603719183890)(Annotation笔记.assets\image-20201021165506400.png)]
18.4.5、@CatchResult
  1. 类型:方法
  2. 作用:
    1. 不写取值时,把当前方法的方法名称作为缓存的key的一部分,而另一部分请参阅18.4.6、@CatchKey
    2. 写取值cacheKeyMethod时,将设置key的责任完全负在自己肩上,这样做会忽略@CatchKey注解的作用
    3. 把当前方法的返回值当作缓存的value
  3. 取值:cacheKeyMethod = “xxxx”
  4. 注意:必须与@HystrixCommand注解结合使用
18.4.6、@CatchRemove
  1. 类型:方法

  2. 作用:清除缓存

  3. 取值:

    1. commodKey = “需要清除缓存的方法名”
    2. cacheKeyMethod 同@CatchResult(cacheKeyMethod = “xxxx”)
  4. 注意:Marks methods used to invalidate cache of a command. Generated cache key must be same as key generated within CacheResult context.

    译文:标记用于使命令的缓存无效的方法。生成的缓存键必须与CacheResult上下文中生成的键相同。

18.4.7、@CatchKey
  1. 类型:参数
  2. 作用:
    1. 将参数当作缓存的key的一部分来使用
    2. 需要配合@CatchResult或@CatchRemove使用
    3. 如果不写该注解,默认为@CatchResult或@CatchRemove所修饰的所有参数作为key
    4. 如若想不将参数写入键中,请查阅18.4.6.3.1

18.5、Zuul

依赖配置

<!--本身依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

<!--健康检测依赖-->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml配置

# 指定Eureka服务的地址
eureka:
  client:
    service-url:
      defaultZone: http://root:root@localhost:8761/eureka,http://root:root@localhost:8762/eureka

# 指定服务的名称
spring:
  application:
  name: ZUUL

server:
  port: 10086

# 查看zuul的监控界面,(开发时配置为*,上线请不要配置)
management:
  endpoints:
    web:
      exposure:
        include: "*"
18.5.1、@EnableZuulProxy
  1. 类型:类(写在启动类上)
  2. 作用:开启网关功能

18.6、sideCar

依赖配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-netflix-sidecar</artifactId>
</dependency>

application.yml配置

# 指定代理的第三方服务
sidecar:
  # 指定ip地址
  ip-address:
  # 指定端口号
  port: 7001
18.6.1、@EnableSidecar
  1. 类型:类(写在启动类上)
  2. 作用:开启微服务多语言支持

18.7、Stream

依赖配置

<!--消费者依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!--生产者依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

application.yml配置(RabbitMQ配置)

spring:
 # 连接RabbitMQ
  rabbitmq:
    host: 192.168.199.109
    port: 5672
    username: test
    password: test
    virtual-host: /test

spring:
  cloud:
    # 重复消费问题
    stream:
      bindings:
        myMessage: # 队列名
          group: customer  # 组名
      # 手动ACK配置
      rabbit:
        bindings:
          myMessage:
            consumer:
              acknowledgeMode: MANUAL
18.7.1、@EnableBinding()
  1. 类型:类(写在启动类上)
  2. 作用:开启rabbitMQ的队列与交换机绑定关系
  3. 取值:一个带有被@Output或者@Input注解修饰的方法的接口类(的数组)
18.7.2、@Input()
  1. 类型:方法
  2. 作用:接收消息
  3. 取值:指定队列名(默认)
18.7.3、@Output()
  1. 类型:方法
  2. 作用:发送消息
  3. 取值:指定队列名(默认)
18.7.4、@SreamListener()
  1. 类型:方法
  2. 作用:监听队列
  3. 取值:监听目标队列名

18.8、Config

依赖配置

<!--Config-Server依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--Config-Client依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

application.yml配置

spring:
  cloud:
    config:
      server:
        git:
          basedir: D:\basedir # 本地仓库地址
          username: zjw_2301211@126.com # 远程仓库用户名
          password: z123123 # 远程仓库密码
          uri: https://gitee.com/zhengdaxian/config-resp.git # 远程仓库地址
18.8.1、@EnableConfigServer
  1. 类型:类(写在启动类上)
  2. 作用:是的当前程序成为一个配置中心,开启了配置中心的服务
18.8.2、@RefreshScope
  1. 类型:类

  2. 作用:开启实现动态更新配置信息(不重启项目)

  3. 注意:需要添加健康检测依赖包:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    

18.9、Sleuth

依赖配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <!--zipkinٖ内部包含了Sleuth-->
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

application.yml配置

logging:
  level:
    org.springframework.web.servlet.DispatcherServlet: DEBUG
18.9.1、

十九、lombok:9个

19.1、@Data

  1. 类型:类
  2. 作用:相当于同时添加@Getter+@Setter+@RequiredArgsConstructor+@ToString+@EqualsAndHashCode。

19.2、@Getter

  1. 类型:属性、类
  2. 作用:为当前类的所有privite修饰的属性添加get方法

19.3、@Setter

  1. 类型:属性、类
  2. 作用:为所修饰的属性或者当前类的所有privite修饰的属性添加set方法

19.4、@RequiredArgsConstructor

  1. 类型:类
  2. 作用:配合@NonNull注解使用,可以根据需求生成一个含有@NonNull注解修饰属性的构造方法
  3. 取值:同19.7、@AllArgsConstructor

19.5、@ToString

  1. 类型:类
  2. 作用:为当前类添加toString方法

19.6、@EqualsAndHashCode

  1. 类型:类
  2. 作用:为当前类添加equals和hashCode方法

19.7、@AllArgsConstructor

  1. 类型:类

  2. 作用:为当前类添加全参构造方法

  3. 取值:

    1. access = AccessLevel.PRIVATE:更改构造函数的访问修饰符,不写的时候默认值为public

    2. staticName = “String”:额外生成一个静态的返回对象的方法(也就是生成一个静态工厂)

      public static Menu getMenu(final Integer id, final String name, final Integer parentId, final String parentName, final String url, final String icon, final String perms, final Integer type, final Integer sort, final List<Menu> children) {
          return new Menu(id, name, parentId, parentName, url, icon, perms, type, sort, children);
      }
      

19.8、@NoArgsConstructor

  1. 类型:类
  2. 作用:为当前类添加无参构造方法
  3. 取值:同19.7、@AllArgsConstructor

19.9、@NonNull

  1. 类型:字段、方法、参数、局部变量、类型使用
  2. 作用:在方法/构造函数主体的开始处插入一个空检查,抛出一个NullPointerException,并将参数名称作为消息。如果放在字段上,任何生成的为该字段赋值的方法也将生成这些空检查。

d>spring-cloud-starter-zipkin

~~~

application.yml配置

logging:
  level:
    org.springframework.web.servlet.DispatcherServlet: DEBUG
18.9.1、

十九、lombok:9个

19.1、@Data

  1. 类型:类
  2. 作用:相当于同时添加@Getter+@Setter+@RequiredArgsConstructor+@ToString+@EqualsAndHashCode。

19.2、@Getter

  1. 类型:属性、类
  2. 作用:为当前类的所有privite修饰的属性添加get方法

19.3、@Setter

  1. 类型:属性、类
  2. 作用:为所修饰的属性或者当前类的所有privite修饰的属性添加set方法

19.4、@RequiredArgsConstructor

  1. 类型:类
  2. 作用:配合@NonNull注解使用,可以根据需求生成一个含有@NonNull注解修饰属性的构造方法
  3. 取值:同19.7、@AllArgsConstructor

19.5、@ToString

  1. 类型:类
  2. 作用:为当前类添加toString方法

19.6、@EqualsAndHashCode

  1. 类型:类
  2. 作用:为当前类添加equals和hashCode方法

19.7、@AllArgsConstructor

  1. 类型:类

  2. 作用:为当前类添加全参构造方法

  3. 取值:

    1. access = AccessLevel.PRIVATE:更改构造函数的访问修饰符,不写的时候默认值为public

    2. staticName = “String”:额外生成一个静态的返回对象的方法(也就是生成一个静态工厂)

      public static Menu getMenu(final Integer id, final String name, final Integer parentId, final String parentName, final String url, final String icon, final String perms, final Integer type, final Integer sort, final List<Menu> children) {
          return new Menu(id, name, parentId, parentName, url, icon, perms, type, sort, children);
      }
      

19.8、@NoArgsConstructor

  1. 类型:类
  2. 作用:为当前类添加无参构造方法
  3. 取值:同19.7、@AllArgsConstructor

19.9、@NonNull

  1. 类型:字段、方法、参数、局部变量、类型使用
  2. 作用:在方法/构造函数主体的开始处插入一个空检查,抛出一个NullPointerException,并将参数名称作为消息。如果放在字段上,任何生成的为该字段赋值的方法也将生成这些空检查。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值