文章目录
常用注释全解
1. Bean定义
@Component
- 功能
把普通pojo实例化到spring容器中,把任意 类/方法 标识成可装配的 bean。
相当于配置文件中的:
<bean id="" class=""/>
-
作用于
标注在 bean实现类:类会作为组件类,Spring要为这个类注册bean 到Spring容器中 -
特点:
- 注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。
- 纯粹是声明性的
-
使用:用于自动检测和类路径扫描 自动配置bean。
通用的注解,MVC中如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。
- @Component 衍生注解:
@Controller
@Service
@Repository
@Configuration
依附于 @Configuration
配置类
- 功能
Spring配置文件,声明配置类,相当于配置文件中的
<beans>
- 作用于
标注类 可以使用 @Component注解替代 - 使用
配置类的位置一般放在最外层的包目录下。
因为 spring进行扫描时,会以配置类所在的包为基础扫描
@Bean
- 功能
相当于配置文件中的
<bean>标签
- 作用于
标注在@Configuration类中的 方法:该方法会返回一个对象,Spring要为这个对象注册bean 到Spring容器中 - 特点:
- 显式声明单个bean,可以精确地创建和配置bean。(一个方法一个bean)
- 将bean的声明 与 类定义分离
@Configuration
public class Demo {
@Bean
public Demo demo(){
return new Demo();
}
}
@Import
@Configuration
@Import(Config.class)
public class Demo {
}
@ConditionalOnProperty
控制配置是否生效
- 功能
比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置 - 案例
//只给 张三 加载此配置
@ConditionalOnProperty(prefix = "${property前缀}", name = "${property}", havingValue = "张三")
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
@Component 和 @Bean 对比
都可以通过@Autowired
自动装配
@Bean 注解比 Component 注解的自定义性更强, 它把bean的声明与类定义分离
很多地方我们只能通过 @Bean 注解来注册bean。
比如当我们引用第三方库的类, 又没有没有源代码,就没办法使用@Component进行自动配置
只能通过 @Bean 或者 xml方式 来实现
- 例: 没有TransferServiceImpl的源码,使用它的bean
<!-- xml配置 -->
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
// 配置类,等同xml配置
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
2. Bean寻找 @ComponentScan(路径)
- 作用
(告诉Spring能从哪里找到bean)扫描路径,把符合扫描规则的类装配到spring容器
相当于xml的
<context:component-scan>
扫描时,会以配置类所在的包为基础,扫描当前包,以及其子包
- Spring Boot项目
Spring Boot项目会自动扫描 @SpringBootApplication注解的main app所在的包;
如果有的bean 不在main app的包及其下级包,那么需要手动加上@ComponentScan注解指定bean所在的包
3. Bean注入
@Autowired
自动装配
- 功能
默认按类型装配(byType)自动装配 - 作用于
标注 引用类型的构造器,方法,方法参数,注解
public class UserController {
@Autowired
private TransferServiceImpl tansferServiceImpl;
......
}
@Resource
按名称装配(byName)
标注 类,字段,方法:
@Inject
有歧义性/多个实现类 的bean处理
@Primary
:设置首选类
@Qualifier
:多个候选者bean限定
- 功能
如果有多个类型一样的Bean候选者,则需要限定其中一个候选者
@Autowired
@Qualifier(value="oracleDateSource")
public DateSource getDateSource(DateSource ds){
return this dateSource = ds;
}
@Autowired
@Qualifier(value="mysqlDateSource")
public DateSource getDateSource(DateSource ds){
return this dateSource = ds;
}
4. Bean作用域、生命周期
@Scope("作用域")
作用范围设置@PostConstruct
初始化 Java自己的注解@PreDestroy
销毁
@Bean
@Scope("singleton")
public TransferService transferService() {
return new TransferServiceImpl();
}
5. 读取配置文件
从 application-{profile}.properties/yml 文件读取值
在配置文件中指定profile : spring.profiles.active=dev
@Value
注解在属性上,单个注入
支持 SpEL
- 从配置文件读取值
@Value("${property}")
@Value("${property:默认值}")
- SpEL
@Value(“#{SpEL表达式}”)
@Value("${init.name}")
String name;
@Value("${init.password}")
String password;
### sqlel表达式
@Value("true")
private Boolean boss;
@Value("#{18}")
private int age; //获取数字 18
@Value("#{'Spring Expression Language'}") //获取字符串常量
private String str;
@Value("#{dataSource.url}") //获取bean的属性
private String jdbcUrl;
@ConfigurationProperties
通过指定的前缀,绑定配置文件中的配置
可以注解在类上,也可以放在@Bean的方法上。批量注入配置文件中的属性
一般用于多个数据源的配置,读写分离
- 例:数据库读写分离
# 写数据源
spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa
spring.datasource.druid.write.username=root
spring.datasource.druid.write.password=1
spring.datasource.druid.write.driver-class-name=com.mysql.jdbc.Driver
# 读数据源
spring.datasource.druid.read.url=jdbc:mysql://localhost:3306/jpa
spring.datasource.druid.read.username=root
spring.datasource.druid.read.password=1
spring.datasource.druid.read.driver-class-name=com.mysql.jdbc.Driver
@Configuration
public class DataSourceConfig {
@Bean(name = "writeDataSource")
@ConfigurationProperties(prefix="spring.datasource.druid.write")
public DataSource writeDruidDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "readDataSource")
@ConfigurationProperties(prefix="spring.datasource.druid.read")
public DataSource readDruidDataSource() {
return DataSourceBuilder.create().build();
}
}
@PropertySource
加载指定的配置文件
@PropertySource(value = {"classpath:123.properties"})
@ImportResource
标注在一个配置类,导入Spring的配置文件让其生效
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别。
需要用@ImportResource加载生效
@ImportResource(locations = {"classpath:beans.xml"})
6. 参数校验
@Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式
@NotEmpty 被注释的字符串的不能为 null 也不能为空
@NotBlank 被注释的字符串非 null,并且必须包含一个非空白字符
@Email 被注释的元素必须是 Email 格式。
@Size(max=, min=)被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
… …
7. 事务管理
@Async
异步 3.x后
@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,主线程无需等待它的完成,即可继续其他的操作。
@Transactional
用在 public方法,类(所有public方法):声明式事务管理
实质是基于 Spring 的动态代理的机制,使用了 JDBC 的事务来进行事务控制的
属性 | 描述 |
---|---|
propagation | 事务的传播行为 |
isolation | 事务的隔离度 |
timeout | 事务的超时时间,超时自动回滚 |
rollbackFor | 能够触发事务回滚的异常类 |
rollbackForClassName | 能够触发事务回滚的异常类名 |
noRollbackFor | 不能触发事务回滚的异常类 |
isolation 隔离级别
//:读取未提交数据(会出现脏读, 不可重复读) 基本不使用
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
//:读取已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.READ_COMMITTED)
//:可重复读(会出现幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)
//:串行化
@Transactional(isolation = Isolation.SERIALIZABLE)
rollbackFor 回滚规则
//error一定回滚,默认RuntimeException 运行时异常回滚
@Transactional(rollbackFor = MessageException.class)
SringMVC 衍生注解
@Component的衍生注解
@Controller
标注类 : 对应 Spring MVC 控制层Controller对象,主要用于接受用户请求并调用 Service 层返回数据给前端页面。@Service
标注类 : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。@Repository
标注类 : 对应持久层即 Dao 层,主要用于数据库相关操作。
http Request 请求处理方法映射
@RequestMapping
标注类,方法 : http路径映射到处理类或方法@GetMapping()
标注方法 : http GET请求路径映射@PostMapping()
标注方法 : http POST请求路径映射@PutMapping
标注方法 : http PUT请求路径映射@DeleteMapping
标注方法 : http DELETE请求路径映射
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody UserCreateRequest userCreateRequest) {
return userRespository.save(user);
}
前端>后端传值
@PathVariable
获取 路径参数@RequestParam
获取 请求参数 url中的?后面的参数@RequestBody
获取 请求Body中JSON字符串
@GetMapping("/klasses/{klassId}/{klassName}/teachers")
public List<Teacher> getKlassRelatedTeachers(
@PathVariable("klassId") Long klassId,
@PathVariable("klassName") String klassName,
@RequestParam(value = "pwd", required = false) String pwd
) {
// 前端请求 /klasses/000001/1班/teachers?pwd=qwert
System.out.println(klassId);//000001
System.out.println(klassName);//1班
System.out.println(pwd);//qwert
}
后端>前后端传值
@Controller
返回一个视图@ResponseBody
标注类,方法: 用于Controller方法返回的对象,写入http的body区@RestController
标注类: = @Controller + @ResponseBody
MyBatis注解
- 配置mapper
@Mapper
在接口类上添加,该接口是mapper@MapperScan(value)
包下面的所有接口都是mapper
@MapperScan(
basePackages = {"com.biz1", "com.group2"},
annotationClass = Mapper.class,
sqlSessionTemplateRef = "xxxSqlSessionTemplate",
sqlSessionFactoryRef = "xxxSqlSessionFactory"
)
value:指定mapper接口类包路径
basePackages = 扫描包、类
sqlSessionFactoryRef = SqlSessionFactory Bean对象名
sqlSessionTemplateRef = sqlSessionTemplate Bean对象名
- sql语句配置
- @Select(“select * from user”)
- @Insert(" insert into user ( name ) values (#{name}) ")
- @Delete(" delete from user where id= #{id} ")
- @Update("update user set name=#{name} where id=#{id} ")