IoC容器的构建方式
(1)基于XML配置方式(可以开启注释配置,通过注释配置Bean和装配工作)
(2)基于Goovy脚本配置方式(DSL)
(3)基于Java Config配置注解方式(通过Configuration和Bean注释)
下面将讲解基于XML配置方式来构建IoC容器
1 Bean的实例化方法(三种)
1.1 构造方法实例化
下面这种方法是默认类需要一个无参构造,其中的id是Bean的配置属性,用来标识一个Bean
下面这种方法中是在类中创建了一个有参构造,需要添加一个constructor-arg
1.2 静态工厂方法实例化
静态工厂方法就是通过一个类的静态工厂方法来创建Bean
//静态工厂方法实例化
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService(){}
public static ClientService getInstance()
{
return clientService;
}
}
1.3 实例工厂方法实例化
实例工厂方法实例化创建是通过已经在容器中的Bean通过方法实例化一个新的Bean
//实例工厂方法实例化
public class DefaultClientServiceLocator {
public ClientService getClientService()
{
return ClientService.getInstance();
}
}
2 Bean的依赖装配方式
2.1 通过构造方法参数装配的方式(四种)
2.1.1 Bean引用
2.1.2 根据参数类型
public class ExampleBean3 {
private final int age;
private final String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public ExampleBean3(int age, String name) {
this.age = age;
this.name = name;
}
}
2.1.3 根据参数位置
如果构造方法有两个相同类型的参数时,可以使用index来设置依赖顺序,indeks是基于0开始的
2.1.4 根据参数名称
2.2 Setter方法装配
容器在调用无参构造方法或者无参工厂实例化Bean方法之后,调用Setter方法完成属性的装配
public class ComplexShape {
private Shape shape;
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
@Override
public String toString() {
return "ComplexShape{" +
"shape=" + shape +
'}';
}
}
3 Bean的具体配置
3.1 直接赋值
直接赋值是针对基本数据类型和String类型,可以配置properties元素和value属性来指定属性或者构造方法参数赋值
3.2 idref属性
idref VS ref
idref装配的是目标bean的id而不是目标bean的实例,同时使用idref容器在部署的时候还会验证这个名称的bean是否真实存在,其实idref就跟value一样,只是将某个字符串装配到属性或者构造函数中,只不过装配的是某个Bean定义的id属性值
ref是将目标函数Bean定义的实例装配到属性或构造函数中
3.3 内部Bean
定义在
3.4 Collection
使用,
注:在使用集合元素时,集合的value可以使用bean,ref,idref,list,set,map,props,value,null
public class ComplexObject {
private Properties properties;
private List
[email protected]
[email protected]
20
C++
javaScript
3.5 null和空字符串