主要提供的能力
ioc
- 通过依赖注入,面向接口编程实现解耦
- 每个被spring管理的java对象称之为bean
- xml、注解、java配置都是在配置元数据。所谓的元数据是指本身没有任何的执行能力,需要外部代码解析(这里就是spring)
- 申明bean:@Component(无特定含义) @Service(服务层使用) @Repository(dao层使用) @Controller(mvc的控制层使用),都是等效的
- @Scope() :1、在ioc容器中单例(默认) 2、每次获取到不同的实例 3、每个http session单例 4、每个http request单例
- 注入bean:@Autowired @Inject @Resource
- 配置类:@Configuration,相当于一个xml配置文件
- 扫描类:@ComponentScan 扫描指定包中的申明的所有bean,注册到ioc容器中
- @Bean在方法上:声明当前方法返回一个bean,bean名为方法名
- @Configuration和@Bean的配合使用就是java配置模式
- 使用容器的方式:1、创建一个容器上下文(需要将配置的类传入) 2、通过类名从容器中获取实例
- bean初始化和销毁:@PostConstruct @PreDestroy @Bean(initMethod=”“,destroyMethod=”“)
aop
- 实现声明式编程?
- 使用aop和模板减少模式化代码
- 可以让一组类共享一组相同方法,弥补oop中继承的不足
- 声明切面:@Aspect
- 拦截切点:@After @Before @Around
- 定义拦截规则:@PointCut
- 应用:spring的事务(@Transcational)、数据缓存(@Cacheable)
- 开启AspectJ @EnableAspectJAutoProxy
el
- @Value(el表达式):注入一些配置信息 @Value(“${book.name}”)
- @PropertySource():设置注入的配置信息所在文件
识别配置环境
- @Profile:在特定的环境下做某事
事件
- bean和bean之间通信
- 步骤:1、继承ApplicationEvent定义事件 2、继承ApplicationListener实现监听并做某事 3、注入ApplicationContext发布事件
Spring Aware
- bean将和Spring有耦合,这样可以调用spring提供更多资源
- 继承ApplicationContextAware可以获得spring容器的所有服务:Bean名称,加载外部资源文件
多线程
- 实现AsyncConfigurer接口,同时@EnableAsync开启异步任务的支持
- 实现方法,返回一个Executor,使用的是ThreadPoolTaskExecutor实现类
- 在service中的方法上加上@Async表明是一个异步方法
计划任务
- @EnableScheduling开启对计划任务的支持
- 在service中的方法上加上@Scheduled表明是一个计划任务
- 时间周期的配置可以再@Scheduled中用cron表达式配置
@Conditional
- 比如说:引入某个包才加载某个bean;初始化了某个bean才初始化另外一个bean
- 实现Condition接口定义一个类,eg:
class A implements Condition
- 使用@Conditional(A.class)条件话创建bean
@Bean
@Conditional(A.class)
public ListService listService(){return new ……}
组合注解 元注解
- 组合注解:将多个注解合并到一起
- 元注解:可以注解到别的注解上的注解
@Enable*注解
1.第一种(直接导入配置),在@Enable* 的内部,其实用了@import注解,用来导入一些自动配置的bean
2.第二种(依据条件导入),在@Enable* 的内部,@import导入一个ImportSelector的实现类,重写selectImports()方法,返回配置类
3.第三种(动态注册),在@Enable* 的内部,@import导入ImportBeanDefinitionRegistrar的实现类,运行时自动添加bean到已有的配置类