Spring中关于注解的组件装配

  • 1)需求
    Controller组件中往往需要用到Service组件的实例,Service组件中往往需要用到 Repository组件的实例。Spring可以通过注解的方式帮我们实现属性的装配。

  • 2)实现依据
    在指定要扫描的包时,context:component-scan 元素会自动注册一个bean的后置处 理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记 了@Autowired、@Resource或@Inject注解的属性。

  • 3)@Autowired注解
    ①根据类型实现自动装配。

    ②构造器、普通字段(即使是非public)、一切具有参数的方法都可以应用@Autowired注解

@Controller(value = "aaa")
public class UserController {

    @Autowired
    private UserService userService;


    public void addUser(){
        userService.addUser();
    }

    public UserController() {
        System.out.println("UserController");
    }
}
@Service
public class UserServiceImpl implements UserService{
    @Qualifier("userDaoImpl")
    @Autowired
    private UserDao userDao;
    public UserServiceImpl() {
        System.out.println("UserServiceImpl");
    }

    @Override
    public void addUser() {
        userDao.addUser();
    }
}
@Repository
public class UserDaoImpl implements UserDao{
    public UserDaoImpl() {
        System.out.println("UserDaoImpl");
    }

    @Override
    public void addUser() {
        System.out.println("添加成功!");
    }
}

③默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。

④若某一属性允许不被设置,可以设置@Autowired注解的required属性为 false

⑤默认情况下,当IOC容器里存在多个类型兼容的bean时,Spring会尝试匹配bean 的id值是否与变量名相同,如果相同则进行装配。如果bean的id值不相同,通过类 型的自动装配将无法工作。此时可以在@Qualifier注解里提供bean的名称。Spring 甚至允许在方法的形参上标注@Qualifiter注解以指定注入bean的名称。

 @Qualifier("userDaoImpl")
    @Autowired
    private UserDao userDao;
    public UserServiceImpl() {
        System.out.println("UserServiceImpl");
    }

⑥@Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行自动装配。

⑦@Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。

⑧@Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。

4)@Resource
@Resource注解要求提供一个bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为bean的名称。

5)@Inject
@Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值