resource


linux采用struct resource结构体来描述一个挂接在cpu总线上的设备资源(32位cpu的总线地址范围是0~4G
/usr/src/linux-2.6.21.5/include/linux/ioport.h

struct resource {
    resource_size_t start;
    resource_size_t end;
    const char      *name;
    unsigned long   flags;
    struct resource *parent, *sibling, *child;
};
 
start:  资源的起始地址;
end:   资源的结束地址;
name:资源的名称;
flag:   资源标的志位,描述资源的类型。
       可以为IORESOURCE_IO、IORESOURCE_MEM、IORESOURCE_IRQ、IORESOURCE_DMA等
    linux需要管理4G物理总线的所有空间,所以需要把挂接到总线上的各种设备链在一起,因此resource结构体提供了另外3个成员:指针parent、sibling和child:分别为指向父亲、兄弟和子资源的指针。以root source为例,root->child(*pchild)指向root所有孩子中地址空间最小的一个;pchild->sibling是兄弟链表的开头,指向比自己地址空间大的兄弟。
    linux会避免将一个已经被设备使用的总线物理地址区间段再分配给另一个设备,进而避免设备之间出现对同一总线物理地址段的重复引用,而造成对唯一物理地址的设备实体二义性.
   
struct platform_device {
 const char *name;
 int  id;
 bool  id_auto;
 struct device dev;
 u32  num_resources;
 struct resource *resource;
 const struct platform_device_id *id_entry;
 struct mfd_cell *mfd_cell;
 struct pdev_archdata archdata;
};

num_resources用于指定资源数,resource是指向资源数组的指针。
platform_device使用函数platform_get_resource来获取resource,该函数定义如下:
struct resource *platform_get_resource(struct platform_device *,unsigned int, unsigned int);
用法如下:
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
在较老的内核版本中,通常在kernel\linux-3.10.y\arch\arm\mach-xxx目录下的devices.c定义platform_device 实体变量和resource变量。
在3.x版本内核中platform_device不再静态定义,而是通过device tree来动态生成。


### @Resource 注解的使用方法与常见问题 @Resource 是 Java 提供的标准注解,来源于 JSR-250 规范。它主要用于依赖注入(Dependency Injection, DI),能够帮助开发者自动装配 Bean 的依赖[^2]。以下是关于 @Resource 注解的详细说明: #### 1. @Resource 注解的基本用法 @Resource 注解可以通过字段名或 setter 方法名自动匹配目标 Bean,并将其注入到指定的变量中。默认情况下,@Resource 按照名称(byName)进行查找和注入。如果没有找到匹配的名称,则会尝试按照类型(byType)进行查找。 示例代码如下: ```java import javax.annotation.Resource; public class UserService { // 默认按名称注入,查找名为 userDAO 的 Bean @Resource private UserDAO userDAO; public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public void performOperation() { userDAO.execute(); } } ``` 如果需要显式指定 Bean 的名称,可以通过 `name` 属性实现: ```java @Resource(name = "customUserDAO") private UserDAO userDAO; ``` #### 2. @Resource 注解的优先级 在 Spring 环境中,当同时存在 @Autowired 和 @Resource 注解时,@Resource 的优先级更高。Spring 会优先按照 @Resource 的规则进行注入[^3]。 #### 3. @Resource 与 @Autowired 的区别 尽管 @Resource 和 @Autowired 都可以用于依赖注入,但它们有以下主要区别: - **来源**:@Resource 是 JSR-250 标准的一部分,因此可以在非 Spring 环境下使用;而 @Autowired 是 Spring 框架特有的注解。 - **注入方式**:@Resource 默认按名称注入(byName),而 @Autowired 默认按类型注入(byType)。 - **适用场景**:如果希望在非 Spring 环境下保持注解的一致性,或者需要明确指定依赖 Bean 的名称,则推荐使用 @Resource[^3]。 #### 4. 常见问题及解决方法 ##### 问题 1:注入失败 如果 @Resource 注解无法正确注入目标 Bean,可能的原因包括: - 目标 Bean 的名称与字段名不匹配。 - 容器中不存在与字段名对应的 Bean。 解决方法:通过显式指定 `name` 属性来确保注入成功。 ```java @Resource(name = "specificBeanName") private MyService myService; ``` ##### 问题 2:多个相同类型的 Bean 导致注入失败 当容器中有多个相同类型的 Bean 时,@Resource 注解可能会因为无法唯一确定目标 Bean 而报错。 解决方法:确保每个 Bean 的名称唯一,并通过 `name` 属性明确指定目标 Bean。 ```java @Resource(name = "uniqueBeanName") private MyService myService; ``` ##### 问题 3:非 Spring 环境下的使用 @Resource 注解适用于非 Spring 环境(如 Java EE 应用服务器)。但在这种情况下,需要确保应用服务器支持 JSR-250 标准。 #### 5. 示例代码 以下是一个完整的示例,展示如何在 Spring 中使用 @Resource 注解: ```java import javax.annotation.Resource; @Component public class OrderService { @Resource(name = "paymentProcessor") private PaymentProcessor paymentProcessor; public void processOrder() { paymentProcessor.processPayment(); } } @Component("paymentProcessor") public class DefaultPaymentProcessor implements PaymentProcessor { @Override public void processPayment() { System.out.println("Processing payment..."); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值