Java學習(10) -- 註解

一、元註解

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

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章