使用注解实现IoC

时间:2019-10-19
本文章向大家介绍使用注解实现IoC,主要包括使用注解实现IoC使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、注解定义Bean组件

Spring从2.0版本开始引入注解的配置方式,将Bean的配置信息和Bean实现类结合在一起,进一步减少了配置文件的代码量。

@Component("userDao")
public class UserDaoImpl implements UserDao{
    //省略
}

@Component("userDao")的作用与在XML配置文件中编写<bean id="userDao" class="edu.cn.dao.Impl.UserDaoImpl"/>等效。

除了@Component,Spring还提供了3个特殊的注解,如下

  • @Repository  用于标注DAO类
  • @Service     用于标注业务类
  • @Controller   用于标注控制器类

二、注解装配Bean组件

1、@Autowired注解

Spring提供了@Autowired注解实现Bean的装配,如下

import org.springframework.stereotype.Service
import org.springframework.beans.factory.annotation.Autowired

@Service("userService")
public class UserServiceImpl implements UserService{
    @Autowired
    private UserDao dao;
} 

@Autowired为dao属性注入所依赖的对象,Spring将直接对dao属性进行赋值,此时类中可以省略属性相关的setter方法。

@Autowired采用按类型匹配的方式为属性自动装配合适的依赖对象,即容器会查找和属性类型相匹配的Bean组件,并自动为属性注入。若容器中有一个以上类型相匹配的Bean时,则可以使用@Qualifier指定所需的Bean的名称。

import org.springframework.stereotype.Service
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier

@Service("userService")
public class UserServiceImpl implements UserService{
    //为dao属性注入名为userDao的Bean
    @Autowired
    @Qualifier("userDao")
    private UserDao dao;
}

1.1、@Autowired注解扩展

  • @Autowired也可以对方法的入参进行标注,如下
@Service("userService")
public class UserServiceImpl implements UserService{
    private UserDao dao;

    @Autowired
    public void setDao(@Qualifier("userDao") UserDao dao){
        this.dao = dao;
    }
}
  • @Autowired也可用于构造方法,实现构造注入,如下
@Service("userService")
public class UserServiceImpl implements UserService{
    private UserDao dao;

    @Autowired
    public UserServiceImpl(@Qualifier("userDao") UserDao dao){
        this.dao = dao;
    }
} 
  • 使用@Autowired注解进行装配时,如果找不到相匹配的Bean组件,Spring容器会抛出异常。此时如果依赖不是必需的,为避免抛出异常,可以将required属性设置为false。默认为true,如下
@Service("userService")
public class UserServiceImpl implements UserService{
    @Autowired(required = false)
    private UserDao dao;
} 
  • 如果对类中集合类型的成员变量或方法入参使用@Autowired注解,Spring会将容器中所有和集合中元素类型匹配的Bean组件都注入进来,如下
@Component
public class TaskQueue{
    @Autowired(required = false)
    private List<Job> toDoList;
}

在上述代码中,Spring会将Job类型的Bean组件都注入给toDoList属性。

2、@Resource注解

Spring还支持使用JSR-250中定义的@Resource注解实现组件装配,该注解也能对类的成员变量或方法入参提供注入功能。

JSR全称是Java Specification Requests,即Java规范提案。Java的版本及其功能在不断的更新和扩展,JSR就是用来规范这些功能及其接口的标准,已经成为Java业界的一个重要标准。

@Resource有一个name属性,默认情况下,Spring将这个属性的值解释为要注入的Bean的名称,如下

@Service("userService")
public class UserServiceImpl implements UserService{
    @Resource(name = "userDao")
    private UserDao dao;
} 

如果没有显示的指定Bean的名称,@Resource注解将根据字段名或者setter方法名产生默认的名称。如果注解应用于字段,将使用字段名作为Bean的名称;如果注解应用于setter方法,Bean的名称就是通过setter方法得到的属性名,如下

@Service("userService")
public class UserServiceImpl implements UserService{
    //查找名为dao的Bean,并注入给dao属性
    @Resource
    private UserDao dao;
}
@Service("userService")
public class UserServiceImpl implements UserService{
    //查找名为userDao的Bean,并注入给setter方法
    private UserDao dao;

    @Resource
    public void setUserDao(UserDao userDao){
        this.dao = userDao;
    }
}

如果没有显示的指定Bean的名称,且无法找到与默认Bean名称匹配的Bean组件,@Resource注解会由按名称查找的方式自动变为按类型匹配的方式进行装配。

三、加载注解定义的Bean组件

在XML配置文件中使用context命名空间下的component-scan标签扫描注解标注的类。bace-package属性指定了需要扫描的基准包(多个包可用逗号隔开)。Spring会扫描这些包中所有的类,获取Bean的定义信息。

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="service,dao"/> </beans>

原文地址:https://www.cnblogs.com/yanguobin/p/11704036.html