您的位置:首页 > 编程语言 > Java开发

Spring的bean来创建h5斗牛房卡棋牌平台开发搭建详解

2018-03-04 21:21 288 查看
h5斗牛房卡棋牌平台开发搭建联系技术Q1687054422   
IoC容器,又名控制反转,全称为Inverse of Control,其是Spring最为核心的一个组件,其他的组件如AOP,Spring事务等都是直接或间接的依赖于IoC容器的。本文主要讲解IoC容器所管理的bean的几种创建方式,并且详细讲解了xml配置中相关参数的配置。
       在IoC容器中,bean的获取主要通过
BeanFactory
ApplicationContext
获取,这里
ApplicationContext
实际上是继承自
BeanFactory
的,两者的区别在于
BeanFactory
对bean的初始化主要是延迟初始化的方式,而
ApplicationContext
对bean的初始化是在容器启动时即将所有bean初始化完毕。如下是
BeanFactory
的主要接口:
Object getBean(String name) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
boolean containsBean(String name);
String[] getAliases(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
       可以看到,
BeanFactory
中主要提供的是一些查询bean的方法,而bean的创建和管理实际上是由
BeanDefinitionRegistry
来进行的。
BeanDefinitionRegistry
会为其管理的每个bean都创建一个
BeanDefinition
实例,该实例中主要包含当前bean的名称,类型,是否抽象类,构造函数参数等信息。
BeanDefinition
有两个主要的实现类
RootBeanDefinition
ChildBeanDefinition
,这里
RootBeanDefinition
主要用于创建并且注册一个bean到
BeanDefinitionRegistry
中,
ChildBeanDefinition
则主要用于预处理具有parent/child的bean定义。如下图为IoC容器管理bean的主要类结构图,这里
DefaultListableBeanFactory
BeanFactory
BeanDefinitionRegistry
的一个默认实现类:



       IoC容器创建bean主要有三种方式:硬编码,元数据和配置文件。这里硬编码方式也即显示的使用上面的类图关系将bean以及它们之间的依赖关系注册到IoC容器中;元数据方式即使用Java注解和spring自动扫描的功能配置bean;配置文件的方式主要有两种:xml和properties文件,这里主要讲解使用更广泛的xml文件的方式。
       这了以零售超市的例子来讲解bean的创建,SuperMarket表示零售超市,其有DrinkProvider合FruitProvider两个供应商,并且这两个供应商分别有两个实现类Milk和Apple。如下是各个类的结构:
public class SuperMarket {
private DrinkProvider drink;
private FruitProvider fruit;

public SuperMarket() {}

public SuperMarket(DrinkProvider drink, FruitProvider fruit) {
this.drink = drink;
this.fruit = fruit;
}

public void setDrink(DrinkProvider drink) {
this.drink = drink;
}

public void setFruit(FruitProvider fruit) {
this.fruit = fruit;
}

@Override
public String toString() {
return "drink: " + drink + ", fruit: " + fruit;
}
}
public interface DrinkProvider {}
public class Milk implements DrinkProvider {
@Override
public String toString() {
return "this is milk";
}
}
public interface FruitProvider {}
public class Apple implements FruitProvider {
@Override
public String toString() {
return "this is an apple";
}
}

1. 硬编码

       根据上面对IoC容器对bean进行管理的几个类的讲解,这里硬编码的方式实际上很好实现,如下是bean创建的代码:
public class BeanApp {
public static void main(String[] args) {
DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
BeanFactory beanFactory = bindViaCode(beanRegistry);
SuperMarket superMarket = beanFactory.getBean(SuperMarket.class);
System.out.println(superMarket);
}

private static BeanFactory bindViaCode(BeanDefinitionRegistry beanRegistry) {
AbstractBeanDefinition fruit = new RootBeanDefinition(Apple.class);
AbstractBeanDefinition drink = new RootBeanDefinition(Milk.class);
AbstractBeanDefinition superMarket = new RootBeanDefinition(SuperMarket.class);

beanRegistry.registerBeanDefinition("fruit", fruit);
beanRegistry.registerBeanDefinition("drink", drink);
beanRegistry.registerBeanDefinition("superMarket", superMarket);

// 使用构造方法对属性进行设值
ConstructorArgumentValues argumentValues = new ConstructorArgumentValues();
argumentValues.addIndexedArgumentValue(0, drink);
argumentValues.addIndexedArgumentValue(1, fruit);
superMarket.setConstructorArgumentValues(argumentValues);

// 使用setter方法对属性进行设值
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.addPropertyValue("fruit", fruit);
propertyValues.addPropertyValue("drink", drink);
superMarket.setPropertyValues(propertyValues);

return (BeanFactory) beanRegistry;
}
}
如下是输出结果:
drink: this is milk. , fruit: this is an apple.
       在示例中,我们首先声明了一个DefaultListableBeanFactory实例,需要注意,DefaultListableBeanFactory既实现了BeanFactory接口,也实现了BeanDefinitionRegistry接口,因而这里将该实例传入
bindViaCode()
方法作为bean注册器使用。在
bindViaCode()
方法中,我们首先为每个需要创建的bean创建一个BeanDefinition对其进行管理,然后将每个BeanDefinition注册到BeanDefinitionRegistry中。注册完之后,我们使用ConstructorArgumentValues类来指定创建的三个bean之间的相互依赖关系(这里我们也提供了使用setter方法对属性进行设值的代码)。从最后的输出我们可以看出,SuperMarket,Milk和Apple三个类都成功创建了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: