Spring2.5为我们引入了组件自动扫描机制(Annotation),它可以在类路径下寻找标记了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入到spring容器中管理,它的作用和在xml中使用bean节点配置组件一样。
1,@SpringBootApplication
通常用在主类上,是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解的复合注解。
注解 | 场景说明 | 备注 |
---|---|---|
@SpringBootConfiguration | 配置类注解,相当于等同于@Configuration | |
@EnableAutoConfiguration | 开启自动配置类,激活spring的自动装配机制 | |
@ComponentScan | 激活@Component扫描 | 通过basePackages可指定扫描路径,默认从声明@ComponentScan所在类的package进行扫描 |
@Configuration(“name”) | 声明当前类为配置类;通过@Resource(name = "restTemplateHttps") 引入不同的类 |
name可缺省 |
@Bean | 注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式; | Spring只调用一次产生这个Bean对象的方法,随后Spring将这个Bean对象放在自己的IOC容器中进行管理。这些bean并不一定要在@Configuration注解下进行创建,在@Component注解下也一样可以。 |
@Order | IOC容器中Bean的执行顺序的优先级; 默认是最低优先级,值越小优先级越高 |
Bean的加载顺序不受@Order或Ordered接口的影响; 主要用于相互依赖的对象的执行 |
@EnableConfigurationProperties | 开启对@ConfigurationProperties注解配置Bean的支持; | |
@EnableJpaRepositories | 开启对SpringData JPA Repository的支持; |
2)@EnableAutoConfiguration原理
@Import+@Configuration+Spring SPI
Spring SPI(Service Provider Interface):JDK1.6
是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。
SPI是调用方来制定接口规范,提供给外部来实现,调用方在调用时则选择自己需要的外部实现。
@EnableAutoConfiguration是一个复合注解:
@AutoConfigurationPackage
:注册扫描路径。
即:@Import(AutoConfigurationPackages.Registrar.class)
,Registrar重写了ImportBeanDefinitionRegistrar,在启动时扫描主启动类包和子包下的所有组件并加载到 Spring 容器。@Import(AutoConfigurationImportSelector.class)
:实现自动装配。
AutoConfigurationImportSelector中的方法public String[] selectImports(AnnotationMetadata annotationMetadata)
,返回类的全路径并加载到IOC容器中,spring再将全路径通过反射(SpringFactoriesLoader.loadFactoryNames
)作为bean放入IOC容器中。
==>举例:mybatis的引用:mybatis将@Configuration和@Bean的全限定名放入META-INF/spring.factories的jar包(存放了所有bean的全路径,以key-value形式存储)。项目引入mybatis依赖后,从spring.factories扫描类的全路径,通过反射将所有的bean放入IOC容器。
2,依赖注入相关注解
3,Spring MVC Annotation
4,参数校验
5,JSON相关注解
6,切面(AOP)注解
7,@Value
(1)支持如下方式的注入:
- 注入普通字符
- 注入操作系统属性
- 注入表达式结果
- 注入其它bean属性
- 注入文件资源
- 注入网站资源
- 注入配置文件
(2)@Value三种情况的用法。
${}
是去找外部配置的参数,将值赋过来
${}
可以出现在java类配置或XML文件中,Spring会从各种已经配置了的来源中解析属性。
要添加属性来源,可以在@Configuration类上增加@PropertySource注解,如:
@Configuration
@PropertySource("classpath:/META-INF/resources/app.properties")
public class Config{
……}
- #{}是SpEL表达式,去寻找对应变量的内容
- #{}直接写字符串就是将字符串的值注入进去
8,环境切换
注解 | 场景说明 | 备注 |
---|---|---|
@Profile | 指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件。 | |
@Conditional | 条件满足则注入 | 通过实现Condition接口,并重写matches方法,从而决定该bean是否被实例化。 |
@ConditionalOnBean | 有则注入 | |
@ConditionalOnMissBean | 没有则注入 |
9,任务执行&调度:@Async和@Scheduled
11,测试相关注解
12,lombok相关注解
13,缓存相关
Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache(JSR-107)注解简化我们的开发。
注解 | 说明 | 备注 |
---|---|---|
@EnableCaching | 开启注解式的缓存支持; | 用于主启动类 |
@Cacheable | 将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法。 | 作用于方法 |
@Cacheable常用属性