Spring的bean来创建h5斗牛房卡棋牌平台开发搭建详解
2018-03-04 21:21
288 查看
h5斗牛房卡棋牌平台开发搭建联系技术Q1687054422
IoC容器,又名控制反转,全称为Inverse of Control,其是Spring最为核心的一个组件,其他的组件如AOP,Spring事务等都是直接或间接的依赖于IoC容器的。本文主要讲解IoC容器所管理的bean的几种创建方式,并且详细讲解了xml配置中相关参数的配置。
在IoC容器中,bean的获取主要通过
IoC容器创建bean主要有三种方式:硬编码,元数据和配置文件。这里硬编码方式也即显示的使用上面的类图关系将bean以及它们之间的依赖关系注册到IoC容器中;元数据方式即使用Java注解和spring自动扫描的功能配置bean;配置文件的方式主要有两种:xml和properties文件,这里主要讲解使用更广泛的xml文件的方式。
这了以零售超市的例子来讲解bean的创建,SuperMarket表示零售超市,其有DrinkProvider合FruitProvider两个供应商,并且这两个供应商分别有两个实现类Milk和Apple。如下是各个类的结构:
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三个类都成功创建了。
相关文章推荐
- 详解Spring Boot 使用Java代码创建Bean并注册到Spring中
- (三)Spring详解——创建bean实例
- Spring4.X + Spring MVC + Mybatis3 零配置应用开发框架搭建详解 (3) - 实现最基本的登录处理
- 【原创】搭建SSH后通过反向工程(Reverse Engineering)自动生成Hibernate Bean实体和Spring Dao对象详解(图文)
- spring实现bean对象创建代码详解
- Spring4.X + Spring MVC + Mybatis3 零配置应用开发框架搭建详解(5) - Redis缓存配置
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合 一、搭建开发环境 1.1、使用Maven创建Web项目 执行如下命令: mvn archetype:create
- JSP 开发之Spring Boot 动态创建Bean
- SSH框架之Spring的开发步骤、bean对象创建的细节
- Spring架构详解之BeanFactory的创建-上
- spring详解:bean的三种创建方式
- Spring架构详解之BeanFactory的创建-下
- JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试
- Spring架构详解之创建Bean实例并构建Bean的关系网
- Spring4.X + Spring MVC + Mybatis3 零配置应用开发框架搭建详解 (2) - 基础框架搭建
- Spring开发环境搭建以及创建示例工程
- Spring的bean创建详解
- 整合开发Struts2,Hibernate,Spring简单框架的搭建详解
- 【Spring】Spring控制反转IOC创建bean失败-java.io.FileNotFoundException
- 【spring bean】bean的配置和创建方式