`
fuhuijun
  • 浏览: 32065 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring注入接口的实现类报错分析

阅读更多

说明:

1、本实例用的是注解方式,spring配置已省略

2、使用aop管理事务

     <aop:pointcut expression="execution (* com.test.service.impl.*.*(..))" id="services"/>

 

直接看例子:

    一、 A.java

 

package com.test
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class A {
	@Autowired
	private BImpl bImpl;//注入的是接口的实现类
	
	public void save(){
		bImpl.save();
	}
}

 

 

 

 

   二、B.java 

 

package com.test

public interface B {
	public void save();
}

 

 

 

 

   三、BImpl.java  ,B接口的实现类

 

package com.test
import org.springframework.stereotype.Service;

@Service
public class BImpl implements B {
	@Override
	public void save() {
		System.out.println("BImpl.save()");
	}

}

 

 

 

 

异常: 服务启动会报以下错误:

 No matching bean of type [BImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

可见bean装配时出现异常

 

源码分析:

   DefaultListableBeanFactory.java

 

//@param type 类A中的引用BImpl的类型
private String[] doGetBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit) {
   //所有已定义的bean,此例中beanName为bImpl
   String[] beanDefinitionNames = getBeanDefinitionNames();
   for (String beanName : beanDefinitionNames) {
      ........
      //@param beanName
      //@param type--com.test.BImpl
      boolean matchFound = isTypeMatch(beanName, type);//转AbstractBeanFactory.isTypeMatch()
      ........
   }
}

 

 

AbstractBeanFactory.java

 

public boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException {
	String beanName = transformedBeanName(name);
	Class<?> typeToMatch = (targetType != null ? targetType : Object.class);

	Object beanInstance = getSingleton(beanName, false);
	......
	return ClassUtils.isAssignableValue(typeToMatch, beanInstance);//转ClassUtils.isAssignable()
	......
}

 

 

 ClassUtils.java

 

class ClassUtils {
	......
	//lhsType -- com.test.BImpl
	//rhsType -- 从spring容器中取出Bean
	public static boolean isAssignable(Class<?> lhsType, Class<?> rhsType) {
		//lhsType是否等于或是rhsType表示类的或接口的父类
		if (lhsType.isAssignableFrom(rhsType)) {
			return true;
		}
		......
		return false;
	}
	......
}

 

结论:

1、此例中如果注入的类型为接口B

     lhsType.isAssignableFrom(rhsType)返回为true,启动成功

2、此例中如果注入的类型为BImpl

    A、BImpl实现了接口B,则rhsType为JDK动态代理对象,lhsType.isAssignableFrom(rhsType)返回false,启动失败

    B、BImpl不实现接口B,则rhsType为CGLIB代理对象(继承目标类),lhsType.isAssignableFrom(rhsType)返回true,启动成功

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    spring和mybatis整合 jar包

    7. **Spring DAO层集成**:通过@Autowired注解,Spring可以自动注入SqlSessionTemplate或SqlSessionDaoSupport,这两个类提供了执行MyBatis SQL操作的方法。 8. **Service层开发**:在Service层,通过调用DAO层的...

    ssm例子一直报错userDao无法注入

    1. **配置文件错误**:检查Spring的配置文件(如`applicationContext.xml`或`beans.xml`),确保`UserDao`接口的实现类已经被正确地定义为bean,并且设置了正确的扫描路径。例如: ```xml &lt;!-- 如果UserDaoImpl...

    hibernate注入的三种方式

    在探讨Hibernate注入的三种方式时,我们主要关注的是如何在Spring框架中整合Hibernate,以便实现对象关系映射(ORM)并进行数据库操作。这三种方式包括:通过`LocalSessionFactoryBean`配置、直接注入`...

    spring 4.x源码方式配置spring beans

    `@Configuration`注解标记一个类为配置类,这个类将被Spring容器用来生成bean定义。配置类中的方法通常带有`@Bean`注解,这些方法将返回一个对象,该对象会被Spring容器识别为一个Bean。例如: ```java @...

    Spring+SpringMVC+Mybatis整合demo

    5. **编写业务逻辑**:创建Service层接口和实现类,定义业务方法,然后在Controller层使用@Autowired注解注入Service,处理HTTP请求。 6. **数据库交互**:在Mapper接口中定义方法,对应Mapper XML文件中的SQL,...

    spring源码及jar包,可直接导入eclipse

    Spring框架是Java开发中不可或缺的一部分,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的核心特性,极大地简化了企业级应用的开发。这个压缩包包含了Spring框架...

    Autowired报错原因分析和4种解决方案.docx

    当我们在某个类中使用@Autowired来声明一个字段时,Spring容器会在启动时自动寻找一个匹配的对象注入到该字段。但是,在某些情况下,开发工具如IntelliJ IDEA可能会报告@Autowired注解相关的错误或警告。这通常是...

    Spring依赖注入——java项目中使用spring注解方式进行注入.rar

    本知识点将深入探讨Spring框架如何通过注解方式实现依赖注入,以帮助开发者更好地理解和应用这一特性。 一、依赖注入的概念 依赖注入是一种设计模式,其核心思想是将对象之间的依赖关系从代码中分离出来,由外部...

    spring源码缺失的jar包

    2. **IoC库**:IoC(Inversion of Control)即控制反转,是Spring框架的核心特性,通过依赖注入(Dependency Injection, DI)来实现。它负责创建对象、管理对象的生命周期,并负责对象间的依赖关系。 3. **Bean工厂...

    spring4 AOP 面向切面编程@Aspect

    在实际应用中,通常会结合使用`@Aspect`和其他Spring注解如`@Service`、`@Repository`和`@Controller`,以实现全面的依赖注入和AOP功能。 为了启用Spring的AOP功能,需要在配置中声明`&lt;aop:aspectj-autoproxy&gt;`或...

    spring多个动态代理导致循环依赖报错问题解决

    3. **调整代理模式**:对于CGLIB代理,可以在配置中设置`proxyTargetClass=true`,强制Spring使用CGLIB,即使目标类实现了接口。由于CGLIB创建的是目标类的子类,所以不会导致循环依赖。但是,这可能会引入额外的...

    Spring出错导入俩个jar包

    Apache Commons DBCP的`BasicDataSource`类是实现了`javax.sql.DataSource`接口的一个具体类,可以作为Spring配置文件中的bean定义来使用。以下是一个简单的配置示例: ```xml &lt;!-- 其他可选配置,如最大...

    因Spring AOP导致@Autowired依赖注入失败的解决方法

    例如,在使用 Spring AOP 实现操作日志记录时,service 无法被注入。这可能是由于方法的修饰符是 private 导致的。 二、问题分析 在 org.springframework.aop.support.AopUtils 中,MethodMatcher 接口用于匹配...

    4.Spring中的JdbcTemplate,Spring中的的事务,

    常用的实现类有`DataSourceTransactionManager`,它用于管理基于JDBC的事务。 #### TransactionDefinition 该接口定义了事务的一些属性,包括隔离级别、传播行为等。 - **事务的隔离级别**:控制事务与其他事务...

    Spring3.2.3+Quartz2.2 整合配置

    在上述配置中,`jobExecutionService`是自定义的Job执行类,它需要实现`org.quartz.Job`接口或者使用Spring的`MethodInvokingJobDetailFactoryBean`来调用特定方法。`CronTriggerFactoryBean`用于设置触发器的执行...

    详解Spring @Autowired 注入小技巧

    如果我们要注入的类型声明为一个接口类型,而且该接口有1个以上的实现类,那么下面这段代码还能够正常运行吗? ```java @Autowired private Student stu1; @Autowired private Student stu2; ``` 答案是上面的代码不...

    spring(tomcat)前后端数据加密传输demo

    本示例项目"spring(tomcat)前后端数据加密传输demo"提供了一个基于Spring Boot和Tomcat环境的解决方案,用于演示如何实现前后端数据的加密传输。以下是这个项目中涉及的关键知识点: 1. **Spring Boot**: Spring ...

    No bean named xxx available报错解决

    在本例中,报错信息是"No bean named 'student' available",意味着Spring容器找不到名为'student'的bean。为了解决这个问题,我们需要遵循Spring框架的bean定义和自动注入规则。以下是详细的分析和解决方案: 首先...

    spring3.0 + jpa 需要的jar包

    3. **org.springframework.context-3.0.1.RELEASE-A.jar**:Spring上下文模块提供了一种环境抽象,包括配置、依赖注入以及国际化等功能。这个jar包是Spring框架的核心部分之一。 4. **javassist-3.9.0.GA.jar**:...

    spring 整合mybatis

    3. **其他配置替代**:你可能在其他地方使用了不同的方式来启用了注解驱动,比如使用了`@EnableWebMvc`或手动配置了`WebMvcConfigurer`接口的实现类。 4. **简化配置**:在某些情况下,开发者可能会选择不使用XML...

Global site tag (gtag.js) - Google Analytics