@Target
用于设定注解范围,通过ElementType来指定注解适用范围的枚举集合;
ElementType取值 | 注解适用范围 |
---|---|
METHOD | 可用于描述方法上 |
TYPE | 用于描述类、接口(包括注解类型)或enum声明上 |
ANNOTATION-TYPE | 用于注解类型上(被@interface修饰的类型) |
CONSTRUCTOR | 用于描述构造器 |
FIELD | 用于描述域(作用在属性上) |
LOCAL_VARIABLE | 用于描述局部变量 |
PACKAGE | 用于记录java文件的package信息 |
PARAMETER | 可用于参数上 |
@Retention
用于定义被它所注解的注解保留多久,内部有一个枚举类型的属性RetentionPolicy
public enum RetentionPolicy {
/**
* 注解保留在源文件,当 Java 文件编译成 class 文件的时候,注解将被编译器废弃
*/
SOURCE,
/**
* 注解被保留到 class 文件,但在 jvm 加载 class 文件的是时候被废弃(默认属性)
*/
CLASS,
/**
* 注解将被记录在由编译器的类文件,并在运行时由虚拟机保留
*/
RUNTIME
}
如果需要在运行时动态获取注解信息,只能用RUNTIME
如果要在编译时进行一些预处理操作,就用CLASS
如果仅仅做一些检查的操作,则用SOURCE
@interface
自定义注解自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
在定义注解时,不能继承其他的注解或接口。
使用@interface来声明一个注解,
- 每一个方法实际上是声明了一个配置参数,
- 方法的名称就是参数的名称
- 返回值类型就是参数的类型,(返回值类型只能是基本类型、Class、String、enum)
- 可以通过default来声明参数的默认值
@Document
Documented注解表明这个注解是由 javadoc记录的,在默认情况下也有类似的记录工具。
如果一个类型声明被注解了文档化,它的注解成为公共API的一部分。
@Controller
在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面
若返回json等内容到页面,则需要加@ResponseBody注解
@RestController
相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,
但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
@RequestMapping
来映射请求,也就是通过它来指定控制器可以处理哪些URL请求
@AliasFor
经常会发现很多注解的不同属性起着相同的作用,比如@RequestMapping的value属性和path属性,这就需要做一些基本的限制,
比如value和path的值不能冲突,比如任意设置value或者设置path属性的值,都能够通过另一个属性来获取值等等。
##1> 可以定义一个注解中的两个属性互为别名
public @interface ComponentScan {
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
}
##2>跨注解的属性别名
@Component
public @interface Service {
@AliasFor(annotation = Component.class)
String value() default "";
}
@Service#value为@Component#value的别名,@Service#value的值可以映射到@Component#value。
(这里我们将@Service,@Component看做一种特殊的继承关系,@Component是父注解,@Service是子注解,
@Service#value覆盖@Component#value)
@Component
把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
@Service
用于标注业务逻辑层组件
@Controller
用于标注控制层组件
@Repository
用于标注数据访问组件,即Dao组件
@Aspect
把当前类标识为一个切面供容器读取
@Pointcut
每个Pointcut的定义包括2个部分,表达式+方法签名
方法签名是public void型(如‘1>’),(也可以有返回类型如‘2>’)可以将Pointcut中的方法看作是一个被Advice引用的助记符,
因为表达式不直观,所以通过方法签名的方式为此表达式命名。Pointcut中的方法只需要方法签名,不需要具体实现。
<--
@Pointcut("execution(* com.ahaxt.base.controller.*.*(..)))
public void pointcutControl() {
}
@Before(value = " pointcutControl()")
-->
等价于
<--
@Before("execution(* com.ahaxt.base.controller.*.*(..)))
-->
@Around 环绕增强
@AfterReturning 后置增强,目标方法正常退出时执行
@Before 标识一个前置增强方法,目标方法执行前实施增强
@AfterThrowing 异常抛出增强
@After final增强,不管是抛出异常或者正常退出都会执行
1> @Pointcut("execution(* com.ahaxt.base.controller.*.*(..)))
public void pointcutControl() {
}
@Before(value = " pointcutControl()")
public void before(JoinPoint joinPoint) {...}
2> @Around("execution(* com.abc.service.*.many*(..))")
public Object process(ProceedingJoinPoint point) throws Throwable {
System.out.println("@Around:执行目标方法之前...");
//访问目标方法的参数:
Object[] args = point.getArgs();
if (args != null && args.length > 0 && args[0].getClass() == String.class) {
args[0] = "改变后的参数1";
}
//用改变后的参数执行目标方法
Object returnValue = point.proceed(args);
System.out.println("@Around:执行目标方法之后...");
System.out.println("@Around:被 织入的目标对象为:" + point.getTarget());
return "原返回值:" + returnValue + ",这是返回结果的后缀";
}
@Resource
(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,
如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。
但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Autowired
Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,
如果要允许null值,可以设置它的required属性为false,
如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,
如下:
@Autowired () @Qualifier ( "baseDao" )
private BaseDao baseDao;
@Deprecated
表示此方法或类不再建议使用,调用时也会出现删除线,但并代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用
(因为在一个项目中,工程比较大,代码比较多,而在后续开发过程中,可能之前的某个方法实现的并不是很合理,
这个时候就要新加一个方法,而之前的方法又不能随便删除,因为可能在别的地方有调用它,所以加上这个注解,就方便以后开发人员的方法调用了)
@Transactional
声明式事务管理的回滚机制
如果你在方法中有try{}catch(Exception e){}
处理,那么try里面的代码块就脱离了事务的管理,若要事务生效需要在catch中throw new RuntimeException ("xxxxxx");
在@Transactional注解的方法中,再调用本类中的其他方法method2时,那么method2方法上的@Transactional注解是不!会!生!效!的!
目标对象内部的自我调用,也就是通过this.指向的目标对象将不会执行方法的增强
JVM的动态代理是基于接口实现的,通过代理类将目标方法进行增强,所以@Transactional注解的方法必须是公共方法,就是必须是public修饰符!!!
@Configuration
用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@CrossOrigin(allowCredentials = “true”, allowedHeaders = “*”)
出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。例如,当你在一个标签中检查你的银行账户时,你可以在另一个选项卡上拥有EVILL网站。
来自EVILL的脚本不能够对你的银行API做出Ajax请求(从你的帐户中取出钱!)使用您的凭据。
allowCredentials="true"其实是配置了CrossOrigin中的DEFAULT_ALLOWED_HEADERS:允许跨域传输所有的header参数,将用于使用token放入header域做session共享的跨域请求
@MappedSuperclass
(https://www.cnblogs.com/zqyanywn/p/7753596.html)
将实体类的多个属性分别封装到不同的非实体类中,例如,数据库表中都需要id来表示编号,id是这些映射实体类的通用的属性,交给jpa统一生成主键id编号,那么使用一个父类来封装这些通用属性,并用@MappedSuperclas标识。
@PersistenceContext
往DAO类中注入EntityManage,一个保存实体类状态的数据结构,针对不同实体类状态
https://www.cnblogs.com/siwuxie095/p/7284867.html
,做出相应的反应
@ExceptionHandler(Exception.class)
全局异常捕捉处理