一、元註解
元註解是指註解的註解,包括@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請求,接口路徑