Java Hour 66 Spring 相关

这章简单的来了解下Spring 和 Hibernate 是如何勾搭在一起的。

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

这个是最基本的bean 配置文件。

顺便说下下载Spring ,不用去中央仓库,可以去spring 家自己的仓库。

<repository>

            <id>io.spring.repo.maven.release</id>

            <url>http://repo.spring.io/release/</url>

            <snapshots>

                <enabled>false</enabled>

            </snapshots>

        </repository>

获得Hibernate 的SessionFactory对象

SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory");

7E2A9C~1这个不就是上面配置的AnnotationSessionFactoryBean 么?

查看下这个类的继承关系

image

间接继承了AbstractSessoinFactoryBean.

public abstract class AbstractSessionFactoryBean extends HibernateExceptionTranslator

        implements FactoryBean<SessionFactory>, InitializingBean, DisposableBean {

F93EFF~1可以看到这里实现了FactoryBean<SessionFactory>

这里我先假设Spring 都是通过这个FactoryBean<T>.getObject() 方法来获得当前的bean, 事实如何需要在后面继续看。

public interface FactoryBean<T> {
T getObject() throws Exception;

Spring IoC 部分的温习

Ioc 部分基础的包就是org.springframework.beans 和 org.springframework.core

重要的接口是

BeanFacotry

public interface BeanFactory {

这个是root 接口。

image

可以看到我们上面用的ApplicationContext 间接继承了这个接口并扩展了功能。

image

所以本文中的ApplicationContext 其实是BeanFactory 的一个实例。

当然有了这个扩展,我们可以试用XML,也可以使用注解,还可以直接使用代码来配置Bean.

Spring Ioc 容器管理Bean

正如配置文件里面配置的,多个Bean 都受Spring Ioc 容器管理。

关于Spring 如何实例化,如何注入等,这个可以用一个练习专题来提高熟练度。

getter / setter 注入

package org.mike.spring.practice;



import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;



public class MainApp {

    public static void main(String[] args) throws Exception {

        ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:beans.xml");

        IPerson p = ctx.getBean("chinese", IPerson.class);

        p.useAxe();

    }

}

我们可以看到配置文件中配置了一个property, 这个属性的含义有一点点的C# 的味道,当然这里是通过set 注入的。

<?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="chinese" class="org.mike.spring.practice.ChinesePerson">

        <property name="axe">

            <ref local="stoneAxe" />

        </property>

    </bean>

    <bean id="stoneAxe" class="org.mike.spring.practice.StoneAxe" />

</beans>

构造注入

package org.mike.spring.practice;



public class ChinesePerson implements IPerson {

    private Axe axe;



    public ChinesePerson(Axe axe) {

        this.axe = axe;

    }



    @Override

    public void useAxe() {

        axe.chop();

    }

}

改写配置文件节点。

<?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="chinese" class="org.mike.spring.practice.ChinesePerson">

        <constructor-arg>

            <ref bean="stoneAxe" />

        </constructor-arg>

    </bean>

    <bean id="stoneAxe" class="org.mike.spring.practice.StoneAxe" />

</beans>

两种注入方式的比较

设值注入比较容易理解,比较方便使用,可以避免构造函数复杂化。

构造注入可以决定依赖顺序,可以封装字段避免字段暴露方法,无须担心依赖被破坏。

你可能感兴趣的:(spring)