Loading

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();
    }
}

Spring IoC

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类型
      }
      
posted @ 2020-10-22 11:02  猫熊小才天  阅读(428)  评论(0编辑  收藏  举报