注解简介

Posted by KANG's BLOG on Tuesday, May 18, 2021

@Configuration

​ 把一个类作为一个ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。

@Scope

​ 作用域

@Lazy(true)

​ 延迟初始化

@Service

​ 用于标注业务层组件

@Controller

​ 用于标注控制层组件

@Repository

​ 用于标注数据访问组件,即DAO组件。

@Component

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

@Scope

​ 用于指定scope作用域的(用在类上)

@PostConstruct

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

@PreDestory

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

@Resource

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

@DependsOn

​ 定义Bean初始化及销毁时的顺序

@Primary

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

@Autowired

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

@Autowired

@Qualifier(“personDaoBean”)

​ 存在多个实例配合使用

@AliasFor

​ 两个注解互为别名,成对出现,必须有默认值

@CrossOrigin

使用在类或方法上,使其具有跨域能力

springMVC的版本要在4.2或以上版本才支持

@Import

@Import直接引入一个类,将其作为Spring bean,受Spring容器管理(Spring 4.2.0以及之后版本可以使用)

@EnableWebMvc

@EnableWebMvc没有任何属性,只是@Import了一个类叫DelegatingWebMvcConfiguration。

使用该属性,可以自定义所有spring配置。

注意:

使用了@EnableWebMvc注解等于扩展了WebMvcConfigurationSupport但是没有重写任何方法。

所以有以下几种使用方式:

@EnableWebMvc+extends WebMvcConfigurationAdapter,在扩展的类中重写父类的方法即可,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置

extends WebMvcConfigurationSupport,在扩展的类中重写父类的方法即可,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置

extends WebMvcConfigurationAdapter,在扩展的类中重写父类的方法即可,这种方式依旧使用springboot的@EnableAutoConfiguration中的设置

@CookieValue

获取cookie中的值

@RequestMapping("/testCookie")
public String testCookie(@CookieValue(value="name",required=false) String name){
    return "hello " + name;
}

@Async

Async注解能够在spring中开启多线程

首先需要使用@EnableAsync注解全局开启spring线程池,该注解通常标记在springboot启动类或者spring线程池配置类上。

然后@Async标记的方法会在bean初始化时注册到线程池中

spring线程池配置类

@Configuration
public class ThreadPoolTaskConfig {
 
    @Bean
    public Executor executor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //此方法返回可用处理器的虚拟机的最大数量; 不小于1
        int core = Runtime.getRuntime().availableProcessors();
        executor.setCorePoolSize(core);//设置核心线程数,默认为1
        executor.setMaxPoolSize(core * 2 + 1);//设置最大线程数,默认为Integer.MAX_VALUE
        executor.setKeepAliveSeconds(3);//除核心线程外的线程存活时间,默认为60s
        executor.setQueueCapacity(40);//如果传入值大于0,底层队列使用的是LinkedBlockingQueue,否则使用SynchronousQueue,默认为Integer.MAX_VALUE
        executor.setThreadNamePrefix("thread-execute");//线程名称前缀
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//设置拒绝策略
        return executor;
    }
}

layout.tobs.jd.com design.tobs.jd.com

@Autowired与@Resource的区别

@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

@Autowired()
@Qualifier("baseDao")
privateBaseDao baseDao;

@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="baseDao")
privateBaseDao baseDao;