Spring 自动装配,Java 配置,XML配置、混合使用
一篇 随笔记,无排版。分类于 乱七八糟 名下。来自 《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。
- 为bean 命名:
配置类:启用组件扫描
@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 的名字/ID:
添加了 @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
- List 集合 :对应
- 注入
<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
上一篇: Android Handler Message 里面的message.what, message.arg1,message.obj,obtainMessage, message.setData的使用
推荐阅读
-
java 使用memcached以及spring 配置memcached完整实例代码
-
Spring实战之XML与JavaConfig的混合配置详解
-
JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案
-
Spring 自动装配,Java 配置,XML配置、混合使用
-
【8】使用Java的方式配置Spring
-
Spring入门07--使用JAVA的方式配置Spring
-
spring 配置文件中使用了tx标签,而在xml头部没有声明报错 - spring经典问题(终极篇)
-
Spring Boot 2.x基础教程:使用MyBatis的XML配置方式
-
使用纯java config来配置spring mvc方式
-
SpringBoot使用logback自定义配置时遇到的坑 --- 在 /tmp目录下自动生成spring.log文件