Spring全家桶:常用注解

常用注释全解

1. Bean定义

@Component

  • 功能
    把普通pojo实例化到spring容器中,把任意 类/方法 标识成可装配的 bean。
    相当于配置文件中的:

<bean id="" class=""/>

  • 作用于
    标注在 bean实现类:类会作为组件类,Spring要为这个类注册bean 到Spring容器中

  • 特点

    1. 注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。
    2. 纯粹是声明性的
  • 使用:用于自动检测类路径扫描 自动配置bean。

通用的注解,MVC中如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。

  • @Component 衍生注解:
    @Controller
    @Service
    @Repository
    @Configuration

依附于 @Configuration 配置类

  • 功能
    Spring配置文件,声明配置类,相当于配置文件中的

<beans>

  • 作用于
    标注类 可以使用 @Component注解替代
  • 使用
    配置类的位置一般放在最外层的包目录下。
    因为 spring进行扫描时,会以配置类所在的包为基础扫描
@Bean
  • 功能
    相当于配置文件中的

<bean>标签

  • 作用于
    标注在@Configuration类中的 方法:该方法会返回一个对象,Spring要为这个对象注册bean 到Spring容器中
  • 特点:
    1. 显式声明单个bean,可以精确地创建和配置bean。(一个方法一个bean)
    2. 将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

  1. 从配置文件读取值
    @Value("${property}")
    @Value("${property:默认值}")
  2. 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的衍生注解

  1. @Controller 标注类 : 对应 Spring MVC 控制层Controller对象,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
  2. @Service 标注类 : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
  3. @Repository 标注类 : 对应持久层即 Dao 层,主要用于数据库相关操作。

http Request 请求处理方法映射

  1. @RequestMapping标注类,方法 : http路径映射到处理类或方法
  2. @GetMapping() 标注方法 : http GET请求路径映射
  3. @PostMapping()标注方法 : http POST请求路径映射
  4. @PutMapping标注方法 : http PUT请求路径映射
  5. @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} ")
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyc1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值