一、元注解
元注解是指注解的注解,包括@Retention @Target @Document @Inherited四种。
@Target:
表示该注解可以用于什么地方,可能的ElementType参数有:CONSTRUCTOR
:构造器的声明FIELD
:域声明(包括enum
实例)LOCAL_VARIABLE
:局部变量声明METHOD
:方法声明PACKAGE
:包声明PARAMETER
:参数声明TYPE
:类、接口(包括注解类型)或enum
声明
@Retention
表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:SOURCE
:注解将被编译器丢弃CLASS
:注解在class文件中可用,但会被VM丢弃RUNTIME
:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息
@Document
将注解包含在Javadoc中
@Inherited
允许子类继承父类中的注解
二、自定义注解
下面是自定义controller的注解,可以将url自动注册为权限表;
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface MenuO {
/** 菜单名称 */
String name();
/** 菜单Code */
String code();
/** 父菜单Code */
String parent() default "--";
/** 事件类型link,affiliated */
String clickType();
/** 排序 */
int order() default 999;
/** 图标 */
String iconCls() default "default";
/** 是否在列表显示0显示,1隐藏 */
int isShow() default 0;
}
@RequestMapping("admin/busBanner/manager")
@MenuO(name = "广告管理", code = "busBanner-view", parent = "bus-plan-manager", clickType = StaticConfig.MENU_LINK, order = 1)
public String managerView(HttpServletRequest request, Model model) {
return "admin/bus/busBanner";
}
public class MenuInitProcessor implements BeanPostProcessor {
@Autowired
private SysMenuBizService sysMenuBizService;
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
// 如果注册的bean不属于Controller,直接跳出
if (!bean.getClass().isAnnotationPresent(Controller.class)) {
return bean;
}
// 得到父地址映射
String urlMapping = null;
if (bean.getClass().isAnnotationPresent(RequestMapping.class)) {
RequestMapping classMapping = bean.getClass().getAnnotation(
RequestMapping.class);
if (classMapping.value().length > 0) {
urlMapping = classMapping.value()[0];
}
}
// 得到Controller下的所有方法,判断是否有注册信息
Method[] methods = bean.getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(MenuO.class)) {
// 开始注册信息
MenuO menu = method.getAnnotation(MenuO.class);
// 得到子地址映射
if (method.isAnnotationPresent(RequestMapping.class)) {
RequestMapping methodMapping = method
.getAnnotation(RequestMapping.class);
SysMenu sysMenu = null;
if (urlMapping != null) {
sysMenu = new SysMenu(menu);
sysMenu.setMenuAdminUrl(urlMapping + "/"
+ methodMapping.value()[0]);
} else {
sysMenu = new SysMenu(menu);
sysMenu.setMenuAdminUrl(methodMapping.value()[0]);
}
this.sysMenuBizService.localMenu(sysMenu);
}
}
}
return bean;
}
}
三、java中常用注解使用
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请求,接口路径
四、注解与反射的结合
根据上面的代码可以看到,我们可以通过反射获得注解信息并使用
// 开始注册信息
MenuO menu = method.getAnnotation(MenuO.class);
五、Spring 常用注解
@Repository: 用于标注数据访问组件,即DAO组件
@Service: 用于标注业务层组件
@Transactional: 声明这service所有方法都需要事务管理。每一个业务方法开始时都会打开一个事务
@Controller: 控制层
@Component: 把该中立的类交给spring管理
@Autowired: 自动装配,将bean容器里的值自动注入到bean
@Path: 处理REST请求,接口路径