在这里插入图片描述

@Service:业务层并且便于开发和维护

@Controller、@Service、@Repository都一样只是为了区分更好的分辨并且便于开发和维护 ,但是controller层只能用@controller

@Repository:Dao层

@Controller、@Service、@Repository都一样只是为了区分更好的分辨并且便于开发和维护,但是controller层只能用@controller

@Controller:控制层

@Controller、@Service、@Repository都可以称为@Component。
@Controller定义一个Controller控制器

在Spring MVC 中,控制器Controller 负责处理由DispatcherServlet
分发的请求,前端调用接口请求最先到达DispatcherServlet,DispatcherServlet
根据请求路径的url找对应的Controller控制器类 @Controller的作用:
此时就是把这个类定义为控制器,DispatcherServlet 分发请求到这些控制器类中,找对应URL的控制器
如果没有@Controller就不是控制器,请求就不会扫描这个类,就识别不到更不用说调用了 DispatcherServlet
把用户请求的数据经过业务处理层处理之后封装成一个Model,然后再把该Model 返回给对应的View进行展示

DispatcherServlet (分发) => Controller(调用) => Service(业务处理层) => Model(返回数据) => Controller(return) => View (前端展示)

在Spring MVC 中提供了一个非常简便的定义Controller控制器 的方法,你无需继承特定的类或实现特定的接口
只需使用@Controller标记一个类是Controller,这样的Controller 就能被外界访问到。
仅仅使用@Controller是不能算一个完整的控制器类的 @Controller就只是一个干干净净的注解,不会出现类似URL的地址
完整的控制器要配合@RequestMapping("/root")这样的注解才完整,才能被请求的那个URL精确找到类所在位置

在这里插入图片描述

@Controller
@RequestMapping("/action")
public class TestController {}

@Configuration

声明当前类为配置类;
相当于xml

@After 在方法执行之后执行(方法上)

@After
@Before
这两个方法一般用于aop或者不改变源码插入一些东西。比如自己写的日志类

@Before 在方法执行之前执行(方法上)

@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@Controller
@RequestMapping("/action")
public class TestController {
@RequestMapping("/test")
public string test(
{
return index;
}

访问路径就会变成:localhost:8080/action/test
前端请求URL,被哪一个@RequestMapping匹配上了
这个@RequestMapping注解对应的类就会被用来处理这个请求
RequestMapping注解常用的是value、method

value: 指定请求的实际地址,默认一个可以不写value;

设置value的值和path的值具有同等的作用

@RequestMapping("/test")
@RequestMapping(path = "/test")
@RequestMapping(value = {"/hello", "/world", "/test"})
@RequestMapping("/action/{name}")
public String hello(@PathVariable("name") String username) {
}

method: 指定请求的method类型, GET、POST、PUT、DELETE等;

@RequestMapping(value="/action", method=RequestMethod.GET)
@RequestMapping(value="/action", method=RequestMethod.POST)
@ResponseBody//表示返回的值为字符串,不经过视图解析器
public User add(User user){
	
}

@ResponseBody表示返回的值为字符串,不经过视图解析器 //如果不加ResponseBody只加了produces就会出现错误,因为不加ResponseBody的json返回值会经过视图解析器 导致的结果就是:它以为你返回的这个数据是一个,以这个返回值为名称的html等前端页面文件,就会加载不了

@Slf4j

@Slf4j是用作日志输出的,一般会在项目每个类的开头加入该注解

如果不写下面这段代码,并且想用log
就可以用@Slf4来代替;这样就省去这段很长的代码。

private final Logger logger = LoggerFactory.getLogger(当前类名.class);
@Slf4j
public class QueryBillController {
    public String getBills() {
        log.info("hello,gql");
    }

配合依赖

<dependency>
	 <groupId>org.projectlombok</groupId>
	 <artifactId>lombok</artifactId>
	 <version>1.16.12</version>
</dependency>

一个简单的log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <PatternLayout charset="UTF-8" pattern="%d %highlight{[%-5p]} %style{%c}{cyan}  : %m%n"/>
        </Console>
        <RollingFile name="File" fileName="log/dz/error.log"
                     filePattern="log/dz/%d{yyyy-MM-dd}-error-%i.log">
            <Filters>
                <ThresholdFilter level="ERROR"></ThresholdFilter>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="100M"></SizeBasedTriggeringPolicy>
            </Policies>
            <PatternLayout pattern="%d [%-5p] %c - %m%n"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <root level="info">
            <AppenderRef ref="CONSOLE"/>
            <AppenderRef ref="File"/>
        </root>
    </Loggers>
</configuration>

方法位置

@ResponseBody

@ResponseBody是作用于返回数据的时候,不是指请求开始的时候一定要json的参数
@ResponseBody的作用其实是将java对象转为json格式的数据。

@responseBody注解的作用: 将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
注意:在使用此注解之后不会再走视图处理器(不会去调用打开任何一个html文件),而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
注意:在使用@RequestMapping后,返回值通常解析为跳转路径(打开新的html文件),但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中(返回数据,而不是返回新的页面)。

@ResponseBody
public RModel generateFile(){}

这个是@ResponseBody (控制返回数据),有一个相似的叫@RequestBody是控制请求时的参数的

@Bean
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。

@Service
public class BeanTest {
    /*
       默认在不指定的时候这个bean的名字就是 getBean
       如果需要指定一下名字就可以
       @Bean("beanlalal")
    */
    @Bean
    public BeanTest getBean(){
        BeanTest bean = new  BeanTest();
        System.out.println("调用方法:"+bean);
        return bean;
    }
}
public class Main {
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
        Object bean1 = context.getBean("getBean");
        System.out.println(bean1);
        Object bean2 = context.getBean("getBean");
        System.out.println(bean2);
    }
}

变量位置

@Autowired

@Autowired可以作用在变量、setter方法、构造函数上;
有个属性为required,可以配置为false;
@Autowired是Spring 提供的,默认按照byType 注入,也就是bean的类型的来传入
如果需要指定名字,那么需要使@Qualifier(“这是bean的名字”)

@Qualifier

可能会有这样一种情况,当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注解和 @Autowired 注解通过指定哪一个真正的 bean 将会被装配来消除混乱。

@Resource

@Resource有两个中重要的属性:name和type ,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用 byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序

(1). 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常;
(2). 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常;
(3). 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常;
(4). 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

@RequestBody

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。

注:当同时使用@RequestParam()和@RequestBody时,@RequestParam()指定的参数可以是普通元素、
数组、集合、对象等等(即:当,@RequestBody 与@RequestParam()可以同时使用时,原SpringMVC接收
参数的机制不变,只不过RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value
里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。
即:如果参数时放在请求体中,application/json传入后台的话,那么后台要用@RequestBody才能接收到;
如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或
则形参前 什么也不写也能接收。

如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通 过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,那么请求会出错,报400

`如果参数前不写@RequestParam(xxx)的话,那么就前端可以有可以没有对应的xxx名字才行,如果有xxx名
的话,那么就会自动匹配;没有的话,请求也能正确发送。

@RequestParam

@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

请不要用@RequestParam去接受json格式的数据 想用json的数据直接用@RequestBody

如果想同时用json和普通的参数: //URL用这样的请求格式:http://localhost:8080/test?name=123 URL中拼接普通的参数 => 请求体中用contentType:“application/json” //传json数据

@RequestParam(
value=”参数名”,required=true/false,defaultValue=””
)

value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
@RequestMapping("test")
public ModelAndView test1(@RequestParam("name")String name){}

http://localhost:8080/test?name=123
@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。

不要拿@RequestParam注解去想着接受json的对象,他就是用来接受普通的参数的,想接受json可以使用@RequestBody注解

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐