Spring注解
date: 2020-06-18 10:09:45
updated: 2020-07-06 16:45:45-
Spring注解
1. 组件类注解
- @Component :标准一个普通的spring Bean类
- @Repository:标注一个数据访问层DAO组件类
- @Service:标注一个业务逻辑组件类
- @Controller:标注一个控制器(用于和前端交互)组件类
这些都是注解在平时的开发过程中出镜率极高,@Component、@Repository、@Service、@Controller实质上属于同一类注解,都在 org.springframework.stereotype 包下,用法相同,功能相同,区别在于标识组件的类型。@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。如下代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
2. 装配bean时常用的注解
- @Autowired:属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(Bean可用),如果要改变这种默认方式,可以设置其 required 属性为 false
- @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
@Controller
public class HappyController {
@Autowired //默认依赖的ClubDao 对象(Bean)必须存在
//@Autowired(required = false) 改变默认方式
@Qualifier("goodClubService")
private ClubService clubService;
}
@Autowired 注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合 @Qualifier 注解进行限定,指定注入的bean名称。
3. @Component vs @Configuration and @Bean
@Component可以替代 @Configuration注解,但是依旧有区别
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component //看这里!!!
public @interface Configuration {
String value() default "";
Bean注解主要用于方法上,有点类似于工厂方法,当使用了@Bean注解,我们可以连续使用多种定义bean时用到的注解,譬如用@Qualifier注解定义工厂方法的名称,用@Scope注解定义该bean的作用域范围,譬如是singleton还是prototype等
Spring 中新的 Java 配置支持的核心就是@Configuration 注解的类。这些类主要包括 @Bean 注解的方法来为 Spring 的 IoC 容器管理的对象定义实例,配置和初始化逻辑。
使用@Configuration 来注解类表示类可以被 Spring 的 IoC 容器所使用,作为 bean 定义的资源。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
4. web模块常用到的注解
- @Controller :表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将试图呈献给用户。
- @RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!
- 既可以作用在类级别,也可以作用在方法级别。当它定义在类级别时,标明该控制器处理所有的请求都被映射到 /xxx 路径下;定义在方法类型下,可以指定接收的方法类型,@RequestMapping(value="/haha",method=RequestMethod.GET)
- @RequestParam :将请求的参数绑定到方法中的参数上,有required参数,默认情况下,required=true,也就是改参数必须要传。如果改参数可以传可不传,可以配置required=false
public String sayHappy( @RequestParam(value = "name", required = false) String name, @RequestParam(value = "age", required = true) String age) { //age参数必须传 ,name可传可不传 ... }
- @PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET) public String findPet(@PathVariable String dayid, Model mode) { //使用@PathVariable注解绑定 {dayid} 到String dayid }
- @RequestBody : @RequestBody是指方法参数应该被绑定到HTTP请求Body上。
@RequestMapping(value = "/something", method = RequestMethod.PUT) public void handle(@RequestBody String body,@RequestBody User user){ //可以绑定自定义的对象类型 }
- @ResponseBody : @ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。@ResponseBody在输出JSON格式的数据时,会经常用到。
@RequestMapping(value = "/happy", method =RequestMethod.POST) @ResponseBody public String helloWorld() { return "Hello World";//返回String类型 }
- @RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!