@Autowired默认按照类型进行注入

本文深入解读Spring框架中的自动装配与手动装配机制,详细介绍了`@Autowired`注解的不同使用方式,包括按类型、名称、构造器及自检装配,并通过示例代码展示了实际应用。同时,文章探讨了`@Component`注解的作用及其在分层开发中的应用,以及如何通过`@Resource`注解实现依赖注入。
@Autowired默认按照类型进行注入
@Autowired @Qualifier("personDaoxxx")这样就是按照名称进行装配
@Autowired(required=true)必须注入值,不能为null,为false无论注入什么值都是null

以上都是手工装配
自动装配依赖对象
对于自动装配,大家了解一下就可以了,实在不推荐大家使用。例子:
<bean id=”…” class=”….”>
autowire属性取值如下:
byType:按类型装配,可以根据属性的类型,在容器中寻找根该类型匹配的bean.如果发现多个,那么将会抛出异常。如果没有找到,即属性值为null。
byName:按名称装配,可以根据属性的名称,在容器中寻找根该属性名相同的bean,如果没有找到,即属性值为null。
Constructor与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
Autodetect:通过bean类的自省机制来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。

0


http://zhidao.baidu.com/link?url=4T5FVlKL1HqHHpGSCwCXI3h3QaZZ0HRe_9gnFuZE74pRMJ2L0LF64ZzoNVTAdq7y2EY_at8_5QVYsnhltr_o7K

@Component("userManager")
public class UserManagerImpl implements UserManager {
private UserDao userDao ;
public UserDao getUserDao() {
return userDao;
}
@Resource
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/* (non-Javadoc)
* @see com.wjs.registration.service.UserManager#exists(com.wjs.registration.model.Users)
*/
public boolean exists(Users u){
return userDao.checkUserExistsWithName(u.getUsername());
}
/* (non-Javadoc)
* @see com.wjs.registration.service.UserManager#add(com.wjs.registration.model.Users)
*/
public void add(Users u){
userDao.save(u);
}
}
这里表示什么意思哦@Component("userManager")

在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释

这里就是说把这个类交给Spring管理,重新起个名字叫userManager,由于不好说这个类属于哪个层面,就用@Component

参考地址:http://www.ulewo.com/user/10001/blog/273
### @Autowired 默认类型注入的行为 Spring 框架中的 `@Autowired` 注解是实现依赖注入的核心机制之一,其默认行为是根据类型(byType)进行自动装配。在容器中查找与目标字段、方法或构造器参数类型匹配的 Bean,并将其注入到对应的位置。这种按类型注入的方式能够有效减少手动配置,提高开发效率,并增强代码的可维护性[^3]。 然而,当 Spring 容器中存在多个相同类型的 Bean 时,`@Autowired` 的默认行为将无法唯一确定需要注入的 Bean,此时 Spring 会抛出异常,提示存在多个匹配项。例如,如果定义了两个 `MyService` 类型的 Bean,Spring 将无法确定应该注入哪一个实例,从而导致启动失败。 ### 如何处理多个相同类型的 Bean 为了解决多个相同类型 Bean 的问题,`@Autowired` 可以结合 `@Qualifier` 注解使用。`@Qualifier` 允许开发者通过指定 Bean 的名称来进一步限定注入的目标。例如,当存在两个 `MyService` 类型的 Bean 时,可以通过 `@Qualifier("specificService")` 明确指出需要注入的 Bean 名称,从而避免冲突[^1]。 #### 示例代码: ```java @Service public class MyServiceImpl1 implements MyService { // 实现细节 } @Service public class MyServiceImpl2 implements MyService { // 实现细节 } @Component public class MyComponent { @Autowired @Qualifier("myServiceImpl1") private MyService myService; } ``` 在上述示例中,`MyComponent` 中的 `myService` 字段被明确指定注入 `myServiceImpl1`,即 `MyServiceImpl1` 对应的 Bean 名称。通过这种方式,即使存在多个相同类型的 Bean,也可以确保注入的准确性。 ### 注入过程中的优先级与查找机制 在 Spring 的依赖注入流程中,`@Autowired` 的注入行为通常分为两个阶段:首先,在实例化 Bean 后,Spring 会预先查找所有需要注入的点(即字段、方法或构造器参数),并记录这些注入点;接着,在 Bean 的初始化阶段,Spring 会根据这些记录完成实际的注入操作。这一过程由 `applyMergedBeanDefinitionPostProcessors` 等内部机制协调完成[^2]。 在查找 Bean 时,`@Autowired` 首先按照类型匹配,如果找到多个匹配项,则进一步按照名称匹配。这种机制确保了即使在复杂场景下,也能尽可能找到合适的注入目标,同时通过 `@Qualifier` 提供了更细粒度的控制。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值