spring常用注解

@Configuration和@Bean

  • 该类等价 与XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样。
  • @Configuration注解的类必需使用@ComponentScan扫描.
  • @ComponentScan等价于<context:component-scan base-package=”xx”/>
定义Config类

@Configuration
public class Config {
    public Config() {
        System.out.println("TestConfig容器初始化...");
    }
	//默认情况下bean的名称和方法名称相同,你也可以使用name属性来指定
	//在方法上打上注解 @Bean即表示声明该方法返回的实例是受 Spring 管理的 Bean。
    @Bean(name = "getMyCar")
    public Car getCar() {
        Car c = new Car();
        c.setName("dankun");
        return c;
    }
}
实例化

public void testConfig() {
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        Car car = (Car)context.getBean("car");
        System.out.println(car.getName());
    }
// 输出
// TestConfig容器初始化...
// dankun

@EnableAutoConfiguration

此注释自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找。

不需要在xml中增加对应的包<context:component-scan base-package="xxx" />或者增加注解@ComponentScan({ "xxx"})

@SpringBootApplication

@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。

@Value

通过@Value将外部的值动态注入到Bean中

注入普通字符串
@Value("normal")
private String normal; 

注入java 系统变量
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName; // 注入操作系统属性

@Value("classpath:com/hry/spring/configinject/config.txt")
private Resource resourceFile; // 注入文件资源

@Value("http://www.baidu.com")
private Resource testUrl; // 注入URL资源

将我们配置文件的属性读出来,有**@Value(“${}”)@Value(“#{}”)**两种方式

属性文件config.properties:

book.name=bookName
anotherfile.configinject=placeholder

使用:
@Value("${book.name}")
private String bookName; // 注入第一个配置外部文件属性

@Controller, @Service, @Repository,@Component

  • @controller : 用于标注控制层,相当于struts中的action层
  • @service: 用于标注服务层,主要用来进行业务的逻辑处理
  • @Repository: 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
  • @Component: 泛指各种组件,就是说当我们的类不属于各种归类的时候
  • @Resource(name=”bean名字”)或@Resource(type=”bean的class”)

spring中包扫描功能会将标记有@Controller、@Service、@repository、@Component等注解的类注入到IOC容器中,作为Spring的Bean来管理。

@Repository("userDao")   
public class UserDaoImpl  implements UserDao{   
	........................................   
}   
声明了UserDaoImpl  在Spring容器中叫userDao这个名字。 

@Autowired @Resource @Qualifier

  • 通过 @Autowired的是用来消除 set ,get方法,本质就是替我们实例化

  • @Resource 默认根据名字注入,其次按照类型搜索

  • @Autowired默认是按照资源的类型(class)查找并注入的

  • 笼统来说@Autowired+@Qualifier == @Resource 。

//定义一个 service的实现
package com.example.demo.service.impl;
 
import com.example.demo.service.AnimalService;
import org.springframework.stereotype.Service;
 
@Service
public class CatServiceImpl implements AnimalService {
 
    @Override
    public String oneSay() {
        return "喵喵喵";
    }
}


//定义一个controller,当你采用@Autowired注解或者@Resource 注解,项目都能正常运行访问
ackage com.example.demo.controller;
 
import com.example.demo.service.AnimalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorld {
 
    @Autowired
    AnimalService animalService;
 
    @RequestMapping("/hello")
    public String sayHello(){
        return animalService.oneSay();
    }
}

//如果我在定义一个DogServiceImpl使用@AutoWired时,项目启动报错
//大概意思是说,期望找到对应类型为AnimalService的bean一个,但是找到了两个。
package com.example.demo.service.impl;
 
import com.example.demo.service.AnimalService;
import org.springframework.stereotype.Service;

@Service
public class DogServiceImpl implements AnimalService {
 
    @Override
    public String oneSay() {
        return "汪汪汪";
    }
}

//这时候我们使用@Resource注解

@Resource(name = "dogServiceImpl")
AnimalService animalService;

//或则和@Qualifier注解搭配使用

@Autowired
@Qualifier(value = "dogServiceImpl")
AnimalService animalService;

@Requestbody 和 @RequestParam

  • 一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
  • @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
  • @RequestParam接收的参数是来自requestHeader中,即请求头
post 请求时

@RequestBody --> JSON字符串部分

@RequestParam --> 请求参数部分

get 请求时

GET请求中不可以使用@RequestBody

@RequestParam --> 请求参数部分

参考网页:https://www.cnblogs.com/jpfss/p/10966585.html

@RequestMapping

映射请求路径

你可以将多个请求映射到一个方法上去,只需要添加一个带有请求路径值列表的 @RequestMapping 注解就行了。

@RestController  
@RequestMapping("/home")  
public class IndexController {  
  
    @RequestMapping(value = {  
        "",  
        "/page",  
        "page*",  
        "view/*,**/msg"  
    })  
    String indexMultipleMapping() {  
        return "Hello from index multiple mapping.";  
    }  
} 

如下的这些 URL 都会由 indexMultipleMapping() 来处理: 
localhost:8080/home
localhost:8080/home/
localhost:8080/home/page
localhost:8080/home/pageabc
localhost:8080/home/view/
localhost:8080/home/view/view

@GetMapping 和 @PostMapping

  • @GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
  • @PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
@GetMapping("/example1")
public void example1(Float money, String product){
    System.out.println("product:"+ product);//product:洗洁精
    System.out.println("money:"+ money);//money:123.0
}
//请求url:http://localhost:8888/example1?money=123&product=洗洁精

@PathVariable @RequestHeader,@CookieValue @SessionAttributes, @ModelAttribute

  • @PathVariable是用来获得请求url中的动态参数,即映射 URL 中的占位符到目标方法的参数中
@RequestMapping("/users/{username}")
    @ResponseBody
    public String userProfile(@PathVariable String username){
//        return String.format("user %s", username);
        return "user" + username; 
}
当@Controller处理HTTP请求时,userProfile的参数username会自动设置为URL中对应变量username(同名赋值)的值
  • @RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上
@RequestMapping(“/displayHeaderInfo.do”)  
public void displayHeaderInfo(@RequestHeader(“Accept-Encoding”) String encoding,  
@RequestHeader(“Keep-Alive”) long keepAlive)  {  
	//…  
}  
把request header部分的 Accept-Encoding的值,绑定到参数encoding上了, Keep-Alive header的值绑定到参数keepAlive上。

  • @CookieValue可让处理方法入参,绑定某个Cookie值
@Controller
public class HelloWorldController {
	@RequestMapping("/cookieValueTest")
	public void cookieValueTest(@CookieValue(value="JSESSIONID")String sessionId) {
		System.out.println("通过@CookieValue获得JSESSIONID:"+sessionId);
	}

  • @SessionAttributes用于在会话中存储Model的属性,一般作用在类的级别。

@ResponseBody

@ResponseBody的作用其实是将java对象转为json格式的数据。

@ResponseBody 它的作用简短截说就是指该类中所有的API接口返回的数据,甭管你对应的方法返回Map或是其他Object,它会以Json字符串的形式返回给客户端

@RequestMapping(path = "/hello", method = RequestMethod.POST)
@ResponseBody
public String helloWorld() {
 return "Hello Simon"
}

上面的代码结果是文本 Hello Simon将被写入HTTP的响应流中

@RestController

@RestController = @Controller + @ResponseBody。

@Singleton

只要在类上加上这个注解,就可以实现一个单例类,不需要自己手动编写单例实现类

@PostConstruct 和 @PreDestory

@PostConstruct:在构造方法和init方法(如果有的话)之间得到调用,且只会执行一次。

@PreDestory:注解的方法在destory()方法调用后得到执行。

@Primary

自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。

//有如下一个接口
public interface Singer {
    String sing(String lyrics);
}


@Component // 加注解,让spring识别
public class MetalSinger implements Singer{

    @Override
    public String sing(String lyrics) {
        return "I am singing with DIO voice: "+lyrics;
    }
}

//注意,这里没有注解
public class OperaSinger implements Singer {
    @Override
    public String sing(String lyrics) {
        return "I am singing in Bocelli voice: "+lyrics;
    }
}

//下面就是注入上面的
@Component
public class SingerService {
        private static final Logger logger = LoggerFactory.getLogger(SingerService.class);
    @Autowired
    private Singer singer;
    public String sing(){
        return singer.sing("song lyrics");
    }
 }
 
输出: I am singing with DIO voice: song lyrics. 
原因很简单,就是 OperaSinger 这个类上面根本没有加上注解

但是如果一旦 OperaSinger 这个类加上了@Copmonent 或者 @Service 注解,会报异常,spring 根据类型无法选择到底注入哪一个。这个时候@Primay 可以闪亮登场了。

@Primary
@Component
public class OperaSinger implements Singer{

    @Override
    public String sing(String lyrics) {
        return "I am singing in Bocelli voice: "+lyrics;
    }
}
输出:“I am singing in Bocelli voice: song lyrics”

@Async和@EnableAsync

Spring Boot 入口类上配置 @EnableAsync 注解开启异步处理。

@SpringBootApplication
@EnableAsync
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

创建 AsyncTask类,分别在方法上配置 @Async 注解,将原来的 同步方法 变为 异步方法

@Component
public class AsyncTask extends AbstractTask {
    @Async
    public void doTaskOne() throws Exception {
        super.doTaskOne();
    }

    @Async
    public void doTaskTwo() throws Exception {
        super.doTaskTwo();
    }

    @Async
    public void doTaskThree() throws Exception {
        super.doTaskThree();
    }
}

测试:

@Test
public void testAsyncTasks() throws Exception {
	task.doTaskOne();
	task.doTaskTwo();
	task.doTaskThree();
}
结果是可以异步输出

@Validated 和 @Valid

pring Validation 验证框架对参数的验证机制提供了@Validated,javax提供了@Valid,

  • @Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)
  • @Valid:可以用在方法、构造函数、方法参数和成员属性(field)上
  • @Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制
  • @Valid:没有分组功能
  • 嵌套验证必须用@Valid
限制说明
@Null限制只能为null
@NotNull限制必须不为null
@AssertFalse限制必须为false
@AssertTrue限制必须为true
@DecimalMax(value)限制必须为一个不大于指定值的数字
@DecimalMin(value)限制必须为一个不小于指定值的数字
@Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future限制必须是一个将来的日期
@Max(value)限制必须为一个不大于指定值的数字
@Min(value)限制必须为一个不小于指定值的数字
@Past限制必须是一个过去的日期
@Pattern(value)限制必须符合指定的正则表达式
@Size(max,min)限制字符长度必须在min到max之间
@Past验证注解的元素值(日期类型)比当前时间早
@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
// 用于验证注解是否符合要求,直接加在变量user之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。
@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping
    public User create (@Valid @RequestBody User user) {
        System.out.println(user.getId());
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        user.setId("1");
        return user;
    }
}    

//然后在 User 类中添加验证信息的要求
public class User {
    private String id;  
 
    @NotBlank(message = "密码不能为空")
    private String password;
}

@Scope

@Scope默认是单例模式,即scope="singleton"。

@Target @Retention @Documented @Inherited

这四个都是元注解,元注解是指注解的注解。

  • Target注解的作用是:描述注解的使用范围(即:被修饰的注解可以用在什么地方) 。
  • Reteniton注解的作用是:描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时) 。
  • Documented注解的作用是:描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
  • Inherited注解的作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。

@ControllerAdvice 和 @RestControllerAdvice

  • @ControllerAdvice 功能全局异常处理,全局数据绑定,全局数据预处理
  • @RestControllerAdvice = @ControllerAdvice + @ResponseBody。

@ExceptionHandler:用于全局处理控制器里面的异常。
@InitBinder:用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中。
@ModelAttribute:@ModelAttribute本来的作用是绑定键值对到Model里,此处是让全局的@RequestMapping都能获得在此处设置的键值对。

@DependsOn

@DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中。

下面就是注入student之前要先注入apple

@Configuration
public class MyConfig {
    @Bean
    @DependsOn("apple")
    public Student student(){
        System.out.println("我是student");
        return new Student();
    }
    @Bean
    public Apple apple(){
        System.out.println("我是apple");
        return new Apple();
    }
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×