文章目录
起步
使用 ==@Import({ApplicationConfig.class})==在配置类上导入其他配置类。
配置类:业务Bean和架构Bean分离。
Bean作用域
singleton:只使用1个实例
prototype:每次引用会创建新实例
session:持续时间与用户的HTTP会话一致-仅限Web环境
request:持续时间与用户的HTTP请求一致-仅限Web环境
application:持续时间和ServletContext一致
thread:持续时间与所在线程一致。未注册
web_socket:持续时间与websocket一致
refresh:
自定义作用域:定义一个工厂,注册一个定义作用域名称。
Bean覆盖:
springboot2.1开始默认禁用。
单例的实现
会创建一个配置类的子类——CGlib代理
单例的实例会被ApplicationContext缓存
public class AppConfig$$EnhancerByCGLIB$ extends AppConfig {
public AccountRepository accountRepository() {
// 如果bean已存在于ApplicationContext中,则返回bean
// 否则,调用 super.accountRepository(),在上下文中保存bean,返回bean
}
public TransferService transferService() {
// 如果bean已存在于ApplicationContext中,则返回bean
// 否则,调用 super.transferService(),在上下文中保存bean,返回bean
}
}
减少空指针
在注入时引入Optional t;
利用t.ifPersent判断是否为空。
@PostContruct,@PreDestroy
@PostContruct在依赖注入后的后处理阶段被调用。
两个方法返回值都为void。
@PreDestroy在prototype类型下不会被调用。
@Autowired和@Resource
@Resource只支持属性和setter注入。先根据名称匹配。
@Autowired和@Inject
工厂Bean
Spring是一个工厂。
Configuration是一个工厂类,@Bean是工厂方法。
FactoryBean:
配置类中,Spring自动调用getObject()方法。
指定依赖项的顺序
@DependsOn(“在这个bean创建后创建”)
AOP概念
AOP实现了横切关注的模块化,
作用:避免代码缠绕,消除代码分散。
SpringAOP使用JDK代理
激活AOP:@EnableAspactAutoProxy
1.Spring创建一个代理编织切面和目标。
2.代理实现目标接口
3.所有调用通过代理拦截器进行路由
4.执行匹配的Advice
5.执行目标方法
JoinPoint参数提供了拦截点的上下文
AOP通知
@Before:
如果Advice抛出异常,则目标不会被调用
@AfterReturning:
成功返回之后
@AfterThrowing:
抛出指定的异常时,会调用Advice。无法终止异常的传播。
@After:
无论是否抛出异常,都会执行。
@Around:
继承自JoinPoint并增加了proceed()
方法
事务控制
@Transactional声明式
声明式的事务控制——使用Around类型的advice
使用规则:
抛出runtime则回滚,检查异常不会回滚。
Transaction上下文绑定当前线程
可以配置在类,timeout属性控制超时失败。
propagation=Propagation.REQUIRES_NEW
使用rollbackFor或noRollbackFor重写默认规则。
readOnly=true——方法中不论查询几次,始终使用一个连接。——更快
isolation=Isolation.REPEATABLE_READ——隔离级别
value:事务管理器
程序化事务
public RewardConfirmation rewardAccountFor(Dining dining) {
...
return new TransactionTemplate(txManager).execute( (status) -> {
try {
...
accountRepository.updateBeneficiaries(account);
confirmation = rewardRepository.confirmReward(contribution, dining);
}
catch (RewardException e) {
status.setRollbackOnly();
confirmation = new RewardFailure();
}
return confirmation;
});
}
SpringBoot
依赖管理
父级POM——依赖版本问题,maven插件构建项目,java版本。
Starters——引入16个协调依赖项。
打包
通过拓展Maven插件,以创建内置Tomcat的Fat
jar
集成测试
提供 @SpringBootTest用于增强测试功能
集成日志
默认包括SLF4J、LogBack(SLF4J实现)
通过在application中指定文件和路径,记录到轮换文件。
自动配置
@EnableAutoConfiguration——启用自动配置
SpringApplication.run()——这是一个SpringBoot类
通过预写大量的Configuration类,以及==@Conditional==注解实现:
@ConditionalOnClass
@ConditionalOnProperty
@ConditionalOnMissingBean
@ConditionalOnMissingClass
@Profile
外部化属性
SpringBoot查找Application.properties提供给Environment。
根据{profile}管理查找profile属性。
在bean上使用 @ConfigurationProperties指定前缀。
启用的三种方式:
配置类上使用 @EnableConfigurationProperties激活。
配置类上使用 @ConfigurationPropertiesScan扫描。
加上@Component。
Environmrnt Bean
标识从运行时环境中加载的属性
- JVM系统属性——自动填充
- 系统环境变量——自动填充
- Properties文件——classpath: file: http:
@Value 和 spel表达式
@Value可以使用在属性,和参数上
- “${daily.limit:1000}”
- “#{environmrnt[‘daily.limit’]?:1000}”
以上是等效的
EL属性可以是:
- Bean,Environment属性(三类)
- 允许创建自定义函数和引用:#{new Integer(environment[‘daily.limit’])*2}
@Profile
1
在配置类上使用:@Profile(“env”)
除非env被激活,否则配置中的任何内容都不可用。
2
在@Bean上使用@Profile注解。@Profile("!embedded")
2个Profile都使用相同的BeanID,同一时间只能有一个Profile被激活
3
@Profile能控制哪些@PropertySource是被包含在Environment中的
@Configuration
@Profile("local")
@PropertySource("local.properties")
public class DevConfig { ... }
SpringMVC
@ResponseStatus——请求状态。可以拿来标注异常类,和异常捕获方法。
@RestControllerAdvice——捕获控制层异常配置
@ExceptionHandler
@HiddenHttpMethodFilter:
HTML表单不支持PUT和DELETE
所以使用POST将他们放在一个隐藏的表单字段。
HEADOAS
超媒体即应用状态引擎
构建URL
- UriComponentsBuilder
- ServletUriComponentsBuilder