springboot2.X手册:36个注解详细解析,一目了然

1.@Component

作用及范围:把对象加载到spring容器中,最基础的存在,很多的注解都是继承它的,只有一个属性值,默认值是“”,

例子或源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {

 String value() default "";

}

2.@Service

作用及范围:一般用于service层的注解,继承了Component组件,本质上一样,方便做业务范围区分而已。

例子或源码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {

 @AliasFor(annotation = Component.class)
 String value() default "";

}

3.@Repository

作用及范围:作用于dao层的注解,很多经常用JPA的同学都清楚这个东西,与Service本质上一样,业务领域上区别而已

例子或源码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {

 @AliasFor(annotation = Component.class)
 String value() default "";

}

4.@Controller

作用及范围:作用在控制器上的注解,与Service一样,业务领域区分

例子或源码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

 @AliasFor(annotation = Component.class)
 String value() default "";

}

5.@Autowired

作用及范围:它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,其实就是获取容器中的对象

注意事项:

在使用@Autowired时,首先在容器中查询对应类型的bean

如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据

如果查询的结果不止一个,那么@Autowired会根据名称来查找。

如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false

例子或源码:


@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

 boolean required() default true;

}

6.@Inject

作用及范围:它是JSR330 (Dependency Injection for Java)中的规范,需要导入javax.inject.Inject;实现注入,根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Named,可以作用在变量、setter方法、构造函数上。很少用

例子或源码:

@Inject
public Message(Header header, Content content)
{
    this.headr = header;
    this.content = content;
}
public class Messager
{
    @Inject
    private Message message;
}

7.@Resource

作用及范围:它是JSR250规范的实现,也是需要导入javax.annotation实现注入,根据名称进行自动装配的,一般会指定一个name属性,可以作用在变量、setter方法上。

例子或源码:

@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
@Repeatable(Resources.class)
public @interface Resource {

    String name() default "";
  
    String lookup() default "";

    Class type() default java.lang.Object.class;

    enum AuthenticationType {
     CONTAINER,
     APPLICATION
    }

    AuthenticationType authenticationType() default AuthenticationType.CONTAINER;

    boolean shareable() default true;

    String mappedName() default "";

    String description() default "";
}

8.@Configuration

作用及范围:从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,同样AliasFor最原始的注解Component

例子或源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {

 @AliasFor(annotation = Component.class)
 String value() default "";

 boolean proxyBeanMethods() default true;

}

9.@Bean

作用及范围:作用于方法上,产生一个对象,然后这个对象交给Spring管理,在进行初始化的过程中,只会产生并调用一次,如果容器管理一个或者多个bean,这些bean都需要在Configuration注解下进行创建,在一个方法上使用Bean注解就表明这个方法需要交给Spring进行管理。

例子或源码:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {

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

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

 Autowire autowire() default Autowire.NO;

 String initMethod() default "";

 String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;

}

10.@ComponentScan

作用及范围:扫描当前类下面的所有对象,为什么说Component是最基础的东西,就是要给这个注解扫描,非常巧妙的设计,可以扫描多个包。

例子或源码:

@ComponentScan(“com.abc.aaa”)
@SpringBootApplication
public class SpringbootApplication {
@ComponentScan({"com.abc.bbb","com.abc.aaa"})
@SpringBootApplication
public class SpringbootApplication {

11.@WishlyConfiguration

作用及范围:这个是Configuration与ComponentScan的组合注解,可以替代这两个注解,目前非常少用。

例子或源码:没用过

12.@Aspect

作用及范围:切面注解,切面编程经常用到的,可以做日志

例子或源码:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Aspect {

    public String value() default "";
}

13.@After

作用及范围:配置Aspect做切面使用,在方法执行之后执行(方法上)

例子或源码:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface After {

    String value();
    
    String argNames() default "";
}

14.@Before

作用及范围:配置Aspect做切面使用,在方法执行之前执行(方法上)

例子或源码:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Before {

    String value();
    
    String argNames() default "";

}

15.@Around

作用及范围:配置Aspect做切面使用,在方法执行之前与之后执行(方法上)

例子或源码:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Around {

    String value();
    
    String argNames() default "";

}

16.@PointCut

作用及范围:配置Aspect做切面使用,声明切点

例子或源码:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Pointcut {
  
    String value() default "";
    
    String argNames() default "";
}

17.@Scope

作用及范围:Singleton (单例,一个Spring容器中只有一个bean实例,默认模式),

Protetype (每次调用新建一个bean),

Request (web项目中,给每个http request新建一个bean),

Session (web项目中,给每个http session新建一个bean),

GlobalSession(给每一个 global http session新建一个Bean实例)

例子或源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {

 @AliasFor("scopeName")
 String value() default "";

 @AliasFor("value")
 String scopeName() default "";

 ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;

}

18.@Value

作用及范围:将外部的值动态注入到Bean中,使用的情况有:

  • 注入普通字符串

  • 注入操作系统属性

  • 注入表达式结果

  • 注入其他Bean属性:注入beanInject对象的属性another

  • 注入文件资源

  • 注入URL资源

例子或源码:

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

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

    @Value("#{ T(java.lang.Math).random() * 100.0 }")
    private double randomNumber; //注入表达式结果

    @Value("#{beanInject.another}")
    private String fromAnotherBean; // 注入其他Bean属性:注入beanInject对象的属性another,类具体定义见下面

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

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

19.@PropertySource

作用及范围:加载指定的配置文件

例子或源码:

@PropertySource(value = {"classpath:test.properties"})
@Component
@ConfigurationProperties(prefix = "test")
public class Test {
    private Integer id;
    private String lastName;
}

20.@Profile

作用及范围:根据不同环境加载bean对象

例子或源码:

@PropertySource("classpath:/user.properties")
@Configuration
public class MainConfigOfProfile implements EmbeddedValueResolverAware{
 
 @Profile("test")
 @Bean("testUser")
 public User testUser()  {
  User a =new User();
    return a;
 }
 
 @Profile("dev")
 @Bean("devUser")
 public User devUser()  {
  User a =new User();
    return a;
 }
 
}

21.@Conditional

作用及范围:是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean

例子或源码:

@Configuration
public class BeanConfig {
 
    //只有一个类时,大括号可以省略
    //如果WindowsCondition的实现方法返回true,则注入这个bean    
    @Conditional({WindowsCondition.class})
    @Bean(name = "bill")
    public Window window(){
        return new Window();
    }
 
    //如果LinuxCondition的实现方法返回true,则注入这个bean
    @Conditional({LinuxCondition.class})
    @Bean("linux")
    public Linex linux(){
        return new Linex();
    }
}

22.@EnableAsync

作用及范围:启动异步,与Async配合使用

例子或源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {

 Class annotation() default Annotation.class;

 boolean proxyTargetClass() default false;

 AdviceMode mode() default AdviceMode.PROXY;

 int order() default Ordered.LOWEST_PRECEDENCE;

}

23.@Async

作用及范围:异步注解,需配合EnableAsync使用,使用后,方法变成异步方法

例子或源码:

@Component
public class TreadTasks {
    @Async
    public void startMyTreadTask() {
        System.out.println("this is my async task");
    }
}

24.@EnableScheduling

作用及范围:定时任务注解扫描器,会扫描包体下的所有定时任务

例子或源码:

@SpringBootApplication
@EnableScheduling //开启定时任务
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

25.@Scheduled

作用及范围:定时任务控制器

例子或源码:springboot2.X手册:36个注解详细解析,一目了然_第1张图片

@Scheduled(cron = "0 0 2 * * ?") 

26.@EnableJpaRepositories

作用及范围:开启对SpringData JPA Repository的支持

例子或源码:

@EnableJpaRepositories({"com.cshtong.sample.repository", "com.cshtong.tower.repository"})

27.@EnableTransactionManagement

作用及范围:开启注解式事务的支持

例子或源码:最常见的东西,不做讲解了

@EnableTransactionManagement // 启注解事务管理
@SpringBootApplication
public class ProfiledemoApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }

28.@EnableCaching

作用及范围:开启注解式的缓存支持

例子或源码:

@Configuration
@EnableCaching
public class CachingConfig {

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("sampleCache")));
        return cacheManager;
    }
}

29.@Cacheable

作用及范围:把信息放到存储中去

例子或源码:

@Cacheable(value = { "sampleCache","sampleCache2" },key="targetClass.getName()+'.'+methodName+'.'+#id")
    public String getUser(int id) {
        if (id == 1) {
            return "1";
        } else {
            return "2";
        }
    }

30.@RequestMapping

作用及范围:注解来将请求URL映射到整个类上,或某个特定的方法上

例子或源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {

 String name() default "";

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

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

 RequestMethod[] method() default {};

 String[] params() default {};

 String[] headers() default {};

 String[] consumes() default {};

 String[] produces() default {};

}

31.@ResponseBody

作用及范围:将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据

例子或源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {

}

32.@RequestBody

作用及范围:用来接收前端传递给后端的json字符串中的数据(请求体中的数据的)

例子或源码:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {

 /**
  * 默认是必须的
  */
 boolean required() default true;

}

33.@PathVariable

作用及范围:接收请求路径中占位符的值

例子或源码:

@RequestMapping(value=”user/{id}/{name}”)
请求路径:http://localhost:8080/user//1/james

34.@RestController

作用及范围:等同于@Controller + @ResponseBody

例子或源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

 @AliasFor(annotation = Controller.class)
 String value() default "";

}

35.@ControllerAdvice

作用及范围:全局异常处理;全局数据绑定;全局数据预处理

例子或源码:

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView customException(Exception e) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("message", e.getMessage());
        mv.setViewName("error");
        return mv;
    }
}

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ModelAttribute(name = "md")
    public Map mydata() {
        HashMap map = new HashMap<>();
        map.put("gender", "女");
        return map;
    }
}

36.@ExceptionHandler

作用及范围:用于处理controller层面的异常

例子或源码:

 @ExceptionHandler({RuntimeException.class})
    public ModelAndView fix(Exception ex){
        System.out.println("aaaa");
        return new ModelAndView("error",new ModelMap("ex",ex.getMessage()));
    }

作者溪云阁,专注编程教学,架构,JAVA,Python,微服务,机器学习等领域,欢迎关注,一起学习。

  • Spring Boot 参考指南(日志记录)

  • 因为一条SQL,我差点被祭天......

  • 删库不跑路,详解MySQL数据恢复

  • SpringBoot:掌握这两个属性,你的测试类可以启动的更快些


好文章,我在看

你可能感兴趣的:(spring,java,aop,ioc,spring,boot)