`

spring exception--No unique bean of type

 
阅读更多
今天碰到一个问题,就是我现有项目需要加一个定时器任务,我的代码如下:
<!-- 每日数据同步 总数监测任务******************begin -->

	<bean id="dataMonitorServiceImpl"
		class="com.netqin.function.dataMonitor.service.impl.DataMonitorServiceImpl">
	</bean>
	<bean id="scheduledDataMonitorDetail"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="dataMonitorServiceImpl" />
		</property>
		<property name="targetMethod">
			<value>autoMonitorSyncStatus</value>
		</property>
	</bean>
	<bean id="dataMonitorCronReportTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="scheduledDataMonitorDetail" />
		</property>
		<property name="cronExpression">
			<value>0 41 10 * * ?</value>
		</property>
	</bean>
	<!-- 每日数据同步 总数监测任务******************end -->

这里我初始化了一个叫:dataMonitorServiceImpl的bean,这个bean是一个现有Service的实现类。

@Service
public class DataMonitorServiceImpl implements IDataMonitorService {
	Logger logger = Logger.getLogger(DataMonitorServiceImpl.class);
	@Autowired
	private IBaseDao dao;
	@Autowired
	private IDasBaseDao dasDao;
如上所示,我这里是用了注解@Service,spring会自动加载这个类,

因为上面我对这个bean有定义了一次,理论上来说会报错,因为同一个bean加载了两次,那么当向IDataMonitorService注入的时候就会发现有两个DataMonitorServiceImpl的bean,

但是我想想中的报错场景并没有发生,tomcat正常启动,我就很想知道为什么。

我把xml里面定义bean的名字改了一下,第一个字母改成大写,重启tomcat,ok,我看见了我想看见的错误:

No unique bean of type [com.netqin.function.dataMonitor.service.IDataMonitorService] is defined: expected single matching bean but found 2: [dataMonitorServiceImpl, DataMonitorServiceImpl]
很明显,后边那个bean是我在xml里面声明的,那么第一个就是我用annotation的@Service声明的,这就是说明

1. @Service在声明bean的时候如果不指定名称的话,会默认以类名的一个字母小写命名。

2. 当spring初始化bean时,会监测要初始化的bean是否已经存在相同名称的bean。

做出上面的两个结论之后,我又有了俩个疑问,

1. bean在初始化的时候,xml声明和annotation的声明初始化bean的先后顺序是怎么样的。

2. bean在监测是否有相同名称的bean的时候,是只检测名称一致性,还是说是在每个bean的类别下的名称一致性?

第一个问题的答案是这样的,他们的初始化的顺序是有你指定的xml所决定的,举个例子:

你在applicationcontext.xml(这里只是举例)里显示声明了annotation需要扫描的文件目录包括那些,然后接在在下面又声明了很多bean,这种情况就是先初始化annotation,在初始化xml生命的bean。

spring是依据你声明的顺序来初始化一切,spring会从最原始的spring的xml文件开始扫描,扫描一条处理一条,也可能你的spring又引用了很多别的xml配置,那也是一样的,看引入的先后顺序。

第二个问题我做了如下的实验,:

<bean id="dataMonitorServiceImpl"         	
		class="com.netqin.function.channel.service.impl.ChannelManagementServiceImpl">
	</bean>
	<!-- <bean id="dataMonitorServiceImpl"
		class="com.netqin.function.dataMonitor.service.impl.DataMonitorServiceImpl">
	</bean> -->
原先的bean我注释掉了 我换了一个,但是bean名字没变,

public DataMonitorServiceImpl(){
		System.out.println("DataMonitorServiceImpl is loaded!");
	}
我给DataMonitorServiceImpl写了一个空的构造方法,已确定他是否已经被spring装载。

ok,看看tomcat说什么:

 No unique bean of type [com.netqin.function.dataMonitor.service.IDataMonitorService] is defined: Unsatisfied dependency of type [interface com.netqin.function.dataMonitor.service.IDataMonitorService]: expected at least 1 matching bean
spring说没有这个类型的bean被定义,这个类型的bean被期望的是最少有一个匹配的bean。

第二个问题的答案就是spring在初始化bean的时候是只保持名称的一致性,这个其实和xml里面声明bean的时候bean不能重复是一致的,多了annotation也不影响。

总结一下今天的结论:

1. @Service在声明bean的时候如果不指定名称的话,会默认以类名的一个字母小写命名。

2. 当spring初始化bean时,会监测要初始化的bean是否已经存在相同名称的bean。

3. spring初始化bean的顺序依赖于你在xml里面配置的顺序。

4.spring在初始化bean的时候是只保持名称的一致性。

分享到:
评论

相关推荐

    spring学习----工厂Bean

    &lt;bean id="actualBean" factory-bean="myFactoryBean" factory-method="create"/&gt; ``` 在这个例子中,`myFactoryBean`是FactoryBean,`actualBean`是通过`myFactoryBean`的`create`方法创建的。 在标签"源码"中,...

    Spring--2.Spring 中的 Bean 配置-4

    `Spring--2.Spring 中的 Bean 配置-4-2.zip`文件可能包含了使用注解的例子,如`@Component`、`@Service`、`@Repository`和`@Controller`这些组件扫描的注解,以及`@Autowired`、`@Value`等用于属性注入的注解。...

    Spring--2.Spring 中的 Bean 配置-2-1

    - 如果不想通过默认构造函数创建Bean,可以使用`factory-bean`和`factory-method`来指定工厂Bean和工厂方法。 8. ** Profiles**: - Spring 3.1 引入了Profiles的概念,允许根据不同的环境配置不同的Bean。例如:...

    Spring--2.Spring 中的 Bean 配置-2-2

    在"Spring--2.Spring 中的 Bean 配置-2-2"这个主题下,我们将深入探讨如何在Spring中进行Bean的详细配置。 1. **XML配置方式:** 在早期版本的Spring中,Bean的配置主要通过XML文件来完成。一个典型的`beans`标签...

    spring 3.2.4.RELEASE jar包

    spring-context-3.2.4.RELEASE.jar spring-core-3.2.4.RELEASE.jar spring-beans-3.2.4.RELEASE.jar spring-test-3.2.4.RELEASE.jar spring-web-3.2.4.RELEASE.jar spring-aop-3.2.4.RELEASE.jar spring-webmvc-...

    Spring--2.Spring 中的 Bean 配置-1

    本文将深入探讨Spring中的Bean配置,主要基于标题"Spring--2.Spring 中的 Bean 配置-1"及其相关的上下文。 首先,我们要理解什么是Bean。在Spring中,Bean指的是由Spring容器管理的对象,这些对象可以通过XML、注解...

    spring-context-3.2.0 spring-core-3.2.0 等齐全的Spring jar包

    这里提到的是一组完整的Spring库,包括`spring-core`、`spring-context`、`spring-webmvc`、`spring-web`、`spring-beans`、`spring-test`、`spring-jdbc`、`spring-orm`、`spring-aop`和`spring-tx`,它们都是3.2.0...

    spring-context-4.2.xsd.zip

    `spring-context-4.2.xsd`包含了一系列元素,如`beans`、`bean`、`import`、`alias`、`bean-definition`等,这些都是Spring配置中的关键组成部分。例如,`&lt;beans&gt;`元素是所有配置的根元素,`&lt;bean&gt;`元素用于定义一个...

    spring-framework-4.1.6.RELEASE.rar

    spring-aop-4.1.6.RELEASE.jar spring-aspects-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-context-support-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE.jar ...

    spring-aware接口实现与bean作用域(spring多容器层面)

    在Spring框架中,`Spring-Aware`接口是一个重要的概念,它允许我们与Spring的应用上下文(ApplicationContext)进行交互,从而获取或操作由Spring管理的Bean。`ApplicationContextAware`是其中的一个典型接口,当...

    spring-beans-3.0.xsd

    首先,`spring-beans-3.0.xsd`是Spring 3.0版本中的beans配置文件,它定义了一系列元素和属性,允许开发者声明、配置和管理bean。例如,`&lt;bean&gt;`元素是配置中最基础的部分,用于定义一个bean实例,包括其类名、初始...

    spring-beans-5.1.0.RELEASE

    spring-beans-5.1.0.RELEASE,最新spring-bean jar包。

    springframework-4.2.5

    1. **Spring Core**:作为Spring框架的基础,`spring-core-4.2.5.RELEASE.jar`包含了IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)的核心概念。IoC通过反转对象的创建和管理,使得...

    官方原版源码spring-framework-5.1.4.RELEASE.zip

    首先,源码分析从`spring-framework-5.1.4.RELEASE-dist.zip`开始,这是Spring框架的基础组件包,包含了所有核心模块的类库和配置文件。主要模块有Core Container(核心容器)、Data Access/Integration(数据访问与...

    spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常.zip

    spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常 spring REST异常处理程序 这个项目的目的是为for提供一个方便的异常处理程序( 解析器),它满足了错误响应的最佳实践。 处理自定义异常。...

    intellij-spring-assistant-1.0.2.zip

    2021.8.23发布的"intellij-spring-assistant-1.0.2.zip"是一个更新版本,经过实际测试在IntelliJ IDEA的最新版中运行有效。 该插件的核心功能主要包括: 1. **代码智能提示**:SpringAssistant提供了强大的代码...

    spring-framework-5.0.4.RELEASEspring-framework-5.0.4.RELEASE

    Spring是什么呢?首先它是一个开源的项目,而且目前非常活跃...它实现了很优雅的MVC,对不同的数据访问技术提供了统一的接口,采用IOC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现Transaction Management

    mybatis-spring-1.3.0.jar 下载

    《深入解析mybatis-spring-1.3.0.jar:集成与应用》 在Java开发领域,MyBatis和Spring框架的结合使用是常见的实践,它们的整合使得数据访问层的构建更为便捷和灵活。本篇文章将围绕"mybatis-spring-1.3.0.jar"这一...

    Spring--2.Spring 中的 Bean 配置-3

    在Spring框架中,Bean配置是核心概念之一,它关乎到对象的创建、初始化、装配以及管理。本节我们将深入探讨Spring中的Bean配置,主要聚焦在第三部分,这通常涉及到更高级和灵活的配置方式。 首先,Spring允许我们...

Global site tag (gtag.js) - Google Analytics