@property 那些总结

本文详细介绍了Objective-C中@property的使用,包括 nonatomic、readwrite、readonly、assign、strong、weak、copy等属性关键字,并解释了它们如何影响内存管理和线程安全。

@property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?

属性可以拥有的特质分为四类:

  1. 原子性---nonatomic特质

    在默认情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备nonatomic特质,则不使用同步锁。请注意,尽管没有名为“atomic”的特质(如果某属性不具备nonatomic特质,那它就是“原子的” ( atomic) ),但是仍然可以在属性特质中写明这一点,编译器不会报错。若是自己定义存取方法,那么就应该遵从与属性特质相符的原子性。

  2. 读/写权限---readwrite(读写)readonly (只读)

  3. 内存管理语义---assignstrong、 weakunsafe_unretainedcopy
  4. 方法名---getter=<name> 、setter=<name>

    getter=<name>的样式:

      @property (nonatomic, getter=isOn) BOOL on;
    

    ( setter=<name>这种不常用,也不推荐使用。故不在这里给出写法。)

  5. 不常用的:nonnull,null_resettable,nullable
assign: 简单赋值,不更改索引计数(Reference Counting)对基础数据类
copy: 建立一个索引计数为1的对象,然后释放旧对象。对NSString
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 ,对其他NSObject和其子类
weak 和strong的区别:weak和strong不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
copy与retain:
copy其实是建立了一个相同的对象,而retain不是.
copy是内容拷贝,retain是指针拷贝.
copy是内容的拷贝 ,对于像NSString,的确是这样,如果拷贝的是 NSArray这时只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".
atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。


__block和__weak修饰符的区别:

__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
__block对象可以在block中被重新赋值,__weak不可以。




<think>我们被要求回答关于Spring框架中@Value和@PropertySource注解的使用方法及作用。 根据提供的引用,我们可以总结如下: 1. @PropertySource注解用于指定要加载的配置文件,通常与@Configuration或@Component注解一起使用。它可以加载类路径下的properties文件,使得文件中的键值对可以被Spring环境获取。 2. @Value注解用于将配置文件中的值注入到Spring管理的Bean的属性中。它支持SpEL表达式,可以直接注入字符串,也可以使用占位符(如`${jdbc.url}`)来引用配置文件中的属性。 具体使用方法: 使用@PropertySource注解: - 在配置类或组件类上使用@PropertySource,指定value属性(文件路径),可以指定多个文件,如:`@PropertySource({"classpath:config/db.properties", "classpath:config/other.properties"})` - 如果需要忽略不存在的文件,可以设置`ignoreResourceNotFound`属性为true。 使用@Value注解: - 在字段、构造函数参数、方法参数上使用@Value注解,并指定要注入的值或占位符表达式。 - 例如:`@Value("${jdbc.url}") private String url;`,这样就会从配置文件中读取key为`jdbc.url`的值并注入到url字段。 另外,引用[1]中展示了一种结合@PropertySource和@ConfigurationProperties的用法,可以批量将配置属性绑定到一个Bean上(前缀匹配)。 关于作用: - @PropertySource:将外部的属性配置文件加载到Spring的Environment中,以便在整个Spring应用上下文中使用。 - @Value:提供了一种便捷的方式将配置值、系统属性、表达式计算结果等注入到Bean的属性中。 注意:在Spring Boot中,通常使用application.properties/application.yml作为默认配置文件,无需显式使用@PropertySource,但如果有额外的配置文件,则可以使用@PropertySource加载。 同时,引用[2]提到@PropertySource的解析时机:在扫描@Component注解时顺便扫描@PropertySource,具体是在BeanDefinitionRegistryPostProcessor的实现类中处理的。 下面我们给出一个示例代码: 假设有一个配置文件config.properties: app.name=MyApplication app.version=1.0.0 然后我们可以这样使用: ```java @Configuration @PropertySource("classpath:config.properties") public class AppConfig { @Value("${app.name}") private String appName; @Value("${app.version}") private String appVersion; // 可以通过getter方法获取,或者在其他Bean中通过@Autowired注入这个配置类的实例 public String getAppName() { return appName; } public String getAppVersion() { return appVersion; } } ``` 或者,我们可以使用@ConfigurationProperties进行类型安全的绑定(如引用[1]所示): ```java @Component @PropertySource("classpath:config.properties") @ConfigurationProperties(prefix = "app") public class AppProperties { private String name; private String version; // getters and setters } ``` 这样,在AppProperties中,name字段将对应配置文件中的app.name,version字段对应app.version。 最后,我们生成相关问题: 相关问题: 1. @Value注解能否注入集合类型的属性? 2. 如何解决多个@PropertySource加载的配置文件中存在相同key的情况? 3. 除了@PropertySource,Spring Boot还提供了哪些加载配置的方式? 4. @Value注解和@ConfigurationProperties注解在注入配置属性时有何优缺点? </think>### @Value 和 @PropertySource 的使用方法及作用详解 #### 一、@PropertySource 的作用与方法 1. **核心功能** 用于显式加载指定的配置文件(如 `.properties` 文件)到 Spring 的环境变量(Environment)中,使配置内容可被 Spring 容器识别[^1][^3][^4]。 2. **基本用法** ```java @Configuration @PropertySource("classpath:config/jdbc.properties") // 加载类路径下的配置文件 public class AppConfig { // 配置类内容 } ``` - 支持多文件加载:`@PropertySource({"file1.properties", "file2.properties"})` - 支持忽略缺失文件:`@PropertySource(value = "file.properties", ignoreResourceNotFound = true)` 3. **注意事项** - 默认仅支持 `.properties` 文件,需自定义解析器处理其他格式(如 YAML) - 加载时机:在 Spring 扫描 `@Component` 时解析,**早于 Bean 实例化**[^2] - `name` 属性未指定时,自动通过 `Resource.getDescription()` 生成唯一标识[^3] #### 二、@Value 的作用与方法 1. **核心功能** 动态注入属性值到 Spring Bean 的字段或方法参数中,支持: - 配置文件中的键(通过 `${key}` 占位符) - 硬编码值(如 `@Value("张三")`) - SpEL 表达式(如 `@Value("#{systemProperties['user.name']}")`)[^5][^4] 2. **基本用法** ```java public class DatabaseConfig { @Value("${jdbc.url}") // 注入配置文件中的值 private String url; @Value("default_user") // 直接注入字面量 private String username; } ``` 3. **配合 @PropertySource 使用** ```java @Configuration @PropertySource("classpath:jdbc.properties") // 先加载配置 public class Config { @Value("${db.driver}") private String driver; // 后注入值 } ``` #### 三、联合使用示例 ```java @Component @PropertySource("classpath:app.properties") // 加载配置 public class ServiceImpl { @Value("${app.timeout:5000}") // 注入值(带默认值5000) private int timeout; } ``` - **流程**: 1. `@PropertySource` 将 `app.properties` 加载到 Spring Environment 2. `@Value` 从 Environment 中解析 `${app.timeout}` 并注入字段 #### 四、常见问题解决方案 1. **注入失败检查** - 确保配置文件路径正确(`classpath:` 表示资源目录) - 检查属性键是否存在拼写错误 - 确认 `@PropertySource` 所在的配置类已被 Spring 扫描 2. **优先规则** 相同属性键时,后加载的配置文件会覆盖先加载的值。 #### 五、对比其他方案 | 注解 | 适用场景 | 优势 | |---------------------|----------------------------------|-----------------------------| | `@Value` | 简单属性注入 | 灵活支持 SpEL 和默认值 | | `@ConfigurationProperties` | 批量绑定结构化配置(如对象嵌套) | 类型安全,IDE 自动补全[^1] | ### 相关问题 1. 如何在 `@Value` 中设置属性不存在时的默认值? 2. `@PropertySource` 加载的配置文件能否动态刷新?如何实现? 3. Spring Boot 的 `application.properties` 与自定义 `@PropertySource` 配置的优先级关系是什么? 4. 使用 `@Value` 注入数组或集合类型的数据该如何操作? 5. 如何通过自定义 `PropertySourceFactory` 实现 YAML 配置的加载? [^1]: Spring 中使用 `@ConfigurationProperties` 批量绑定配置属性。 [^2]: `@PropertySource` 在 Bean 实例化前由 `BeanDefinitionRegistryPostProcessor` 解析。 [^3]: `@PropertySource` 的 `name` 默认通过 `Resource.getDescription()` 生成。 [^4]: `@Value` 支持直接注入字面量或配置文件属性。 [^5]: `@Value` 支持 SpEL 表达式实现动态赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值