Skip to content

Latest commit

 

History

History
87 lines (63 loc) · 11.2 KB

File metadata and controls

87 lines (63 loc) · 11.2 KB

Spring

[TOC]

该笔记记录 Spring 的底层知识。

学习教程

Aspect Oriented Programming

动态代理

aop 的核心机制是动态代理,有两种动态代理机制:

  • JDK:基于接口(兄弟关系)
  • cglib:基于父类(父子关系)

几个概念

image-20210902090011382

AOP 有 Python 装饰器的味道。

Aspect Oriented Programming 面向切面编程。AOP 是一种和 OOP 不同的新的编程范式。OOP 把系统看作多个对象的交互,AOP 把系统分解为不同的关注点,或者称之为切面(Aspect)。

切面实际上是代理设计模式。

注解

Annotation 作用对象 解释 备注
@Component 表示该类为一个组件 定义了一个 Bean,单例
@Autowired 字段和方法 将指定类型的 Bean 注入到字段或者方法上 required = false 如果找不到对应的 Bean,就忽略,防止报错。通常用于字段
@Resource 字段 @Resource默认按照byName方式进行bean匹配 @Resource(name = "tiger")
@Service 声明该类是一个bean,这点很重要,因为该类是一个bean,其他的类才可以使用@Autowired将该类作为一个成员变量自动注入
@Configuration 告诉 Spring 这个类是一个配置类,等同于配置文件。配置类通常用于装配组件
@ComponentScan 告诉容器,自动搜索当前类所在的包以及子包,把所有标注为@Component的Bean自动创建出来,并根据@Autowired进行装配
@Order Component 注入 list 时指定 Bean 的顺序 从 @Order(1) 开始
@Bean 方法 Bean 不在我们的包中,就在@Configuration 类中编写一个 Java 方法创建并返回它,并且给该方法标记一个 @Bean 注解。给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例 单例。
@Qualifier 方法 @Qualifier("utc8") 给 Bean 起名字,破解单例
@Primary 方法 表示默认注入的 Bean 主从数据库,配置默认数据库
@Scope @Scope(ConfigurableBeanFactory.
SCOPE_PROTOTYPE) 表示多例,每次调用返回一个新的实例
@PostConstruct 方法 标记 init() 方法,表示 Bean 初始化时执行的动作
@PreDestroy 方法 标记 shutdown() 方法,表示 Bean 被销毁时执行的动作
@Value 字段 加载配置文件中的属性进行注入 @Value("classpath:/logo.txt") 注入 Resource
@PropertySource 配置自动读取配置文件 @PropertySource("application.yml") 表示从 application.yml 中读取配置 @Value("${app.zone:Z}") 提取 app.zone 的 value,默认为 Z
@Profile 方法 用来表示不同的环境,不同的环境创建不同的 Bean。@Profile("!test") 非 test 环境
@Conditional 类/方法 根据@Conditional决定是否创建并注入某个Bean到 IoC 中
@Aspect 声明该类为切面类
拦截器
@Before 方法 在……之前执行该切面
@After 方法
@Around 方法 在……前后执行该切面
@AfterReturning 方法 和@After不同的是,只有当目标代码正常返回时,才执行拦截器代码;
@AfterThrowing 方法 和@After不同的是,只有当目标代码抛出了异常时,才执行拦截器代码;
@EnableAspectJAutoProxy Spring的IoC容器看到这个注解,就会自动查找带有@Aspect的Bean,然后根据每个方法的@Before@Around等注解把AOP注入到特定的Bean中
@EnableTransactionManagement 启用声明式事务
@Transactional 类/方法 表示类中所有 public 方法都支持事务 / 表示该方法支持事务
@Entity 如果一个JavaBean被用于映射,我们就标记一个@Entity
@Table @Table(name="users") 指定映射的表名
@Column 方法 属性到数据库列的映射
@Id 方法 表示主键
@GeneratedValue 方法 表示自增
@MappedSuperclass 表示用于继承
@Transient 方法 表示方法返回一个“虚拟”的属性
@PrePersist 方法 在我们将一个JavaBean持久化到数据库之前(即执行INSERT语句),Hibernate会先执行该方法
@Select 方法 表示 sql 语句
@Param() 参数
@MapperScan 让MyBatis自动扫描指定包的所有Mapper并创建实现类
@EnableWebMvc 启用 Spring MVC
@Entity 用来注解该类是一个实体类用来进行和数据库中的表建立关联关系,首次启动项目的时候,默认会在数据中生成一个同实体类相同名字的表(table),也可以通过注解中的 name 属性来修改表(table)名称, 如@Entity(name=“user”) , 这样数据库中表的名称则是 user 。该注解十分重要,如果没有该注解首次启动项目的时候你会发现数据库没有生成对应的表。
@Table 该注解可以用来修改表的名字,该注解完全可以忽略掉不用,@Entity 注解已具备该注解的功能。
@Import 给容器中注入一个组件
@ImportResource 从 xml 文件中导入 bean 配置
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") 入参是字符串时间,接收类型是 date 类型,则自动转换成 date 类型(入参格式化)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 出参格式化 与 DateTimeFormat 相反,将 date 类型转为字符串