Spring注解汇总
Spring注解汇总
Spring中注解一览:
导入组件
-
@Configuration
告诉Spring这是一个配置类,相当于原来的.xml或者.properties配置文件
-
@Bean
相当于原来.xml文件中的标签,代表向容器中注入一个JavaBean,该注解作用在方法上,方法的返回值代表Bean的类型,方法名(或者注解的属性)代表Bean的id.
可以在注解中指定该Bean的初始化方法和销毁方法:
@Bean(initMethod="", destoryMethod="")
这样在容器给我们创建bean的时候就会执行对应的方法.除了注解,如果我们要注册的Bean实现了InitializingBean接口和DisposableBean接口,那么在创建完对象以后会执行对应的初始化方法,我们可以自定义初始化和销毁的逻辑.
-
@ComponentScan
扫描注解,作用在类上,只要扫描的路径下的类上标注了@Service、@Controller、@Repository等注解就可以扫描到,作用和原来xml文件中包扫描的标签一致.
该注解的属性中,
value
指定要扫描的包;excludeFilters
指定扫描的时候排除的元素,该属性是一个数组,可以指定多个.ep:
@ComponentScan(value = 'com.xiaojian', excludeFilters = { @Filter(type=FilterType.ANNOTATION, classes={Controller.class, Service.class}) })
以上代码中表示
在包扫描的时候排除Controller注解和Service注解标注的类
.该注解还有一个属性
includeFilters
,指定扫描的时候只包含什么组件. -
@ComponentScans
该注解可以包含多个@ComponentScan注解,可以自己组合使用.
-
@Scope
设置bean的作用域,在spring中,默认获得的JavaBean是单实例的,如果我们要改变这种规则,可以使用此注解来设置,取值有四种:
prototype
、singleton
、request
和session
,其中prototype
表示多实例,singleton
表示单实例,也就是默认情况.request
表示同一次请求创建一个实例,session
同一个session创建一个实例.需要知道的是,如果是单实例情况,那么在容器启动的时候,spring就已经帮我们创建好了实例对象并放在IOC容器中,如果是
prototype
多实例,是在每次获取的时候创建对象,且每次调用都创建一个. -
@Lazy
懒加载.spring创建对象是单实例的,默认是在容器启动的时候就创建好了对象,如果我们使用此注解,就可以在获取对象的时候才创建,这样子在IOC容器初始化的时候就不会帮我们创建对象了.
-
@Conditional
按照一定的条件进行判断,满足条件才给容器中注册bean
这个注解是spring4.0后给我们提供的,在springboot中使用比较频繁,可以使用在类上,也可以使用在方法上.
该注解的参数需要传Condition,Condition是一个接口,有一个方法matches,返回值是boolean类型,true代表匹配成功,false代表不匹配,我们只需要自定义Condition的实现类即可.
matches
方法有两个参数:ConditionContext
和AnnotatedTypeMetadata
,前者表示判断条件能使用的上下文环境对象,后者表示注释信息.如果该注解放在类上,那么只有当满足条件的时候,当前类中配置的所有bean才会注册.
-
@Import
快速给容器中注册一个组件,注册的id默认是全类名
也可以在该注解中以数组的方式导入多个组件.
@Import({"com.xxx.xx", "com.xxx.xxxx"})
除了指定具体的导入类,也可以使用自定义的逻辑筛选来导入,即在该注解中指定属性
ImportSelector
,ImportSelector
是一个接口,它有一个方法selectImports()
,返回值是一个String[],就是导入到容器中的组件的全类名.我们需要自己实现这个接口,编写自己的选择导入逻辑即可.@Import({Book.class, User.class, MySelector.class})
selectImports()
方法有一个参数AnnotationMetadata
,它表示当前标注@Import注解的类的所有注解信息.除了以上两种属性,Import注解还有一个属性:
ImportBeanDefinitionRegistrar
,它也是一个接口,有一个方法registerBeanDefinitions()
,这个方法除了有AnnotationMetadata
参数,还有一个BeanDefinitionRegister
,代表组件注册的信息,可以通过它的方法registerBeanDefinition
来自定义注册组件.
除了以上的注解来组合使用方便我们导入Bean组件,我们也可以使用spring的FactoryBean
工厂来导入Bean.使用FactoryBean获取的bean是工厂调用getObject
创建的对象,如果我们要获取工厂bean本身,需要在getObject方法中,在id前加&
标识即可.
-
@PostConstruct
在bean创建完,属性赋值结束以后调用标注方法,进行初始化
-
PreDestroy
在容器销毁之前调用,进行清理工作
以上两个注解都是标注在JavaBean中的方法之上的
属性赋值
-
@Value
该注解使用的时候可以有以下几种:
-
基本数值:
@Value("张三")
-
SpEl表达式:
@Value("#{20-2}")
-
可以写${},取出配置文件中的值.需要配合下面的
@PropertySource
注解一起使用@Value("${xxx.xxx}")
-
-
@PropertySource
加载配置文件,注解的value是个String[],可以指定多个
自动装配
-
@Autowired
默认优先按照类型去容器中查找装配,如果找到多个再将属性的名称作为id去查找.
该注解有个属性
required
,默认是true,表示是否必须,如果指定为false,则容器中没有该组件时,会默认为null.该注解可以标注在以下几个位置:
- 标注在方法上,会从IOC容器中获取对应的bean给方法中使用
- 标注在构造器上,构造器要用的参数也会从IOC容器中获取
- 标注在方法参数位置,同样是从容器中获取.
-
@Qualifier
配合
@Autowired
使用,指定需要装配的组件的id -
@Primary
使用此注解让Spring在自动装配的时候,默认使用首选的bean.
也就是说,如果不指定装配的组件的id时,默认使用加了
@Primary
注解的bean. -
@Resource
属于java的规范,也可以实现自动装配,但是该注解默认按照组件名称装配.
-
@Inject
也可以实现自动装配,不过使用该注解需要导入javax.inject的包,功能和Autowired一样.
除了以上的注解来自动注入,如果我们要使用spring的底层组件,比如:applicationContext、BeanFactory等,只需要自定义一个组件,实现spring中的xxxAware接口,实现对应的方法即可.
Profile
指定组件在对应的环境下才能注册到容器中
-
@Profile
对组件进行环境标识,只有当前环境**的时候才能注册到容器中.
该注解标注的组件可以指定id.
要**对应的 环境,有以下几种方式:
-
命令行参数:
-Dspring.profiles.active=test
-
//创建一个applicationContext AnnotationConfigApplicationContext application = new AnnotationConfigApplicationContext(); //设置环境 aoolicationContext.getEnvironment().setActiveProfiles("text", "dev"); //注册配置类 applicationContext.register(xxxx.class); //启动刷新容器 applicationContext.refresh();
-