博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaConfig方式以及处理自动装配的歧义性_spring基础学习
阅读量:6846 次
发布时间:2019-06-26

本文共 3688 字,大约阅读时间需要 12 分钟。

1.javaconfig介绍

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

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

@Configurationpublic 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注解的名称之一。 代码如下

@Configurationpublic 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.运行后的两种结果

转载地址:http://fbmul.baihongyu.com/

你可能感兴趣的文章
小白学python系列-(1)环境的安装
查看>>
eclipse 快捷键
查看>>
exchange 2016 EMS控制台报错Winrm HTTP 403
查看>>
java_vuser脚本编写httppost方式发送stream进行接口测试
查看>>
我的友情链接
查看>>
Java调用.NET webservice方法的几种方式
查看>>
Swoole 实例三(Timer定时器)
查看>>
Hyper-V Server 2008 R2安装、配置
查看>>
MYSQL-字符校对规则探究
查看>>
HTTPClient模拟登陆21CN
查看>>
Golang 用指定网卡的IP发送HTTP请求
查看>>
网站安全狗IIS版 V4.0.15586 发布
查看>>
Docker存储驱动之AUFS简介
查看>>
Java中如何封装自己的类,建立并使用自己的类库?
查看>>
Java Http请求工具类
查看>>
iscsi集群搭建
查看>>
Flutter Web - 目标全平台开发的Flutter再下一城!
查看>>
Nginx代理Tomcat
查看>>
Apache与Tomcat的区别
查看>>
mysql—Access denied for user 'root'@'localhost' (using password:NO)
查看>>