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请求,接口路径

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值