Spring 常用注解

1、SpringBoot 注解

@SpringBootApplication

这个注解是Spring Boot最核心的注解,用在Spring Boot类的主类上,标识这是一个Spring Boot应用,用来开启Spring Boot的各项能力。
实际上这个注解是@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解的组合,由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。

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

@SpringBootConfiguration : 继承@Configuration注解,主要用于加载配置文件

@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

@EnableAutoConfiguration 开启自动配置功能

EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成

@ComponentScan : 组件扫描和自动装配

@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下。

2、Spring 声明bean的注解

@Component:当组件不好归类的时候,我们可以使用这个注解进行标注。

@Controller、@Service、@Repository是@Component的一种特殊形式,都可以称为@Component,在Spring MVC中使用@Controller来定义controller,@Service用于在服务层中保存业务逻辑的注释类。
当组件不好归类的时候,我们可以使用这个注解进行标注,比如一些工具类,我们使用@Component比较好

@Controller:控制层、@Service:业务层、@Repository:数据访问层

@Service是@Component注解的一个特例,作用在类上
@Service注解作用域默认为单例,使用注解配置和类路径扫描时,被@Service注解标注的类会被Spring扫描并注册为Bean
@Service用于标注服务层组件,表示定义一个bean
@Service使用时没有传参数,Bean名称默认为当前类的类名,首字母小写
@Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用时传参数,使用value作为Bean名字

@Bean : 产生一个bean的方法

作用在方法上,明确地指示了一种方法,产生一个bean的方法,并且交给Spring容器管理。支持别名@Bean(“xx-name”)

@DependsOn:配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象

@Scope:用来定义@Component标注的类的作用范围以及@Bean所标记的类的作用范围

@Scope所限定的作用范围有:singleton、prototype、request、session、globalSession或者其他的自定义范围。
当一个Spring Bean被声明为prototype(原型模式)时,在每次需要使用到该类的时候,Spring IoC容器都会初始化一个新的改类的实例;
当@Scope的作用范围设置成Singleton时,被此注解所标注的类只会被Spring IoC容器初始化一次。在默认情况下,Spring IoC容器所初始化的类实例都为singleton。

  • Singleton:单例,一个Spring容器中只有一个bean实例,默认模式

  • Protetype:每次调用新建一个bean

  • Request:web项目中,给每个http request新建一个bean

  • Session:web项目中,给每个http session新建一个bean

  • GlobalSession:给每一个 global http session新建一个Bean实例

@PostConstruct用于指定初始化方法(用在方法上)

@PreDestory用于指定销毁方法(用在方法上)

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

@order,定义了组件的加载顺序

@order使用注解方式使bean的加载顺序得到控制,
@order标记定义了组件的加载顺序,值越小拥有越高的优先级,可为负数。值越小,越先被加载。

3、Spring bean自动装配的注解

@Autowired:由Spring提供

默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。

    @Autowired
    @Qualifier("cache-messageListenerAdapter")
    private MessageListenerAdapter messageListenerAdapter;

spring是支持基于接口实现类的直接注入的;支持注入map,list等集合中,不用做其他的配置,直接注入;

为什么要用这种方式注入bean呢?

使用场景:
适用于一个接口有多个实现类,然后根据不同的参数选择执行不同的实现类,其实就是策略模式。

Spring 会在启动时,自动查找实现了该接口的 bean,放到这个Map中去。
key为bean的名字,value为 实现了该接口的所有的 bean。

注意:这里只有在map的key为string类型时才有效;

@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 name 作为 Map 的 key。

在SpringBoot开发中,当一个接口A有多个实现类时,通过@Autowired, spring会很智能的将bean注入到List或Map变量中。

@Qualifier:指定注入Bean的名称

@Inject:由JSR-330提供

@Resource:由JSR-250提供

默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

@Autowired和@Resource两个注解的区别:

(1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
(2)、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

4、 导入配置文件

@PropertySource注解

//引入单个properties文件:
@PropertySource(value = {“classpath : xxxx/xxx.properties”})

//引入多个properties文件:
@PropertySource(value = {“classpath : xxxx/xxx.properties”,“classpath : xxxx.properties”})

取值:使用@Value注解取配置文件中的值
@Value(“${properties中的键}”)
private String xxx;

@ImportResource:导入xml配置文件

//引入单个xml配置文件:
@ImportSource(“classpath : xxx/xxxx.xml”)

//引入多个xml配置文件:
@ImportResource(locations = {"classpath:spring-restful-service.xml", "classpath:spring-redis-config.xml"})

@Import:导入额外的配置信息

用来导入配置类或一些需要前置加载的类,其可以通过快速导入的方式实现把实例加入Spring的IOC容器中。
可以导入带有@Configuration注解的配置类或实现了ImportSelector/ImportBeanDefinitionRegistrar的类。

@Component
@Import(ImConfig.class)
public class ImUtil {
    @Resource
    private ImConfig imConfig;
}

@Data
@ConfigurationProperties(prefix = "im")
public class ImConfig {
    private String clientId;
    private String clientSecret;
    private String domain;
}

5、切面(AOP)相关注解

Spring支持AspectJ的注解式切面编程

@Aspect:声明一个切面

@After:在方法执行之后执行(方法上)

@Before:在方法执行之前执行(方法上)

@Around:在方法执行之前与之后执行(方法上)

@PointCut:声明切点

@EnableAspectJAutoProxy:开启Spring对AspectJ代理的支持

6、异步 和 定时任务

@EnableAsync:配置类中通过此注解开启对异步任务的支持

@Async:在实际执行的bean方法使用该注解来声明其是一个异步任务(方法上或类上所有的方法都将异步,需要@EnableAsync开启异步任务)

@EnableScheduling:在配置类上使用,开启定时计划任务的支持

@Scheduled:来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持)

7、事务注解 @Transactional

在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式

  • 编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

  • 声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用

8、全局异常处理

@ControllerAdvice:定义全局异常处理类
@RestControllerAdvice:是在@ControllerAdvice加了一个@ResponseBody注解,用来将返回值写入到响应体
@ExceptionHandler:声明异常处理方法

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    String handleException(){
        return "Exception Deal!";
    }
}

RestControllerAdvice + ExceptionHandler 不但可以做全局异常处理,还可以做全局响应体自动包装,见
Java后端通用接口设计

9、Enable***注解说明

@EnableAspectAutoProxy:开启对AspectJ自动代理的支持

@EnableAsync:开启异步方法的支持

@EnableScheduling:开启计划任务的支持

@EnableWebMvc:开启web MVC的配置支持

@EnableConfigurationProperties:开启对@ConfigurationProperties注解配置Bean的支持

@EnableJpaRepositories:开启对SpringData JPA Repository的支持

@EnableTransactionManagement:开启注解式事务的支持

@EnableCaching:开启注解式的缓存支持

10、SpringMVC常用注解

  • 1、@EnableWebMvc:在配置类中开启Web MVC的配置支持

  • 2、@Controller 控制层

  • 3、@RequestMapping:用于映射web请求,包括访问路径和参数

  • 4、@ResponseBody:支持将返回值放到response内,而不是一个页面,通常用户返回json数据

  • 5、@RequestBody:允许request的参数在request体中,而不是在直接连接的地址后面

  • 6、@PathVariable:用于接收路径参数,比如@RequestMapping(“/hello/{name}”)声明的路径,将注解放在参数前,即可获取该值,通常作为Restful的接口实现方法。

  • 7、@RestController:该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。

  • 8、@InitBinder:用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中

你可能感兴趣的:(Spring 常用注解)