SpringMVC 類內部的RequestMapping注解能否被繼承?


首先注意標題,說的是內部的注解

結論是:

不能,但是子類卻可以享有父類該注解帶來的效果。

 

看了一下這個:http://elf8848.iteye.com/blog/1621392

自己也試了一下,發現子類如果覆蓋父類的方法,確實不能繼承被覆蓋方法的注解。

 

但是試了一下spring的注解,即便該注解沒有被繼承到子類上,子類同樣能享有這個注解帶來的效果,這可能和spring的注解掃描和bean加載機制有關,有時間看看源碼吧,這里先記一下。

以下是實驗時寫的代碼:

 

父類:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.util.UUID;

@RestController
@ConditionalOnMissingBean(name = "extDemoController")
public class DemoController {
    @PostConstruct
    public void init(){
        System.out.println("---------------DemoController init---------------");
    }
    @Autowired
    protected OneBean oneBean;
    @RequestMapping("/random")
    public String random(){
        return UUID.randomUUID().toString();
    }
}

 

子類:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@RestController
public class ExtDemoController extends DemoController {

    public void init(){
        System.out.println("---------------ExtDemoController init---------------");
    }

    public String random(){
        System.out.println(oneBean.hello());
        return "random from ExtDemoController";
    }

}

 

測試代碼1:

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;

import java.lang.reflect.Method;

public class CustomTest {
    public static void main(String[] args) throws NoSuchMethodException {
        Class<ExtDemoController> clazz = ExtDemoController.class;
        Method method = clazz.getMethod("random",new Class[]{});
        if(method.isAnnotationPresent(RequestMapping.class)){
            RequestMapping oneAnnotation = method.getAnnotation(RequestMapping.class);
            System.out.println(oneAnnotation.name());
        }
    }
}

 

測試代碼2:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
//@EnableConfigurationProperties(FirstConfig.class)
public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
        for(String name:ctx.getBeanDefinitionNames()){
            System.out.println(name);
        }
    }
}

 

測試說明:

這是一個普通的springboot項目,maven里只引入了

spring-boot-starter-web

項目可以用 http://start.spring.io/ 生成。

 

測試步驟:

執行測試代碼1,發現注解不能被子類繼承。

執行測試代碼2,發現子類雖未繼承父類內部的三種注解,但是卻完全可以享有它們的功能。即訪問  /random  執行的是子類內的邏輯。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM