Spring(18)——使用Java类的形式定义bean(三)

简介: 18.4 组合多个配置 通常在使用基于Java类的配置时我们可能不是单独使用一个Java类进行配置,有的时候可能会建立多个Java类进行配置,也可能是基于Java类的配置和基于XML的配置一起使用,这就需要我们将多个配置整合在一起了。

18.4 组合多个配置

通常在使用基于Java类的配置时我们可能不是单独使用一个Java类进行配置,有的时候可能会建立多个Java类进行配置,也可能是基于Java类的配置和基于XML的配置一起使用,这就需要我们将多个配置整合在一起了。

18.4.1 多个Java类配置组合

对于多个Java配置类的情况,我们可以通过将@Import标注在对应的配置类上以引入另外一个配置类,这样我们在使用的时候就可以只以其中的某个或某几个配置类来直接作为配置类。如下示例我们在配置类SpringConfig上使用@Import引入了另外两个配置类ServiceConfig和DaoConfig。

@Configuration
@Import({ServiceConfig.class, DaoConfig.class})
public class SpringConfig {

}

那么对应在使用的时候我们可以只显示的使用SpringConfig作为配置类,但实际上是使用了SpringConfig、ServiceConfig和DaoConfig三个配置类,即如下示例中的context将包含这三个配置类中定义的所有的bean。

@ContextConfiguration(classes={SpringConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class ConfigurationTest {
	
	@Autowired
	private ApplicationContext context;
	
}

18.4.2 以Java类配置为主组合XML配置

当以Java配置类为主组合XML配置时我们只需要在Java配置类上使用@ImportResource进行标注以引入对应的XML配置即可。如下示例中我们即通过@ImportResource引入了类路径下的applicationContext.xml,这样我们可以继续使用SpringConfig作为配置类,但其中会包含applicationContext.xml中定义的bean。

@Configuration
@ImportResource({"classpath:applicationContext.xml"})
public class SpringConfig {

	@Bean
	public Hello hello() {
		return new Hello();
	}
	
}

18.4.3 以XML配置为主组合Java类配置

由于@Configuration是标注了@Component的,所以以XML配置为主时,如果我们的XML配置定义了<context:component-scan/>,且其能扫描到我们使用了@Configuration进行标注的配置类,那么对应的配置类将作为一个bean定义到对应的bean容器中。与此同时,Spring能检测到其中使用@Bean进行标注的方法,并把它们作为一个bean进行定义。其实如果我们的配置类不是使用的@Configuration进行标注的,而是使用的其它Spring会把它当做一个bean进行定义的注解进行标注也是可以的,如@Component、@Service等。

但是当我们在XML配置中没有使用<context:component-scan/>或者对应的<context:component-scan/>扫描不到我们基于Java的配置类,这个时候就需要我们自己在XML配置中定义对应的bean了,这样Spring就能自动组合基于Java类配置的bean定义了。

<bean class="com.app.SpringConfig"/>

自己单独在XML配置中定义Java配置类对应的bean时,如果我们的配置类中有使用@Autowired进行自动注入,那就需要启用<context:annotation-config/>。当然如果使用了<context:component-scan/>就可以不再单独指定<context:annotation-config/>了,因为<context:component-scan/>默认会启用<context:annotation-config/>

(注:本文是基于Spring4.1.0所写)

目录
相关文章
|
18天前
|
XML 安全 Java
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
26 3
|
16天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
26天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
44 8
|
26天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
59 1
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
45 0
|
1月前
|
Java
在Java中定义一个不做事且没有参数的构造方法的作用
Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
下一篇
DataWorks