Spring IOC 开发中基于注解的配置

1. 定义 Bean

@Component("UserDao")
public class UserDao {
    ...
}

使用 @Component 注解在类上进行标注,标注后的类可以被 Spring 识别, Spring 容易自动将类转换为容易管理的 Bean。

除了 @Component 外, spring 还提供了 3 个功能基本与 @Component 等效的特定注解:

  • @Repository:用于对 DAO 实现类进行标注。

  • @Service:用于对 Service 实现类进行标注。

  • @Controller:用于对 Controlle 实现类进行标注。

这 3 个注解作用与 @Component 完全一样,完全可以用 @Component 替代。

但是,还是推荐使用特定的注解进行标注特定的 Bean,毕竟这样一眼就能看出 Bean 的真实身份。

2. 自动装配 Bean

1. 使用 @Autowired 自动注入

Spring 通过 @Autowired 注解实现 Bean 的依赖注入。

@Autowired 可作用于类属性或方法上。

@Service
public class LogonService {
    // 分别注入 LogDao 和 LogDao 的 Bean
    @Autowierd
    private LogDao logDao;
    @Autowierd
    private UserDao userDao;
    ...
}

@Autowired 默认按类型(byType)匹配的方式在容器中查找匹配的 Bean,当有且仅有一个匹配的 Bean 时,Spring 将其注入 @Autowired 标注的变量中。

2. 使用 @Autowired 的 required 属性

如果容器中没有一个和标注变量类型匹配的 Bean,那么 Spring容器启动时就会抛出 NoSuchBeanDefinitionException 异常。

如果希望匹配不到时也不要抛出异常,可以使用 @Autowired(required = false) 进行标注。

@Service
public class LogonService {
    @Autowierd(required = false)
    private LogDao logDao;
    ...
}

默认情况下,@Autowired 的 required 属性值为 true。

3. 使用 @Qualifier 指定注入 Bean 的名称

如果容器拥有一个以上匹配的 Bean 时,则可以通过 @Qualifier 注解限定 Bean 的名称。

@Service
public class LogonService {
    @Autowierd
    private LogDao logDao;
    
    // 注入名为 userDao1,类型为 UserDao 的 Bean
    @Autowierd
    @Qualifier("userDao1")
    private UserDao userDao;
    ...
}

就假设容器有两个类型为 UserDao 的 Bean,一个名为 userDao1,另一个名为 userDao2,则这里就会注入名为 userDao1 的 Bean。

4. 对类方法进行标注

@Autowierd 可以对成员变量及方法的参数进行标注。

@Service
public class LogonService {
    private LogDao logDao;
    private UserDao userDao;
    
    @Autowierd
    public void setLogDao(LogDao logDao){
        ...
    }
    
    // 将名为 UserDao 的 Bean 传给方法参数
    @Autowierd
    @Qualifier("UserDao")
    public void setUserDao(UserDao userDao){
        ...
    }
    
    // @Qualifier 也可以写在参数前面,给指定的参数进行注入
    @Autowierd
    public void init(@Qualifier("UserDao")UserDao userDao, LogDao logDao){
        ...
    }
}

虽然 Spring 支持在属性和方法上标注自动注入注解 @Autowierd,但实际开发中建议采用在方法上标注 @Autowierd 注解,因为这样更符合面向对象。

5. 懒加载@Lazy

也叫延迟加载,即在 Spring 容器启动的时候,对于在 Bean 上标注 @Lazy 及 @Autowierd 注解的属性,不会立即注入属性值,而是到调用此属性的时候才会注入属性值。

...
@Lazy //标注懒加载
@Repositoey
public class LogDao{
}

@Service
public calss LogonService implements BeanNameAware{
    
    @Lazy //标注懒加载
    @Autowierd
    public void setLogDao(LogDao logDao){...}
}

要注意的是 @Lazy 注解必须同时标注在属性及目标 Bean 上,二者缺一则无效。

@Resource

@Resource 与 @Autowierd 的作用类似,都是提供自动注入的功能。

不同的是,@Resource 是按名称匹配注入。@Resource 要球提供一个 Bean 名称的属性,如果属性为空,则自动采用标注处的变量名或方法名作为 Bean 的名称。

public class Boss {
    private Car car;
    
    //注入名为 car 的 Bean
    @Resource("car")
    private void setCar(Car car){
        ...
    }
}

@Resource 是按名称匹配注入 Bean,@Autowierd 默认按类型匹配注入 Bean。

但是@Resource 的功能没有 @Autowierd丰富,@Autowierd 和 @Qualifier结合则能代替 @Resource 。

posted @ 2021-03-15 15:36  乐子不痞  阅读(58)  评论(0编辑  收藏  举报
回到顶部