Spring常用注解
@Autowired
-
根据类型进行自动装配。若需要根绝名称装配需配合@Qualified一起使用。
@Qualifier
-
@Qualifier:配合@Autowired一起通过名称进行装配。
eg:
@Component("studentInfo")
public class StudentInfo implements UserInfo {
public String userName() {
return "student";
}
}
@Component("teacherInfo")
public class TeacherInfo implements UserInfo {
public String userName {
return "teacher";
}
}
@Component
public class UserService {
@Autowired
@Qualifier("studentInfo")
private UserInfo userInfo;
//如果容器中有多个相同类型的bean,框架中将抛出NoUniqueBeanDefinitionException, 以提示有多个满足条件的bean进行自动装配,此情况下,需要这两个注解搭配使用。
}
@Bean
-
@Bean:主要用于@Configuratiion注解类中,也可以用于@Component注解的类里,bean的id为其方法名,若要自定义可用此注解的name属性。
@Configuration
public class BeanConfig {
@Bean(name="user")//默认id为方法名,可通过name属性自定义
public Person userInfo() {
return new UserInfo("toutou", 18);
}
}
这个配置等同于在xml里的配置
<bean id="userInfo" class="com.test.UserInfo">
<property name="age" value="18"/>
<property name="name" value="张三"/>
</bean>
@Required
-
@Required:此注解应用于bean属性的setter方法,它表明受影响的bean属性在配置时,必须放在xml配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。
@Required
void setUserName(String name) {
this.name = name;
}
<!--setter方法上使用@Required注解,xml中必须配置相关属性,否则报错-->
<bean class="com.test.UserInfo">
<property name="name" value="zhangsan " />
</bean>
@Value
-
@Value:将外部的值动态注入到Bean中。它可以注入普通字符串,注入Java系统变量、注入表达式结果、注入其他Bean属性、将配置文件*.properties 或 *. yml里配置的属性注入、注入文件资源、注入url资源。
@DependsOn
-
@DependsOn:可以定义在类或方法上,根据依赖关系先后注入bean。Spring容器载入bean顺序是不确定的。Spring框架也没有约定特定载入顺序逻辑范围。
@Configuration
public class BeanConfig {
@Bean("firstBean")
@DependsOn(value = {
"secondBean"
})//再secondBean组件加载后,再加载此组件
public FirstBean firstBean() {
return new FirstBean();
}
@Bean("secondBean")
public SecondBean secondBean() {
return new SecondBean();
}
}
@Lazy
-
@Lazy:用于标识bean是否需要延迟加载。Spring IoC容器一般都会在启动时实例化所有单实例bean,如果想要Spring在启动时延迟加载A,即在调用B时再去初始化,则可使用此注解。
@Configuration
public class AppConfig {
@Lazy(value = true)//使他延迟加载
@Bean
public FirstBean firstBean() {
return new FirstBean();
}
@Bean
public SecondBean secondBean() {
return new SecondBean();
}
}
@Lookup
-
@Lookup:作用再方法上的注解,被标注的方法被重写,然后根据返回值的类型,容器调用BeanFactory的getBean()方法来返回一个bean。
@Primary
-
@Primary:解决@Autowired时容器中有多个相同类型bean的问题,此注解为默认优先选择,不可以同时设置多个
@Component("studentInfo")
public class StudentInfo implements UserInfo {
public String userName() {
return "student";
}
}
@Component("teacherInfo")
@Primary//默认优先选择
public class TeacherInfo implements UserInfo {
public String userName {
return "teacher";
}
}
@Component
public class UserService {
@Autowired
@Qualifier("studentInfo")
private UserInfo userInfo;
}
@Scope
-
@Scope:此注解时SpringIoC容器的一个作用域,其值:singleton–单例,默认、prototype–多例、Web作用域(requst、session、globalsession),自定义作用域
@Profile
-
@Profile:为适应多环境开发,实现不同的开发环境使用不同的数据源。spring3.2之前 @Profile注解用在类上,spring3.2 之后 @Profile注解用在方法上
@Import
-
@Import:用于注入指定的类,导入组件id默认是组件的全类名。
@Configuration
public class ConfigA {
@Bean
public A a() {
return new A();
}
}
@Configuration
@Import(ConfigA.class)
public class ConfigB {
@Bean
public B b() {
return new B();
}
}
@ImportResource
-
@ImportResource:用于导入配置文件,让配置文件里面的内容生效。
@Configuration
@ImportResource({"classpath*:applicationContext.xml"})
public class XmlConfiguration {
}
@PropertySource
-
@PropertySource:加载指定的配置文件
@Configuration
@PropertySource("classpath:config.properties")//加载指定的配置文件
public class ProperySourceDemo implements InitializingBean {
@Autowired
Environment env;
@Override
public void afterPropertiesSet() throws Exception {
setDatabaseConfig();
}
private void setDatabaseConfig() {
DataSourceConfig config = new DataSourceConfig();
config.setDriver(env.getProperty("jdbc.driver"));
config.setUrl(env.getProperty("jdbc.url"));
config.setUsername(env.getProperty("jdbc.username"));
config.setPassword(env.getProperty("jdbc.password"));
System.out.println(config.toString());
}
}
@PropertySources
-
@PropertySources:可以指定多个@PropertySource来导入配置文件
@PropertySources({
@PropertySource("classpath:config.properties"),
@PropertySource("classpath:db.properties")
})
public class AppConfig {
}
SpringWeb注解
@RestController
@RestController:是一个结合了 @ResponseBody 和 @Controller 的注解。
@ResponseBody
@ResponseBody:注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
@Controller
@Controller: 用于标记在一个类上,使用它标记的类就是一个控制器类。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。
@RequestMapping
@RequestMapping:一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
有6个属性:
1,value: 指定请求的实际地址。
2,method: 指定请求的method类型, GET、POST、PUT、DELETE等;
3,produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
4,consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
5,params: 指定request中必须包含某些参数值时,才让该方法处理。
6,headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestParam
@RequestParam:用于将请求参数区数据映射到功能处理方法的参数上
@PathVariable
用于获取URL中的参数:一般{ }中的变量名与方法中的形参名一致–REST风格
RequestMapping(“user/get/mac/{macAddress}”)
public String getByMacAddress(@PathVariable String macAddress){
//do something;
}
@RequestBody
@RequestBody :一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据,在GET请求中没有请求体所以一般不适用,在post请求中必须指定Content-Type后才能使用它,如ajax请求指定发送格式为application/json。
SpringBoot注解
@SpringBootApplication
-
@SpringBootApplication:SpringBoot启动类上,标识这是一个SpringBoot应用,这是一个复合注解。默认扫描和奔雷再一个层级下的所有包及其子包。
此注解相当于3个注解的组合:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan
@SpringBootConfiguration
-
@SpringBootConfiguration: 此注解是@Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展。
@EnableAutoConfiguration
-
@EnableAutoConfiguration:允许自动配置。
@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:
1,从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
2,去重,并将exclude和excludeName属性携带的类排除;
3,过滤,将满足条件(@Conditional)的自动配置类返回;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage//导入AutoConfigurationImportSelector的子类@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
@ComponentScan
-
@ComponentScan:组件扫描,可自动发现和装配一些Bean。
@Conditional
-
@Conditional:这是 Spring 4.0 添加的新注解,用来标识一个 Spring Bean 或者 Configuration 配置文件,当满足指定的条件才开启配置。
同系列注解
注解 解释 @ConditionalOnBean 当容器中有指定的Bean才开启配置。 @ConditionalOnMissingBean 当容器中没有指定的 Bean 才开启配置。 @ConditionalOnClass 当容器中有指定的 Class 才开启配置。 @ConditionalOnMissingClass 当容器中没有指定的 Class 才开启配置。 @ConditionalOnWebWebApplication 当前项目类型是 WEB 项目才开启配置。 @ConditionalOnNotWebApplication 当前项目类型不是 WEB 项目才开启配置。 @ConditionalOnProperty 当指定的属性有指定的值才开启配置 @ConditionalOnExpression 当 SpEL 表达式为 true 时才开启配置。 @ConditionalOnJava 当运行的 Java JVM 在指定的版本范围时才开启配置。 @ConditionalOnResource 当类路径下有指定的资源才开启配置 @ConditionalOnJndi 当指定的 JNDI 存在时才开启配置。JDNI(Java 命名与目录接口 Java Naming and Directory Interface) @ConditionalOnCloudPlatform 当指定的 class 在容器中只有一个 Bean,或者同时有多个但为首选时才开启配置。
@ConfigurationProperties
-
@ConfigurationProperties:用来加载额外配置(yml或properties文件),可用再 @Configuration 注解类,或者 @Bean 注解方法上面。
@EnableConfigurationProperties
-
@EnableConfigurationProperties:一般要配合 @ConfigurationProperties 注解使用,用来开启对 @ConfigurationProperties 注解配置 Bean 的支持。
@AutoConfigureAfter
-
@AutoConfigureAfter:用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。
如 Mybatis 的自动配置类,需要在数据源自动配置类之后。
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
}
@AutoConfigureBefore
-
@AutoConfigureBefore:表示该自动配置类需要在另外指定的自动配置类配置之前
@AutoConfigureOrder
-
@AutoConfigureOrder:Spring Boot 1.3.0中有一个新的注解@AutoConfigureOrder,用于确定配置加载的优先级顺序。
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) // 自动配置里面的最高优先级
@Configuration
@ConditionalOnWebApplication // 仅限于web应用
@Import(BeanPostProcessorsRegistrar.class) // 导入内置容器的设置
public class EmbeddedServletContainerAutoConfiguration {
@Configuration
@ConditionalOnClass({ Servlet.class, Tomcat.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {
// ...
}
@Configuration
@ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedJetty {
// ...
}
}