欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring 自动装配,Java 配置,XML配置、混合使用

程序员文章站 2022-08-12 10:56:25
一篇 随笔记,无排版。分类于 乱七八糟 名下。来自 《Spring 实战4》的阅读笔记装配 Bean装配:创建应用对象之间协作关系的行为。spring 三种配置方案自动装配Java 配置XML 配置三种方式 可以混合使用,推荐程度,由上到下 依次降低。自动装配自动装配分为:组件扫面 : 用于 在ApplicationContext 中创建 Bean。自动装配:满足各个Bean 之间的依赖关系。代码演示@Component // 标志 此类 会被 创建为 Beanpub....

一篇 随笔记,无排版。分类于 乱七八糟 名下。来自 《Spring 实战4》的阅读笔记

装配 Bean

装配:创建应用对象之间协作关系的行为。

spring 三种配置方案

  • 自动装配
  • Java 配置
  • XML 配置

三种方式 可以混合使用,推荐程度,由上到下 依次降低。

自动装配

自动装配分为:

  • 组件扫面 : 用于 在ApplicationContext 中创建 Bean。
  • 自动装配:满足各个Bean 之间的依赖关系。

代码演示

@Component // 标志 此类 会被 创建为 Bean
public class A implements B{
	private String a;
	public void showA(){
		System.out.println("----->"+a);
	}
}

B 是一个 接口,自己 瞎定义的。

  • @Component 注解: 表明该类为组件类 ,该类 会被声明 为 Bean。
    • 为bean 命名:@Component("a"),指定 bean 的ID 为 a。

配置类:启用组件扫描

@Configuration
@ComponentScan // 启用组件扫描,
public class AConfig{}
  • @Configuration 注解,用来 表明 此类 为 配置类。
  • @ComponentScan注解,启动扫面,默认扫描 配置类 所在的包及其子包,扫描那些 被 @Component 修饰的类。
    • 指定需要扫描的包:@ComponentScan("包名"),里面 对应 value 属性。
    • 设置 基础 包:@ComponentScan(basePackages="基础包名"),通过 backPackages 属性。
    • 指定 多个基础包:@ComponentScan(basePackages={"基础包名1", "基础包名2"}),都放到 {} 里。
    • 通过类所在的包,来设置需要扫描的包, 通过basePackageClasses 属性
      • @ComponentScan(basePackageClasses="{A.class, B.classs}")

XML 中 使用 ComponentScan 的方式。

<beans>
	<context:component-scan base-package="需要扫描的包"/>
</beans>

测试

@ContextConfiguration(classes="AConfig.class")
public class Tets{
	@Autowired
	private B b;
	
	@Test
	public void abc(){
		// ........
	}
}
  • @ContextConfiguration 指明 使用 那个配置类 进行 配置

自动 装配

自动装配 主要使用 @Autowired ,来建立 各个 bean 之间的依赖关系。

  • @Autowired可以用在 任何 方法 上,包括 构造方法,setter 方法,。。。。
@Autowired
public void method(A a){ // 系统 会找到 和 A 对应的 bean 赋值给 a.
}
  • required 属性设置为 false 时,表明不要求 必须找到匹配的 Bean。
    • @Autowired(required="false"),找不到 对应 的bean 不会报错。
  • 当找到 多个 匹配的 bean 时,会产生 歧义性

歧义性 问题 怎么解决 ? 下一篇解决。

Java 配置

通过 专门的配置 来 生成和组织 bean 之间的关系。

创建 配置类

@Configuration
public class Config{

	@Bean // 声明 bean
	public B newABean(){
		return new A();
	}

	@Bean // 创建 Bean 
	public C newCBean(){
		return new C( newABean() ); // 并把 newABean Bean 注入 里面
	}
}
  • @Configuration 表明这个类 是 配置类,该类应该包含在Spring应用上下文中如何创建 bean 的细节。
  • @Bean 注解 表明方法 返回一个对象,此对象为要 注册到 ApplicationContext 中的bean,默认ID 为方法名
    • 指定 bean 的名字/ID:@Bean(name="名字") 。使用 name 属性。
    • 默认 bean 都是 单例
    • 带有 Bean 注解的方法可以采用任何必要的 Java 功能来产生 Bean 实例。

添加了 @Bean 注解的方法 ,spring 会拦截 对它的所有调用,并确保直接返回该方法所创建的Bean,而不是 每次都对其实际的调用。

在Java 配置中 设置Bean 之间依赖 的方式
一种 : 引用创建 bean 的方法

@Configuration
public class Config{

	@Bean // 声明 bean
	public B newABean(){
		return new A();
	}

	@Bean // 创建 Bean 
	public C newCBean(){
		return new C( newABean() ); // 并把 newABean Bean 注入 里面
	}
}

一种: 参数方式传递
优点: 引用的 bean 不要求 在同一个 配置类中。

@Configuration
public class Config{

	@Bean // 声明了 一个bean
	public B newABean(){
		return new A();
	}
	// 学习 通过 参数引用 方式建立 依赖
	@Bean // 创建 Bean 
	public C newCBean(B b){// 通过参数方式 引用 其他Bean
		return new C(b );
	}
}

XML配置

创建一个 XML 文件,根元素 是 <beans>

声明一个Bean

<beans ...... >
	<bean id="Bean 的 ID" class="Bean 对应 类" />
</beans>
  • id 用来 指定 Bean 的名字。没有 Id 会 根据 class属性的全限定类名来进行命名。
  • class 用来指定对应的类,要使用全限定的类名。

构造器注入 初始化 bean

  • 使用 <constructor-arg> 元素 进行构造器注入。
    • 注入 Bean 引用 :<constructor-arg ref="要引用 Bean 的 ID" /> 使用 ref 属性
    • 注入字面量值<constructor-arg value="字面量值" /> 使用 value 属性
    • 注入 集合:
      • List 集合 :对应 java.util.List
      • Set集合:对应java.util.Set
<constructor-arg>
	<!-- list 也可以 更换为 set -->
	<list>
		<!-- 此处的 value标签  也可以 换成 ref 标签 -->
		<!-- 形式如:<ref id="引用 Bean 的ID" />-->
		<value> 值1 </value> 
		<value> 值2 </value>
		<value> 值3 </value>
		<value> .... </value>
	</list>
</constructor-arg>

属性注入

  • 使用 <property> 元素 进行 属性注入。
    • 注入 bean<property name="对应的属性 名" ref="要引用 bean 的ID">
    • 注入 字面量<property name="对应的属性 名" value="字面量 的值">
    • 注入 集合:与 构造器 注入 一样
      • list 集合
      • set 集合
<property name="对应 的属性 名">
	<!-- list 也可以 更换为 set -->
	<list>
		<!-- 此处的 value标签  也可以 换成 ref 标签 -->
		<!-- 形式如:<ref id="引用 Bean 的ID" />-->
		<value> 值1 </value> 
		<value> 值2 </value>
		<value> 值3 </value>
		<value> .... </value>
	</list>
</property>

Java 类一个说明

public class A{
	// 此地方 使用 属性注入
	private String a;
	// 构造方法 上 使用时 构造器注入
	public A(String a,String b){
	}
}

多种配置的混合使用

将 Java 配置 中的多个配置类 组合在一起

@Configuration
@Import(BConfig.class) // 将 BConfig 配置类导入
public class A{
}
  • @Import 注解 用于 引入其他配置类
    • 引入多个配置类:@Import({BConfig.class, CConfig.class}){} 括起来,以, 分割。

在 Java 配置中 引用XML 配置

@Configuration
@Import(BConfig.class) // 将 BConfig 配置类导入
@ImportResource("classpath:XXXX.xml") // 导入 根类路径下 的 XXXX.xml 文件
public class A{
}
  • @ImportResource 注解,用来将 xml 加载 到 JavaConfig 中

XML 文件 导入 另一个 XML文件

<beans>
<!-- 导入 另一个 XML 文件-->
<import resource="otherXXX.xml" />
</beans>
  • <import> 元素,用来 导入其他的XML 文件
    • resource 指定 需要导入 XML 文件的位置。
    • 不能够 导入 Java 配置 类

XML文件 中导入 Java配置

<beans>
<!-- 导入 Java 配置-->
<bean class="XX.XXX.XXConfig" />
</beans>
  • 通过 <bean> 元素 来 导入 Java 配置。

本文地址:https://blog.csdn.net/CrazyIdeas/article/details/107254086