说明:
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,启动成功
相关推荐
7. **Spring DAO层集成**:通过@Autowired注解,Spring可以自动注入SqlSessionTemplate或SqlSessionDaoSupport,这两个类提供了执行MyBatis SQL操作的方法。 8. **Service层开发**:在Service层,通过调用DAO层的...
1. **配置文件错误**:检查Spring的配置文件(如`applicationContext.xml`或`beans.xml`),确保`UserDao`接口的实现类已经被正确地定义为bean,并且设置了正确的扫描路径。例如: ```xml <!-- 如果UserDaoImpl...
在探讨Hibernate注入的三种方式时,我们主要关注的是如何在Spring框架中整合Hibernate,以便实现对象关系映射(ORM)并进行数据库操作。这三种方式包括:通过`LocalSessionFactoryBean`配置、直接注入`...
`@Configuration`注解标记一个类为配置类,这个类将被Spring容器用来生成bean定义。配置类中的方法通常带有`@Bean`注解,这些方法将返回一个对象,该对象会被Spring容器识别为一个Bean。例如: ```java @...
5. **编写业务逻辑**:创建Service层接口和实现类,定义业务方法,然后在Controller层使用@Autowired注解注入Service,处理HTTP请求。 6. **数据库交互**:在Mapper接口中定义方法,对应Mapper XML文件中的SQL,...
Spring框架是Java开发中不可或缺的一部分,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的核心特性,极大地简化了企业级应用的开发。这个压缩包包含了Spring框架...
当我们在某个类中使用@Autowired来声明一个字段时,Spring容器会在启动时自动寻找一个匹配的对象注入到该字段。但是,在某些情况下,开发工具如IntelliJ IDEA可能会报告@Autowired注解相关的错误或警告。这通常是...
本知识点将深入探讨Spring框架如何通过注解方式实现依赖注入,以帮助开发者更好地理解和应用这一特性。 一、依赖注入的概念 依赖注入是一种设计模式,其核心思想是将对象之间的依赖关系从代码中分离出来,由外部...
2. **IoC库**:IoC(Inversion of Control)即控制反转,是Spring框架的核心特性,通过依赖注入(Dependency Injection, DI)来实现。它负责创建对象、管理对象的生命周期,并负责对象间的依赖关系。 3. **Bean工厂...
在实际应用中,通常会结合使用`@Aspect`和其他Spring注解如`@Service`、`@Repository`和`@Controller`,以实现全面的依赖注入和AOP功能。 为了启用Spring的AOP功能,需要在配置中声明`<aop:aspectj-autoproxy>`或...
3. **调整代理模式**:对于CGLIB代理,可以在配置中设置`proxyTargetClass=true`,强制Spring使用CGLIB,即使目标类实现了接口。由于CGLIB创建的是目标类的子类,所以不会导致循环依赖。但是,这可能会引入额外的...
Apache Commons DBCP的`BasicDataSource`类是实现了`javax.sql.DataSource`接口的一个具体类,可以作为Spring配置文件中的bean定义来使用。以下是一个简单的配置示例: ```xml <!-- 其他可选配置,如最大...
例如,在使用 Spring AOP 实现操作日志记录时,service 无法被注入。这可能是由于方法的修饰符是 private 导致的。 二、问题分析 在 org.springframework.aop.support.AopUtils 中,MethodMatcher 接口用于匹配...
常用的实现类有`DataSourceTransactionManager`,它用于管理基于JDBC的事务。 #### TransactionDefinition 该接口定义了事务的一些属性,包括隔离级别、传播行为等。 - **事务的隔离级别**:控制事务与其他事务...
在上述配置中,`jobExecutionService`是自定义的Job执行类,它需要实现`org.quartz.Job`接口或者使用Spring的`MethodInvokingJobDetailFactoryBean`来调用特定方法。`CronTriggerFactoryBean`用于设置触发器的执行...
如果我们要注入的类型声明为一个接口类型,而且该接口有1个以上的实现类,那么下面这段代码还能够正常运行吗? ```java @Autowired private Student stu1; @Autowired private Student stu2; ``` 答案是上面的代码不...
本示例项目"spring(tomcat)前后端数据加密传输demo"提供了一个基于Spring Boot和Tomcat环境的解决方案,用于演示如何实现前后端数据的加密传输。以下是这个项目中涉及的关键知识点: 1. **Spring Boot**: Spring ...
在本例中,报错信息是"No bean named 'student' available",意味着Spring容器找不到名为'student'的bean。为了解决这个问题,我们需要遵循Spring框架的bean定义和自动注入规则。以下是详细的分析和解决方案: 首先...
3. **org.springframework.context-3.0.1.RELEASE-A.jar**:Spring上下文模块提供了一种环境抽象,包括配置、依赖注入以及国际化等功能。这个jar包是Spring框架的核心部分之一。 4. **javassist-3.9.0.GA.jar**:...
3. **其他配置替代**:你可能在其他地方使用了不同的方式来启用了注解驱动,比如使用了`@EnableWebMvc`或手动配置了`WebMvcConfigurer`接口的实现类。 4. **简化配置**:在某些情况下,开发者可能会选择不使用XML...