资讯专栏INFORMATION COLUMN

JavaConfig方式以及处理自动装配歧义性-spring基础学习

2shou / 1291人阅读

摘要:介绍在配置和直接注解式配置之外还有一种有趣的选择方式,是指基于配置的。传统的一般都是基本配置的,后来新增了许多的注解,特别是,基本都是清一色的。代码如下创建对象创建对象创建一个对象运行后的两种结果

1.javaconfig介绍

在XML配置和直接注解式配置之外还有一种有趣的选择方式-JavaConfig,java config是指基于java配置的spring。传统的Spring一般都是基本xml配置的,后来spring3.0新增了许多java config的注解,特别是spring boot,基本都是清一色的java config。下面用一段简单的程序来演示.
完整代码已上传github:https://github.com/SunPiHai/s...

2. 使用IDEA创建一个Maven项目结构图

3. 在pom.xml 中引用依赖
 
            org.springframework
            spring-context
            4.3.13.RELEASE
        
        
            org.springframework
            spring-test
            4.3.13.RELEASE
        
4. 代码说明和实现
Dao层和Service层不赘述了,简单实现一个add()方法
AppConfig配置类

用@Configuration注解该类,等价 与XML中配置beans;用@Bean标注方法等价于XML中配置bean,被注解的类内部包含有一个或多个被@Bean注解的方法
UserDaoNormal

@Configuration
public class AppConfig {
    @Bean
    public UserDao userDaoNormal(){
        System.out.println("创建UserDaoNormal对象");
        return new UserDaoNormal();
    @Bean
    public UserDao userDaoCache() {
         System.out.println("创建UserDaoCache对象");
         return new UserDaoCache();
     }
    @Bean
    public UserService userServiceNormal(UserDao userDao){
        System.out.println("创建一个UserService对象");
        return new UserServiceNormal(userDao);
    }
}
UserServiceTest测试类

@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境
@ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件
多个配置文件:@ContextConfiguration(locations = { "classpath:/spring1.xml", "classpath:/spring2.xml" })

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
    @Autowired
    private UserService userService;
    @Test
    public void addTest(){
        userService.add();
    }
}
5.处理自动装配的歧义性

运行后却报异常出错!

问题是出现了依赖注入的歧义性,UserDao不能够进行自动装配.简单来说,在spring容器中找到了一个以上的UserDao类型的对象,所以不知道到底要哪个,我在UserDao接口写了两个实现add()方法的类,有一个UserDaoNormal对象和一个UserDaoCache对象,所以无法正常进行依赖注入.
解决的办法有几个:

1.@primary注解

在AppConfig配置文件里根据需要在两个对象方法上在其中一个添加 @primary注解,说明这个对象是依赖注入的首选bean.

2.@Qualifier注解

Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,添加@Qualifier注解,需要注意的是@Qualifier的参数名称为我们之前定义@Qualifier注解的名称之一。
代码如下

@Configuration
public class AppConfig {
    @Bean
    @Qualifier("normal")
    public UserDao userDaoNormal(){
        System.out.println("创建UserDaoNormal对象");
        return new UserDaoNormal();
    }
     @Bean
     @Qualifier("cache")
    public UserDao userDaoCache() {
         System.out.println("创建UserDaoCache对象");
         return new UserDaoCache();
     }
    @Bean
    public UserService userServiceNormal(@Qualifier("normal") UserDao userDao){
        System.out.println("创建一个UserService对象");
        return new UserServiceNormal(userDao);
    }
}
3.@Qualifier注解和bean id

同样的,@Qualifier的参数名称为我们之前定义@bean注解的名称之一。
代码如下:

     @Bean("normal")
    public UserDao userDaoNormal(){
        System.out.println("创建UserDaoNormal对象");
        return new UserDaoNormal();
    }
     @Bean("cache")
    public UserDao userDaoCache() {
         System.out.println("创建UserDaoCache对象");
         return new UserDaoCache();
     }
    @Bean
    public UserService userServiceNormal(@Qualifier("normal") UserDao userDao){
        System.out.println("创建一个UserService对象");
        return new UserServiceNormal(userDao);

如果我们不给bean起一个约定的id,会有一个默认的id,实际上就是@bean所在的方法的方法名.@Qualifier的参数名称为@bean所在的方法的方法名的名称之一。
代码如下:

@Bean
    public UserDao userDaoNormal(){
        System.out.println("创建UserDaoNormal对象");
        return new UserDaoNormal();
    }
     @Bean
    public UserDao userDaoCache() {
         System.out.println("创建UserDaoCache对象");
         return new UserDaoCache();
     }
    @Bean
    public UserService userServiceNormal(@Qualifier("userDaoCache") UserDao userDao){
        System.out.println("创建一个UserService对象");
        return new UserServiceNormal(userDao);
    }
6.运行后的两种结果


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73740.html

相关文章

  • spring入门指南

    摘要:装配提供了三种装配机制在中进行显示配置在中进行显示配置隐式的发现机制和自动装配机制。表示该类是一个组件,将自动创建该组件实例,表示注入组件实例,和功能类似,和功能类似,但和是规范中提供的注解。 基本原理 spring的基础是IOC和DI,其实IOC和DI是对同一件事从不同的方面进行描述的,两者在spring中是同一件事务。 IOC:控制反转,在这里就是指创建bean的主动权发生了转移,...

    shusen 评论0 收藏0
  • Spring - 高级装配

    摘要:高级装配条件化的自动装配与歧义性的作用域表达式语言环境与可以为不同的环境提供不同的数据库配置加密算法等注解可以在类级别和方法级别,没有指定的始终都会被创建的方式配置不同环境所需要的数据库配置会搭建一个嵌入式的数据库模式定义在测试数据通过加 高级装配 Spring profile 条件化的bean 自动装配与歧义性 bean的作用域 Spring表达式语言 环境与profile p...

    binta 评论0 收藏0
  • Spring IOC知识点一网打尽!

    摘要:使用的好处知乎的回答不用自己组装,拿来就用。统一配置,便于修改。 前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工厂模式,总的来说还是非常值得的! 本来想的是刷完《Spring 实战 (第4版)》和《精通Spring4.x 企业应用开发实战》...

    djfml 评论0 收藏0
  • Spring - 装配Bean

    摘要:装配任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入配置的可选方案在中进行显示配置在中进行显示配置隐式的发现机制和自动装配自动化装配组件扫描会自动发现应用上下文 装配Bean 任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的 创建应用对象之间协作关系的行为通常称为装配(wiring)...

    CNZPH 评论0 收藏0
  • 第二章 装配Bean

    摘要:构造器自动装配方法自动装配其他方法自动装配不管是构造器,方法还是其他的方法,都会去尝试满足方法参数上所声明的依赖。所以上面的输出是构造器自动装配方法自动装配其他方法自动装配使用进行自动装配的时候,需要注意一下几点。 完整代码请见:https://github.com/codercuixi... 创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质。 ...

    xcold 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<