springboot-Import注解

1.作用

  • 通常需要与自定义注解和一些Import接口(ImportSelector、ImportBeanDefinitionRegistrar和ImportAware)配合一起使用。在Import接口获取自定义注解中的参数并导入相关bean;

2. 示例:

  • EnableCaching注解:使用Import注解导入CachingConfigurationSelector;
//**导入AsyncConfigurationSelector
@Import(CachingConfigurationSelector.class)
public @interface EnableCaching {
    //**代理方式:
	AdviceMode mode() default AdviceMode.PROXY;
}
  • ImportSelector接口:CachingConfigurationSelector是ImportSelector的实现类,根据EnableCaching注解的mode参数,导入相关的bean;
public final String[] selectImports(AnnotationMetadata importingClassMetadata) {
    //**获取泛型的类型
	Class<?> annType = GenericTypeResolver.resolveTypeArgument(getClass(), AdviceModeImportSelector.class);
	Assert.state(annType != null, "Unresolvable type argument for AdviceModeImportSelector");
	
    //**根据泛型的类型获取注解
	AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(importingClassMetadata, annType);
	...
    
    //**获取注解中的AdviceMode参数
	AdviceMode adviceMode = attributes.getEnum(getAdviceModeAttributeName());
	//**把AdviceMode传给子类,让子类决定需要导入bean的名称
	String[] imports = selectImports(adviceMode);
	...
	return imports;
}

3.配合使用的相关Import接口

3.1.ImportSelector接口

  • ImportSelector接口selectImports方法返回需要导入bean的类名,通常是导入一些配置类
public interface ImportSelector {

	//**根据注解中的参数,返回需要导入到spring容器中的bean的类名
	String[] selectImports(AnnotationMetadata importingClassMetadata);

	//**返回一个排除函数,用于检测selectImports返回的类名是否需要排除
	//**排除函数返回true排除,返回false不排除
	@Nullable
	default Predicate<String> getExclusionFilter() {
		return null;
	}
}

3.2.ImportBeanDefinitionRegistrar接口

  • ImportBeanDefinitionRegistrar接口registerBeanDefinitions方法使用registry注册相关bean,通常是注册一些配置类
public interface ImportBeanDefinitionRegistrar {

    //**根据注解中的参数,使用registry注册相关bean,importBeanNameGenerator是bean的名称生成器
	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
			BeanNameGenerator importBeanNameGenerator) {
		registerBeanDefinitions(importingClassMetadata, registry);
	}

    //**根据注解中的参数,使用registry注册相关bean
	default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
	}

}

3.3.ImportAware接口

  • Aware接口,注入注解元数据,可获取注解中的参数;
  • 需要与@Configuration注解一起使用,ImportAware接口获取注解参数,然后在@Configuration中根据注解参数,使用@Bean注册相关bean,达到与上面两个接口一样的目的
public interface ImportAware extends Aware {

	//**Aware接口,注入注解元数据,可获取注解中的参数
	void setImportMetadata(AnnotationMetadata importMetadata);
}

//**根据注解元数据,获取注解中参数的相关代码
AnnotationAttributes enableCaching = AnnotationAttributes.fromMap(importMetadata.getAnnotationAttributes(EnablCaching.class.getName(), false));
int order = enableCaching.<Integer>getNumber("order");
### 使用 Spring Boot 和 Redis 进行注解开发 #### 1. 创建 Spring Boot 项目 为了开始使用 Spring Boot 和 Redis 的注解开发,首先需要创建一个新的 Spring Boot 项目。可以利用 Spring Initializr 来快速搭建基础环境[^1]。 #### 2. 添加依赖 接着,在 `pom.xml` 文件中加入必要的依赖项以便能够访问 Redis 数据库。具体来说就是引入 `spring-boot-starter-data-redis` 启动器: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 这一步骤确保了应用程序具备连接到 Redis 并执行基本命令的能力[^2]。 #### 3. 配置 Redis 随后,在配置文件 (`application.properties`) 中指定 Redis 实例的位置和其他参数,例如主机地址、端口号以及认证信息等: ```properties spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.database=0 ``` 这些设置使得应用能够在运行时找到并正确地与目标 Redis 节点通信[^3]。 #### 4. 编写业务逻辑代码 对于基于注解的方式而言,主要关注于定义实体类及其关联的操作方法。下面是一个简单的例子展示如何通过 @RedisHash 注解声明一个映射至 Redis Hash 结构的 Java 类型,并为其提供 CRUD 方法支持: ```java import org.springframework.data.annotation.Id; import org.springframework.data.redis.core.RedisHash; @RedisHash("users") // 表明该对象存储在名为 "users" 的哈希表里 public class User { @Id private Long id; // 主键字段,默认会作为 key 存储 private String name; // 用户名属性 public User() {} public User(Long id, String name) { this.id = id; this.name = name; } // Getter and Setter methods... } ``` 此外还需要编写相应的 Repository 接口继承自 CrudRepository 或 JpaRepository ,从而获得一系列预设的数据持久化接口函数: ```java import org.springframework.data.repository.CrudRepository; public interface UserRepository extends CrudRepository<User, Long> {} ``` 这样就可以方便地对上述定义的对象实施增删改查等一系列数据库操作而无需手动编码 SQL 查询语句。 #### 5. 控制层集成 最后一步是在控制层(Controller)中注入之前建立的服务组件并通过 RESTful API 形式对外暴露数据交互入口。这里给出一段简易示例说明怎样接收来自客户端提交的信息并将之保存进 Redis : ```java @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserRepository userRepository; @PostMapping("") public ResponseEntity<String> createUser(@RequestBody User user){ try{ userRepository.save(user); return new ResponseEntity<>("User created successfully", HttpStatus.CREATED); }catch (Exception e){ return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR); } } // Other endpoints like GET, PUT, DELETE can be added similarly. } ``` 以上即完成了整个流程——从初始化工程到最后部署 Web 服务的过程介绍。值得注意的是实际应用场景下可能还会涉及到更多细节调整和技术选型考量,比如安全性加固措施或是性能优化策略等方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值