• 使用注解实现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>
  • 相关阅读:
    实际项目管理-1
    arcengine 错误
    一些视频技术类网站
    winform 组件之dotnetbar10.5.3
    winform 弹框的组件
    一个好的开源网站
    写webservice 注意点
    ww
    js
    瀑布流
  • 原文地址:https://www.cnblogs.com/yanguobin/p/11704036.html
Copyright © 2020-2023  润新知