慢慢来比较快,虚心学技术
前言:创建应用对象之间协作关系的行为通常称为装配( wiring ),这也是依赖注入( DI )的本质
Spring提供三种Bean装配机制:
- 在 XML 中进行显式配置。
- 在 Java 中进行显式配置
- 隐式的 bean 发现机制和自动装配
本文简单讲解Spring中使用xml方式进行显式配置装配Bean的步骤和内容分析
使用xml进行Bean的装配是Spring最原始也是持续时间最长的装配方式,该配置文件使用
本文使用最简单的配置,只为记录xml显式装配bean的实现,maven引用如下(其中${org.springframework.version}可替换成任意版本):
org.springframework
spring-core
${org.springframework.version}
org.springframework
spring-context
${org.springframework.version}
org.springframework
spring-test
${org.springframework.version}
①编写基础类CDBean代码
public class CDBean {
/**
* 定义CD名
*/
private String title;
/**
* 定义CD作者
*/
private String author;
}
②编写接口类CDPlayer
public interface CDPlayer {
/**
* 定义方法播放CD
* @param
*
* @return void
*
* @author lai.guanfu 2019/2/27
* @version 1.0
**/
void playCD();
}
③编写接口实现类,同时将CDBean作为属性通过setter方法传入
public class CDPlayerImpl implements CDPlayer {
private CDBean cdBean;
public void setCDBean(CDBean cdBean){
this.cdBean = cdBean;
}
@Override
public void playCD() {
System.out.println("正在播放:"+cdBean.getTitle()+" by "+cdBean.getAuthor());
}
}
④创建XML配置文件application.xml(命名随意)
注:IDEA中可以选择使用默认的File菜单快速创建Spring默认简单格式的配置文件
得到简单格式的xml文件如下
⑤使用
⑥ 用
⑦通过上一篇文章提及的获取配置文件应用上下文ClassPathXmlApplicationContext中获取目标bean并进行测试
public class App
{
public static void main(String[] args) {
/**
* 从根目录的application.xml文件中构建应用上下文
*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application.xml");
/**
*从应用上下文中获取所有bean的类名
*/
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String className : beanDefinitionNames){
System.out.println(className);
}
/**
* 从应用上下文中提取目标实体
*/
CDPlayer cdPlayer = applicationContext.getBean(CDPlayer.class);
/**
* 执行方法进行测试
*/
cdPlayer.playCD();
}
}
⑧测试结果,cdBean和cdPlayer成功装配,且cdBean默认属性注入和cdPlayer的cdBean属性依赖注入成功
cdBean
cdPlayer
正在播放:The World!! by Mr.D
节点
#属性 class -------注明当前装配的Bean的class类型
#属性 id -------为当前装配的Bean添加一个唯一性标识
#属性 name -------为当前装配的Bean添加一个别名,可等同id
#属性 parent -------指定当前装配的Bean的父类在xml文件中对应的name/id
*子节点
#属性 name ------对应于Bean实体中的属性名称
#属性 value ------name指定属性的默认字面量值
#属性 ref -------name指定属性同样是一个被装配的类,ref的值是目标Bean的id
*子节点
#属性 name ------对应于构造函数中的参数名称
#属性 value ------name指定参数的默认字面量值
#属性 ref -------name指定参数同样是一个被装配的类,ref的值是目标Bean的id
#属性 index ------指定当前参数在构造函数中的下标
#属性 type ------指定目标参数的类型
① 简单示例里面的注入方式,实际上使用的是bean里面的setter方法注入,要求对应属性在bean中必须存在setter方法,否则无法注入
② 使用构造器注入
public class CDPlayerImpl implements CDPlayer {
private CDBean cdBean;
public CDPlayerImpl() {
super();
}
public CDPlayerImpl(CDBean cdBean) {
super();
this.cdBean = cdBean;
}
}
xml配置
③ 注入列表参数
此处涉及到和
假设CDPlayerImpl类中有属性cdBeans
public class CDPlayerImpl implements CDPlayer {
private List cDBeans;
public void setCDBeans(List cDBeans){
this.cDBeans = cDBeans;
}
}
xml配置如下:
注:无论类中使用的是list还是使用set或者数组作为属性,xml中都可以使用list或set进行注入
1.spring依靠xml文件进行显式装配,xml文件的根节点是
2.xml文件中每个bean节点可以指定对应组件的类型,名称
3.xml文件中,通过bean的property子节点实现属性初始化或依赖注入
4.xml文件中,通过bean的constructor-arg子节点实现构造器参数初始化或依赖注入
5.xml文件中,通过property或constructor-arg的子节点或
6.所有通过xml显式配置的bean,在代码中通过上一篇文章所描述的应用上下文实现ClassPathXmlApplicationContext从容器中获取实体
【1】《Spring 实战(第 4 版)》·Craig Walls