SpringBoot常用注解

  • A+
所属分类:Java片段

SpringBoot常用注解

@SpringBootApplication

用于修饰主启动类,@SpringBootApplication被很多注解同时修饰(主要有@SpringBootConfiguration、@EnableAutoConfiguration
、@ComponentScan),使得主启动类在执行main方法时,会自动去扫描与这个类同目录及其下级子目录的所有文件,然后过滤加载我们自定义的Bean,使得spring容器能够进行管理

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.addListeners(new ApplicationPidFileWriter());
        app.run(args);
    }
}

Controller层

@Controller@RestController

用于标记一个类,使用它标记的类就是一个SpringMVC Controller 对象,即一个控制器类。SpringBoot在启动时,会自动扫描主启动类所在路径及其所有子目录下含有@Controller与@RestController注解的类,然后交给spring容器管理,并标识为这是一个控制器类。

然后分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解,而使用了@RequestMapping注解的方法才是真正处理请求的处理器。

而@Controller与@RestController的区别就是,@RestController会将结果数据封装为json对象返回给前端,而@Controller配合视图解析器InternalResourceViewResolver返回的是一个页面@RestController等于@Controller+@ResponseBody

@ResponseBody:作用就是将返回结果封装为json对象,然后返回给前端

@RequestMapping: 作用是用来映射请求,指定控制器可以处理哪些URL请求

@Controller + @ResponseBody

/**
 * 微信公众号:云说Java、Java栈记
 * @author moyun
 * @date 2020/12/01
 */
@Controller
@RequestMapping("/sysUser")
public class SysUserController {

    @ResponseBody
    @RequestMapping("/test")
    public SysUser getData(){
        SysUser moyun = new SysUser()
                .setAccount("moyun")
                .setUserName("墨云")
                .setCreateTime(LocalDateTime.now());
        return moyun;
    }
}

@RestController

/**
 * 微信公众号:云说Java、Java栈记
 * @author moyun
 * @date 2020/12/01
 */
@RestController
@RequestMapping("/sysUser")
public class SysUserController {

    @RequestMapping("/test")
    public SysUser getData(){
        SysUser moyun = new SysUser()
                .setAccount("moyun")
                .setUserName("墨云")
                .setCreateTime(LocalDateTime.now());
        return moyun;
    }
}

以上两种方式在浏览器输入:http://localhost:9000/base/sysUser/test得到的结果一样

{
    "id": null,
    "account": "moyun",
    "password": null,
    "userName": "墨云",
    "tel": null,
    "status": null,
    "createUser": null,
    "createType": null,
    "createTime": "2020-12-09T21:53:36.289",
    "updateTime": null
}

@PathVariable:用于将请求URL中的模板变量映射到功能处理方法的参数上

/**
 * 微信公众号:云说Java、Java栈记
 * @author moyun
 * @date 2020/12/01
 */
@RestController
@RequestMapping("/sysUser")
public class SysUserController {

    @RequestMapping("/test/{userId}")
    public SysUser getData(@PathVariable Long userId){
        SysUser moyun = new SysUser()
                .setId(userId)
                .setAccount("moyun")
                .setUserName("墨云")
                .setCreateTime(LocalDateTime.now());
        return moyun;
    }
}

在浏览器输入:http://localhost:9000/base/sysUser/test/1000,会得到如下数据,将会把url中的1000,映射为userId的值,此时的userId值不为空

{
    "id": 1000,
    "account": "moyun",
    "password": null,
    "userName": "墨云",
    "tel": null,
    "status": null,
    "createUser": null,
    "createType": null,
    "createTime": "2020-12-09T22:06:07.182",
    "updateTime": null
}

@RequestParam:获取静态的URL请求入参,请求路径中用&拼接参数

@RequestMapping("/test")
public SysUser getData(@RequestParam Long userId,@RequestParam String userName){
    SysUser moyun = new SysUser()
            .setId(userId)
            .setAccount("moyun")
            .setUserName(userName)
            .setCreateTime(LocalDateTime.now());
    return moyun;
}

在浏览器输入:http://localhost:9000/base/sysUser/test时,会报400错误。出现这个请求无效说明请求,没有进入后台服务器里,造成的原因就是前端传参有问题

需要在浏览器输入:http://localhost:9000/base/sysUser/test?userId=1000&userName=墨云,得到正确的请求数据

{
    "id": 1000,
    "account": "moyun",
    "password": null,
    "userName": "墨云",
    "tel": null,
    "status": null,
    "createUser": null,
    "createType": null,
    "createTime": "2020-12-09T22:11:02.213",
    "updateTime": null
}

@RequetBody注解:从请求body中获取数据

@RequestMapping("/test")
public SysUser getData(@RequestBody SysUser user){
    user.setCreateTime(LocalDateTime.now());
    return user;
}

此种方式仅有前端通过将参数放到请求body中,才能正常接收,否则也会报400错误

以下用postman测试,必须将json的key与接收对象SysUser的属性字段一一对应,才能接收到完整数据,否则接收不到数据,如json中存在名为feild的key,但是SysUser中并没有feild属性,则无法接收

SpringBoot常用注解

@CookieValue:用于获取请求的Cookie值

@RequestMapping("/getUser")
public String getUser(@CookieValue("moyun")String sessionId){
    return sessionId;
}

@ControllerAdvice:全局异常处理,作用于类上

@ExceptionHandler ( Exception.class )::用在方法上面表示遇到这个异常就执行以下方法。

Service层

@Service:作用于类上,用于将该类标识为业务层组件,并交给spring容器管理

其他

@Autowired@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上

@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false

如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

@Autowired
@Qualifier("userService")
private SysUserService userService;

@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定

如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配

当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="userService")
private SysUserService userService;

推荐使用:@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。

@Component

是一个元注解,意思是可以注解其他类(或注解,例如@Controller与@Service上也有此注解,是对@Component注解的细化)的注解,当一个类比较模糊,不知道该将其归于哪一层(控制层、业务层、持久层)时,用这个注解就能将这个类交给spring容器进行管理

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
    String value() default "";
}

@Configuration@Bean

Spring3.0之前要使用Spring必须要有xml配置文件,而Spring3.0之后注解登上舞台,通过注解@Configuration和@Bean可以完全搞定

Spring 3.0引入了注解,配置文件的载体就从xml文件转换为了Java类,Java类就是一个普通的类,除了命名建议以“**Config”结尾方便识别外,Spring对其有一定的约定条件。

  • 配置类不能是 final 类(没法动态代理)。
  • 配置类必须是非本地的(即不能将配置类定义在其他类的方法内部,不能是private)。
  • 配置类必须有一个无参构造函数。

符合上述条件的类,就可以使用@Configuration来进行注解,表示这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解在该类的方法上,AnnotationConfigApplicationContext将配置类中标注了@Bean的方法的返回值识别为Spring Bean,并注册到容器中,归入IoC容器管理。

@Configuration的作用等价于XML配置中的标签,@Bean的作用等价于XML配置中的标签。下面代码完成了一个简单的示例。

@Configuration
public class DataSourceConfig {
    @Bean
    public MysqlDataSource mysqlDataSource() {
        return new MysqlDataSource();
    }

    @Bean(name = "oracleDataSource")
    public OracleDataSource oracleDataSource() {
        return new OracleDataSource();
    }
}

Spring在解析该类时,会识别出标注@Bean的所有方法,执行并将方法的返回值(MysqlDataSource和OracleDataSource对象)注册到IoC容器中。默认情况下,方法名即为Bean的名字。与以上配置等价的XML配置如下:

<bean id="mysqlDataSource" class="**.MysqlDataSource"/> 
<bean id="oracleDataSource" class="**.OracleDataSource"/>

而对于@Configuration注解的定义如下,也有@Conponent注解修饰,因此本质上来说@Configuration也是一个@Component

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    String value() default "";
}

@Bean的定义如下,可作用于方法及注解上

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
    @AliasFor("name")
    String[] value() default {};

    @AliasFor("value")
    String[] name() default {};

    /** @deprecated */
    @Deprecated
    Autowire autowire() default Autowire.NO;

    boolean autowireCandidate() default true;

    String initMethod() default "";

    String destroyMethod() default "(inferred)";
}
  • name :指定一个或者多个Bean的名字。等价于XML配置中的name属性,示例中的@Bean(name = “oracleDataSource”)。
  • initMethod:容器在初始化完Bean之后,会调用该属性指定的方法。等价于XML配置中的init-method属性。
  • destroyMethod:该属性与initMethod功能相似,在容器销毁Bean之前,会调用该属性指定的方法。等价于XML配置中的destroy-method属性。
  • autowire:指定Bean属性的自动装配策略,取值是Autowire类型的三个静态属性。Autowire.BY_NAME,Autowire.BY_TYPE,Autowire.NO。与XML配置中的autowire属性的取值相比,少了constructor,因为 constructor在这里已经没有意义了。

@Bean默认是单例模式,并且没有提供指定作用域的属性,可以通过与@Scope的配合使用来实现该功能。

PDF文档下载
链接:https://pan.baidu.com/s/1eG-hIVOi-dD2RdJ2lmqjDw
提取码:cz2j

  • 云说Java
  • 关注公众号获取更多资源
  • weinxin
  • Java栈记
  • 关注公众号获取更多资源
  • weinxin
墨云

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: