1.重构的时候遇到Spring按Type装载匹配的Bean的异常,当有两个具象类且是父子关系时(如下图, 父类SPParser4ItemAOImpl和子类SPParser4BrandAOImpl), 通过Spring容器ApplicationContext.getBean按type装载匹配父类时,会匹配到两个实例(自己SPParser4ItemAOImpl和子类SPParser4BrandAOImpl), 装载子类时,只会找到子类实例本身(SPParser4BrandAOImpl). 有兴趣可看下DefaultListableBeanFactory.doGetBeanNamesForType方法, 用了xxx.class.isInstance(beanInstance)去判断.
@Component
public class SPParser4BrandAOImpl extends SPParser4ItemAOImpl {
@Override
public void parseDataList() {
System.out.println("This is in SPParser4BrandAOImpl");
}
}
@Component
public class SPParser4ItemAOImpl extends SuperSPPageFloorParseAO {
@Override
public void parseDataList() {
System.out.println("This is in SPParser4ItemAOImpl");
}
}
public abstract class SuperSPPageFloorParseAO implements SPPageFloorParserAO {
@Override
public Map<String, String> parseAttrMap() {
return new HashMap<>();
}
}
public interface SPPageFloorParserAO {
void parseDataList();
/**
* 获取 SPPageFloorVO attrMap数据
* @return
*/
Map<String, String> parseAttrMap();
}
@Component
public class SPParser4BannerAOImpl extends SuperSPPageFloorParseAO {
public void parseDataList() {
//是banner的话就进行url组装
System.out.println("This is in SPParser4BannerAOImpl");
}
}
注意,调用的地方是找各自具象类
SPParser4ItemAOImpl sPParser4ItemAOImpl = (SPParser4ItemAOImpl) context.getBean(SPParser4ItemAOImpl.class);
SPParser4BrandAOImpl sPParser4BrandAOImpl = (SPParser4BrandAOImpl) context.getBean(SPParser4BrandAOImpl.class);
2.Spring自动装配匹配类跟使用的地方是有关联的,如果使用的地方按接口类型或父类去查找, 会匹配到所有实现了接口类型和父类的具象类(SPParser4BannerAOImpl,SPParser4BrandAOImpl,SPParser4ItemAOImpl),程序会报错.
@Component
public class TestApp {
@Autowired
private SPPageFloorParserAO sPPageFloorParserAO;
public void test(){
sPPageFloorParserAO.parseDataList();
}
}
@Autowired
private SuperSPPageFloorParseAO superSPPageFloorParseAO;
public void testSuperClass(){
superSPPageFloorParseAO.parseDataList();
}
解决TestApp的依赖注入时,还是用xxx.class.isInstance(beanInstance)去判断.
3. 在使用Spring注解如 @Component 注册为组件时,如果没有指定名字 @Component("指定的名字"), 而是默认的话,如果class名称为 ABxxx 时会直接返回,而不会将 A 转为小写,因为Spring的判断是:如果第二位是大写,则直接返回.有兴趣可看类AnnotationBeanNameGenerator的generateBeanName和buildDefaultBeanName方法.
4. Qualifier如果在父子具象类中使用,如果Qualifier仅标在父具象类中,通过@Autowired和@Qualifier找父类也会找到两个,还需要把@Qualifier标注在子类上,这样Autowired父类只会找到一个.
@Component
//@Primary
@Qualifier("cold")
public class SPParser4ItemAOImpl extends SuperSPPageFloorParseAO {
@Override
public void parseDataList() {
System.out.println("This is in SPParser4ItemAOImpl");
}
}
@Component
//@Qualifier("需要增加一个新标识跟父类标识区分")
public class SPParser4BrandAOImpl extends SPParser4ItemAOImpl {
@Override
public void parseDataList() {
System.out.println("This is in SPParser4BrandAOImpl");
}
}
@Component
public class TestApp {
@Autowired
//@Qualifier("SPParser4ItemAOImpl")
@Qualifier("cold")
private SPPageFloorParserAO sPPageFloorParserAO;
public void test(){
sPPageFloorParserAO.parseDataList();
}
}
@Test
public void testGetBeanByClazz() {
TestApp testApp = context.getBean(TestApp.class);
testApp.test();
}

- 大小: 13.8 KB

- 大小: 68 KB
分享到:
相关推荐
在编辑器中打开XML文件时,MyEclipse的Spring插件会自动识别并提供XML Schema支持,比如在编写bean定义时,自动提示类名、属性和方法。 4. **自动提示功能** 当在`applicationContext.xml`中输入`<bean>`标签时,...
而注解自动装配(Autowired)是Spring IoC容器的一种高级特性,它允许我们通过注解来声明对象之间的依赖,无需手动编写XML配置。现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要...
本文将深入探讨Spring装配Bean的实例代码,帮助你更好地理解这一关键概念。 首先,Spring装配Bean主要有两种方式:XML配置和注解配置。在本例中,我们将重点关注XML配置,对应的压缩包文件名为“springxmldemo”,...
- 用于实现自动装配,即Spring容器会自动将Bean实例注入到标记了此注解的字段或方法参数中。 - 默认情况下,`@Autowired` 是基于类型进行匹配的,如果存在多个相同类型的Bean,则需要配合`@Qualifier`注解进一步...
@Autowired 注解用于自动装配依赖项,默认按照类型匹配的方式(byType)进行注入。可以用于成员变量、setter 方法、构造器函数等。使用 @Autowired 注解时,Spring 容器将抛出异常如果找不到匹配的 Bean 或者存在多...
- @Autowired是Spring提供的注解,它通过类型匹配找到对应的Bean并自动注入,如果找到多个类型匹配的Bean,则会根据名称进行匹配。 - @Resource是Java EE提供的注解,它默认通过名称注入,如果未指定名称,则按类型...
Spring可以通过`@Autowired`、`@Qualifier`等注解进行自动装配,减少手动配置。`@Autowired`默认按类型匹配,`@Qualifier`可以指定具体哪个Bean。 六、ConsoleAppSpring 在提供的`ConsoleAppSpring`可能是Spring...
Spring的自动装配(Auto-Wiring)功能可以根据Bean的类型或名称自动匹配依赖。`@Autowired`注解是自动装配的主要工具,它还可以与`@Qualifier`结合,指定精确的依赖来源。 通过对`spring-beans`源码的深入学习,...
`@Component`标记一个类为Spring管理的bean,`@Autowired`则自动找到类型匹配的bean进行注入。 2. **Bean管理**: Spring容器负责bean的生命周期管理,包括初始化、实例化、装配、销毁等。 - **原生bean管理**...
最后,Spring的@Autowired注解在版本3.2.3.RELEASE中,其类型的自动装配机制可能根据匹配规则有所不同,但基本原理是先尝试类型匹配,如果找不到合适的bean,再尝试按字段名匹配。 总结来说,@Autowired、@Inject和...
@Autowired注解用于自动注入依赖,它会自动查找匹配的bean来注入,支持按类型和名称进行依赖查找。 30、@Qualifier注解有什么用? @Qualifier注解与@Autowired一起使用,用于在存在多个相同类型的bean时,指定要...
3. 注解配置:Spring框架还支持在类或方法上使用注解进行配置,如`@Autowired`用于自动装配依赖,`@Service`、`@Repository`、`@Controller`定义组件角色。 二、初始化阶段 1. Bean的实例化:Spring容器根据配置...
- `constructor`:根据构造函数参数类型自动装配。 - `autodetect`:尝试检测并选择`constructor`或`byType`模式。 - **dependency-check属性**:用于依赖检查。可以选择四种模式: - `none`:不进行检查。 - `...
- 自动装配是Spring框架的一个特性,允许容器自动将依赖项匹配到相应的Bean中,无需显式配置。 #### 示例代码解析 以下是一个使用Spring框架的简单示例,展示了依赖托拽的使用: ```java public static void ...
自动装配是Spring提供的另一种依赖注入方式,它允许Spring自动查找并注入匹配的Bean。可以基于类型、名称或者@Qualifier注解进行自动装配。 5. **Bean后处理器(Bean Post Processor, BPP)** Bean后处理器是在...
尽管Spring提供了自动装配(autowiring)的功能,即基于类的自省机制自动绑定依赖,但这并不推荐在实际项目中广泛使用。自动装配牺牲了配置的清晰度和可维护性,可能导致配置意图的模糊。最佳实践是明确指定依赖关系...
- **byType**:根据类型自动装配bean,如果有多个匹配的bean,需要显式指定。 - **autowired**:使用`|byName">`或`@Autowired`注解实现自动装配。 4. **作用域** - **singleton**:默认作用域,Spring容器中...
- **byType:** 根据类型自动装配,但可能导致多个匹配项。 - **no:** 不进行自动装配。 **6. 静态代理:** - **角色分析:** 抽象角色(接口或抽象类)、真实角色(被代理对象)、代理角色(在真实角色前进行...
通过解析XML文件,Spring能够知道如何实例化、装配和管理Bean。例如,标签用于定义一个Bean,其id属性为Bean的唯一标识,class属性指定Bean的全限定类名。此外,标签用于注入Bean的依赖,通过ref属性引用其他Bean或...
- `org.springframework.aop.MethodMatcher`:匹配方法。 5. **接口 Advisor**: - `org.springframework.aop.PointcutAdvisor`:表示一个顾问,包含了切点和通知。 6. **预定义切入点**: - **静态切入点**:...