zoukankan      html  css  js  c++  java
  • 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 。

  • 相关阅读:
    VUE.JS 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property 'xxxx' of undefined 的解决办法
    vue-cli:渲染过程理解2(vue init webpack方式创建)
    vue2 mint-ui loadmore(下拉刷新)
    vue-resource: jsonp请求百度搜索的接口
    vue中组件绑定事件时是否加.native
    vue 子组件修改父组件传来的props值,报错
    测试开发工程师的角色
    不要信仰BAT!
    简历不能怎么写?
    测试工程师面试,全国各地有哪些知名互联网公司可以去?
  • 原文地址:https://www.cnblogs.com/luler/p/14972677.html
Copyright © 2011-2022 走看看