360SDN.COM

Spring Framework 5 权威指南(2)

来源:程序员阮威  2017-09-11 13:20:59    评论:0点击:

这是一个Spring 5专题系列,其诞生的动机是:

  1. 介绍最新的Spring Framework特性;

  2. 介绍最系统化的Spring Framework

  3. 介绍最佳实践的Spring Framework

如果能坚持下来的话,这个系列将很长,很长。

IoC容器

    Spring Framework的核心技术主要由IoCAOP两部分组成。

1. 容器概

控制反转(IoC)也叫依赖注入(DI)Spring IoC容器负责管理对象创建及其依赖关系,Spring将这些被管理的对象称为bean

Spring IoC容器如下图所示:

       

容器通过读取配置元数据来装配对象,配置元数据有三种形式:XML文件,Java注解(Spring 2.5+)Java代码(Spring 3.0+)(@Configuration, @Bean, @Import, @DependsOn, @ComponentScan)。你也可以使用Spring集成的AspectJ来配置在容器之外创建的对象。

基于XML的配置元数据的基本结构如下:

<?xml version="1.0"encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 

    <bean id="..." class="...">

    <!-- collaborators and configuration for this bean gohere -->

    </bean>

 

    <bean id="..." class="...">

    <!-- collaborators and configuration for this bean gohere -->

    </bean>

 

    <!-- more bean definitions go here -->

 

</beans>

在一个复杂系统中,你可以按照逻辑分层或者模块化的方式,将配置文件拆分成各自独立的配置文件中。

定义服务层对象的配置文件如下(services.xml)

<?xml version="1.0"encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 

    <!-- services -->

 

    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">

        <property name="accountDao" ref="accountDao"/>

        <property name="itemDao" ref="itemDao"/>

        <!--additional collaborators and configuration for this bean go here -->

    </bean>

 

    <!-- more bean definitions for services go here -->

 

</beans>

定义数据访问对象的配置文件(dao.xml)

<?xml version="1.0"encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 

<bean id="accountDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">

    <!-- additional collaborators and configuration forthis bean go here -->

    </bean>

 

    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">

    <!-- additional collaborators and configuration forthis bean go here -->

    </bean>

 

    <!-- more bean definitions for data access objects gohere -->

 

</beans>

实例化并使用IoC容器,代码如下:

// create and configure beans

ApplicationContext context = newClassPathXmlApplicationContext("services.xml","daos.xml");

 

// retrieve configured instance

PetStoreService service = context.getBean("petStore", PetStoreService.class);

 

// use configured instance

List<String> userList = service.getUsernameList();

接口org.springframework.context.ApplicationContext就代表Spring IoC容器,构造函数中传入的参数是一个表示外部资源的字符串列表,容器从这个资源读取配置元数据,外部资源可以是来自于文件系统(FileSystemXmlApplicationContext)或者类路径(ClassPathXmlApplicationContext)等。

可以将多个独立的配置文件组合成单个文件,如下:

<beans>

    <import resource="services.xml"/>

    <import resource="resources/messageSource.xml"/>

    <import resource="/resources/themeSource.xml"/>

 

    <bean id="bean1" class="..."/>

    <bean id="bean2" class="..."/>

</beans>

配置元数据也可以用SpringGroovy BeanDefinition DSL来描述,基本等价于XML形式,并且还可以在其中导入XML。例如(xxx.groovy)

beans {

   dataSource(BasicDataSource) {

       driverClassName = "org.hsqldb.jdbcDriver"

        url = "jdbc:hsqldb:mem:grailsDB"

        username = "sa"

        password = ""

        settings =[mynew:"setting"]

    }

   sessionFactory(SessionFactory) {

        dataSource= dataSource

    }

   myService(MyService) {

        nestedBean= { AnotherBean bean ->

           dataSource = dataSource

        }

    }

}

实例化这样的一个容器代码为:

ApplicationContext context = newGenericGroovyApplicationContext("services.groovy","daos.groovy");

接口org.springframework.beans.factory.BeanFactory在底层提供SpringIoC容器的基本功能,用于与第三方框架集成。接口org.springframework.context.ApplicationContextBeanFactory的子类,其二者的主要区别是:

当然,你可以显式地在BeanFactory中注册BeanPostProcessorBeanFactoryPostProcessor,代码如下:

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();

 

// populate the factory with beandefinitions

XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);

reader.loadBeanDefinitions(newFileSystemResource("beans.xml"));

 

// now register any neededBeanPostProcessor instances

MyBeanPostProcessor postProcessor = new MyBeanPostProcessor();

factory.addBeanPostProcessor(postProcessor);

 

// bring in some property values from aProperties file

PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();

cfg.setLocation(newFileSystemResource("jdbc.properties"));

 

// now actually do the replacement

cfg.postProcessBeanFactory(factory);

阅读原文

为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权