-
Controller注解
2020-07-01 23:22:06java Spring-MVC之Controller注解 1.Controlller简介 Controller是MVC模式中的控制层,主要用来处理浏览器的访问请求,在编写类时在类上加上@Controller注解表明这是一个控制器。 2.Controller中常用的注解 2.1.@...java Spring-MVC之Controller注解
1.Controlller简介
Controller是MVC模式中的控制层,主要用来处理浏览器的访问请求,在编写类时在类上加上@Controller注解表明这是一个控制器。
2.Controller中常用的注解
2.1.@RequestMapping注解
- 可以标明在类上也可以标明在方法上
@RequestMapping(value = "getUser/{name}",method = RequestMethod.POST) @RequestMapping("/getOneInt")
- 该注解有两个常用的属性,value表示访问路径,method表示请求的方法,不指定method时,任何形式的访问请求都可以接受。
2.2 @GetMapping与注解@PostMapping
- @GetMapping(“getUser”)与@RequestMapping(value = “getUser”,method = RequestMethod.GET)是一样的
- @PostMapping(“getUser”)与@RequestMapping(value = “getUser”,method = RequestMethod.POST)是一样的
- 当然还有@DeleteMapping @PatchMapping等注解,对应各种访问方式
2.3 @RequestParam注解
-
@RequestParam是用来标注方法参数的,下面第一种和第二种是一样的,浏览器访问提供的参数名字应该与name一致,但是当该注解设置了value属性时,参数名字应当与设置的值na一样。required表示该参数是否必传,默认是false,当为true时,没有传将报错。
-
注意:用@RequestParam标记参数,浏览器访问的参数是拼接在url之后的。
@GetMapping("getOneInt1") public String getOne1(@RequestParam String name){ return "int,"+name; } @GetMapping("getOneInt1") public String getOne1(String name){ return "int,"+name; } @GetMapping("getOneInt1") public String getOne1(@RequestParam(value = "na",required= "false") String name){ return "int,"+name; }
2.4 @RequestBody注解
- @RequestBody也是用来标注访问参数的,该参数必须是一个自定义的类。只是与 @RequestParam不同的时,该参数是保存在请求体中的json格式,采用url拼接的访问方式是行不通的。json格式的参数名必须与类中的属性保持一致,且类型能转换为类中的属性的类型。
public class Param1 { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } public String getOne1(@RequestBody Param1 param1){ System.out.println(param1); return "int,"+param1.getName(); }
2.5 @PathVariable注解
- @PathVariable也是用来修饰方法参数的,表明该参数是写在浏览器访问url中的。
@RequestMapping(value = "getUser/{name}") public String getUser(@PathVariable String name){ return " hello PathVariable,"+name; }
2.6 @ResponseBody注解
- 正常情况下,Controller返回的是模型视图
- @ResponseBody可声明在类上,也可声明在方法上,表明方法的返回类型为json格式,不再返回视图。
- 注意:当返回类型为实体类时,该类需要 implements Serializable。
@RequestMapping("/getOneInt") @ResponseBody public String getOne2(int n){ return "int,"+n; }
2.7 @RestController注解
- 是一个REST风格的注解,其作用相当于@Controller与@ResponseBody的联合使用,类中所有方法返回的类型均为json格式。使用此注解后,方法上的@ResponseBody注解可以去掉了。
Controller与@ResponseBody的联合使用,类中所有方法返回的类型均为json格式。使用此注解后,方法上的@ResponseBody注解可以去掉了。
注意:浏览器访问时,url中的参数是不分类型的,但是Controller中方法的参数是有类型的,因此必须保证传过来的参数能转换为接受的参数类型。url中的参数可以多于接收的,但必须包含方法的接收参数且名字一致。
-
responseBody注解 controller注解 restController注解
2019-07-11 16:17:42众所周知,在我们开发的过程中,需要将后台查询的数据...而我们在进行spring框架开发的时候,常常又少不了@Controller注解,它的作用就是配合@RequestMapping注解将类中的方法映射成路径 而之后又形成了@RestContr... -
@Controller 注解
2019-08-20 22:04:43org.springframework.stereotype.Controller注解类型用于指示sping类的实例是一个控制器。 @Controller用于标记一个类,使他标记的类就是一个SpingMVC Controller对象,即是一个控制器。Sping使用扫描机制查找程序...org.springframework.stereotype.Controller 注解类型用于指示sping 类的实例是一个控制器。
@Controller 用于标记一个类,使他标记的类就是一个SpingMVC Controller 对象,即是一个控制器。Sping使用扫描机制查找程序中所有基于注解的控制器类。分发处理器会扫描使用注解的类的方法,并检测该方法是否使用了@RequestMapping注解,而使用@RequestMapping 注解的方法才是正真处理请求的处理器。
为了使Spring能找到控制器,使用<context:component-scan/>元素,该功能为:启动扫描包功能,以便注册带有@Controller , @Service ,@repository ,@Component 等注解的类成为Sping的Bean. bask-package属性指定了需要扫描的类包。
-
从Controller注解切入了解spring注解原理
2017-12-12 14:30:50Spring容器框架包org.springframework.stereotype下Controller注解接口源代码如下: @Target({java.lang.annotation.ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @...Spring容器框架包org.springframework.stereotype下Controller注解接口源代码如下:
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller
{
public abstract String value();
}
@Target({java.lang.annotation.ElementType.Type})表是注解使用在类上;
@Retention(RetentionPolicy.RUNTIME)表示注解在程序运行状态下还有效;
@Component表示该类对象以默认单例模式存放在spring容器框架中;
@Documented无关重要,略;
这个注解在程序运行状态下还有效。再看其他的注解@Respository,@Ser vice等,这两个注解的源代码和Controller的源代码一样,除了接口名,都共有一个value抽象函数。
这些所有的注解都会被component注解接口注解,所有“继承”了component注解接口的注解修饰用户的类会被spring中的注解处理器获取(getAnonations()),判定存在component注解后,注解处理器会在spring容器框架中根据用户类的全限定名通过java的反射机制创建这个用户类的对象,并放到spring容器框架中进行管理。
以上这些描述是我基于对注解系统的理解而描述的。
bean创建的几个重要步骤:1) 创建bean实例,也就是bean的实体化,创建过程不仅仅只有java的反射机制,还结合了动态代理的方式
2) 记录创建bean的objectFactory
3) 属性注入
4) 初始化bean
5) 注册disposablebean
Spring bean的生命周期:
说完bean的创建过程,那spring是如何找到这些bean的类文件的呢?
我们在spring的配置文件中,有这样一个标签节点<context:component-scan>,在这个标签的属性base-package中设置要扫描的包。那么可以推断,spring框架中肯定有根据base-package属性扫描得到所有需要管理的bean对象,这个节点中的所有属性会被放入扫描模块对象工具中去,结果就是将所有的bean对象放到spring的容器中去。
注意:spring容器框架额注解都会在running状态下的,所以运行时加载的文件都是已经编译后的class文件.所以使用的是asm技术读取class文件的字节码转化成MetadataReader中的AnnotationMetadataReadingVisitor结构.
标签<context:component-scan>的解析总结如下:
1)根据配置利用asm技术扫描.class文件,并将包含@Component及元注解为@Component的注解@Controller、@Service、@Repository或者还支持Java EE 6的@link javax.annotation.ManagedBean和jsr - 330的 @link javax.inject.Named,如果可用。的bean注册到beanFactory中
2)注册注解后置处理器,主要是处理属性或方法中的注解,包含:
注册@Configuration处理器ConfigurationClassPostProcessor,
注册@Autowired、@Value、@Inject处理器AutowiredAnnotationBeanPostProcessor,
注册@Required处理器RequiredAnnotationBeanPostProcessor、在支持JSR-250条件下注册javax.annotation包下注解处理器CommonAnnotationBeanPostProcessor,包括@PostConstruct、@PreDestroy、@Resource注解等、支持jpa的条件下,注册org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor处理器,处理jpa相关注解注册@EventListener处理器EventListenerMethodProcessor
注解处理器的的实例化和处理器的注册时同步的,实例化后放入到beanFactory的beanProcessors列表中去。
Spring框架的核心就是IOC,通过controller一类注解的bean的实例化过程可以大体总结spring注解的工作原理:
1)利用asm技术扫描class文件,转化成Springbean结构,把符合扫描规则的(主要是是否有相关的注解标注,例如@Component)bean注册到Spring 容器中beanFactory
2)注册处理器,包括注解处理器
4)实例化处理器(包括注解处理器),并将其注册到容器的beanPostProcessors列表中
5)创建bean的过程中,属性注入或者初始化bean时会调用对应的注解处理器进行处理。
举例注解
@Autowired
。对于这个注解,您需要在xml中配置这个注解的处理器AutowiredAnnotationBeanPostProcessor,这个处理器会扫描容器中所有的bean对象,发现bean中拥有@Autowired注解的时候会自动去找到容器中和这个注解修饰类型匹配的bean对象,并注入到对应的地方去。
那为什么AutowiredAnnotationBeanPostProcessor这个处理器对象我怎么在配置文件中没有看到设置呢? 那是因为在spring解析<context:component>标签的时候默认这个注解被隐示配置了,还有其他的注解处理器,如CommonAnnoationBeanPostProcessor。
talk is cheap ,show you the code and the doc,更多的分享内容请关注我的工作号:大白共图社。公众号会有很多的github开源社区拿来即用项目源码以及相关的文章。欢迎关注。
-
java controller注解原理_@Controller、@RestController注解区别详解
2021-02-27 18:45:34@Controller、@RestController...一、@Controller注解@Controller 是Spring框架提供的注解。@Controller标识的类,该类代表控制器类(控制层/表现层)。这里控制层里面的每个方法,都可以去调用@Service标识的类(业务... -
springMv入门 二.controller注解与RequestMapping注解
2019-04-27 10:39:51文章目录controller注解运行结果RequestMapping注解value属性method属性 controller注解 使用controler注解就可以将一个普通的java类变成一个servelet 例如 @Controller//使用controler注解就可以将一个普通的java类... -
SpringMVC之@Controller注解
2018-10-07 11:30:57@Controller注解 Controller注解用于指示Spring类的实例是一个控制器,相对于实现Controller接口变得更加简单。而且实现Controller接口只能处理一个单一的请求,而是用@Controller注解可以支持同时处理多个请求... -
Spring之Controller注解
2018-07-23 22:13:05在使用Spring的过程中,为了避免大量使用Bean注入的Xml配置文件,我们会...使用过程中,在Service层中的实现类头上加@Compopnet注解,在Controller类头加@Controller注解,便完成了配置。例如在Controller中当我们调用... -
【SpringMVC】Controller注解及请求参数详解
2020-08-03 12:49:52本文目录Controller注解Controller 注解用法Controller 接收请求参数通过形参接收请求参数通过实体Bean 接收参数通过HttpServletRequst接收请求参数通过RequestParam注解接收请求参数PathVariable注解接收请求参数 ... -
@ Controller注解(六)
2019-05-19 23:01:17使用@ Controller注解的类不需要继承特定的父类或者实现特定的接口, Controller接口的实现类只能处理一个单一请求动作,而@Controller注解的控制器可以支持同时处理多个请求动作, @Controller用于标记一个类,使用它... -
SpringMVC常用注解:@Controller注解的详细使用方法
2019-08-09 11:04:09引言 Spring从2.5版本之后开始引入...@Controller注解用来做什么的? 以前在编写Controller方法的时候,需要开发者自定义一个Controller类实现Controller接口,实现handleRequest方法返回ModelAndView。并且需要在... -
Controller注解的使用&RequestMapping注解的使用&请求处理方法的返回类型
2020-02-04 22:54:39一.Controller注解的使用 1. org.springframework.stereotype.Controller注解类型用于指示Spring类的实例,是一个控制器 2. 其注解形式为@Controller。 3. 该注解在使用时不需要在实现Controller接口,只需要将@... -
Spring boot扫描不到controller注解
2017-07-20 13:43:51Spring boot扫描不到controller注解 -
@Controller注解和@RestController注解的用法和区别
2017-09-13 10:12:14在Spring中,很多注解在用法上是相似的,也有很多的注解命名上很相似,稍不注意就会让人误用,今天就给大家说一下@Controller注解和@RestController这两个注解的用法和区别。 首先,这两个注解的使用位置上都是用在... -
SpringMVC自动扫描@Controller注解的bean
2018-01-26 19:11:26SpringMVC自动扫描@Controller注解的bean 若要对@Controller注解标注的bean进行自动扫描,必须将放置在dispatcherservlet的配置文件中,若配置在ContextLoaderListener的配置文件... -
springboot中的controller注解没有生效
2018-08-27 23:49:00springboot中的controller注解没有生效 , 启动的Application类没有在controller的父目录或同级目录 转载于:https://www.cnblogs.com/zipon/p/9545597.html -
Controller注解形式做Spring MVC开发
2016-01-08 21:12:20Controller注解形式做Spring MVC开发 -
Eclipse 用了spring @Controller注解失效
2019-04-01 21:58:18最近发现Eclipse用了@Controller注解后eclipse就没了提示, 然后怎么修改也没有用 最后把@Controller注释了, 发现提示又回来了。所以@Controller留到最后写吧。 如果又更好的方法请留言。 ... -
使用STS加入controller注解后编写程序无法自动提示
2019-03-14 16:38:081.加入@Controller注解后编写程序无法自动提示,去掉了@Controller注解后就可以了! 2.解决方案:将@Controller替换为@RestController后,可以完美的提示了! ... -
springMVC自动扫描@controller注解的bean
2017-06-04 10:45:52若要对@controller注解标注的bean进行自动扫描,必须将放置在dispatcherservlet的配置文件中,若配置在ContextLoaderListener的配置文件applicationContext.xml中则不起作用 在spring mvc中@Controller... -
Spring中@Component注解,@Controller注解详解
2015-08-21 10:01:19在使用Spring的过程中,为了避免大量使用Bean注入的Xml配置文件,我们会采用Spring...使用过程中,在Service层中的实现类头上加@Compopnet注解,在Controller类头加@Controller注解,便完成了配置。例如在 Controll -
@Controller注解
2020-03-22 19:10:35} @Controller注解: 用在类上面,表示这个类是一个Controller,比如web controller 该注解可以被当作是@Component注解的一个特殊实现 允许通过类路径扫描自动检测实现类 它通常是和基于注解@RequestMapping的方法... -
@RequestMapping/@Controller注解在哪里得到处理?
2020-01-28 22:20:05@RequestMapping/@Controller注解在实例化RequestMappingHandlerMapping的时候处理。先从ApplicationContext获取所有已注册Bean,然后依次判断是否包含这两个注解,如果是则把RequestMapping标注的method注册到...