Spring的模块组装

前排提示,代码都放在github上哦,戳这里:https://github.com/MarsOu1998/Spring2

1.场景

使用Spring模拟一个登录模块,要求登录后可以判别出是「用户登录」还是「学生登录」

2.代码实现

Spring配置文件:ApplicationContext.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="dao" class="StudentDao.studentDao"></bean>
</beans>

数据库接口:IDAO.java:

package Interface;

public interface IDAO {
    public abstract void Login(String account,String password);
}

用户数据库:userDao.java:

package UserDao;

import Interface.IDAO;

public class userDao implements IDAO {

    @Override
    public void Login(String account,String password) {
        System.out.println("用户登录:"+account+" "+password);
    }
}

学生数据库:

package StudentDao;

import Interface.IDAO;

public class studentDao implements IDAO {
    @Override
    public void Login(String account,String password) {
        System.out.println("学生登录:"+account+" "+password);
    }
}

数据库模块调用,daoCaller.java:

package DaoCaller;

import Interface.IDAO;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class daoCaller {
    public  void callDao(String account,String password) {
        ApplicationContext context=new FileSystemXmlApplicationContext("ApplicationContext.xml");
        IDAO dao=(IDAO)context.getBean("dao");
        dao.Login(account,password);
    }


}

主模块调用数据库模块,main.java:

package MainModule;

import DaoCaller.daoCaller;

public class main {
    public static void main(String[] args) {
        daoCaller caller=new daoCaller();
        caller.callDao("oushile","123");
    }
}

结果如下:
在这里插入图片描述

3.思考

上面的代码的确使用Spring框架完成了,看似耦合度也不是很高,但是从开发环节来看,一个大的系统,一般都是由许许多多的小模块组合起来,最后由主模块去调用。

这样就出现一个问题了,从上面的代码我们可以看出,数据库调用模块已经在调用Spring的配置文件了,也就意味着,这个模块在交付的时候,得连带着Spring框架一起交过来,那么积少成多,这种代码风格的模块一但多起来,主模块可能会发疯。

4.改进

在数据库调用的这个类里面,我们可以将IDAO这个数据库接口,设置为一个属性,采用JavaBean风格代码,为其赋上setter和getter方法。代码如下:

package DaoCaller;

import Interface.IDAO;

public class daoCaller {
    private IDAO dao;

    public IDAO getDao() {
        return dao;
    }

    public void setDao(IDAO dao) {
        this.dao = dao;
    }

    public  void callDao(String account,String password) {
        dao.Login(account,password);
    }


}

上面这段代码非常感觉和整洁,只关心传递进来的账号和密码,至于调用的是谁,这个类并不关心。
不过只是这样写,系统并不会运行起来,而是会抛出一个空指针异常,因为这里采用的都是接口,接口是不会被分配内存的。

所以需要在Spring的配置文件里面进行依赖注入:

ApplicationContext.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="dao" class="StudentDao.studentDao"></bean>
    <!--    把dao装配到DaoCaller之中-->
    <bean id="caller" class="DaoCaller.daoCaller">
        <property name="dao">
            <ref bean="dao"/>
        </property>
    </bean>
</beans>

这样把studentDao.java里面的dao在装配数据库调用类里面装配起来,因为这里注入的是一个对象,而不是值,所以不用value,而是用ref,bean表示范围是在整个项目下进行搜索。

在主模块里面,想要调用这个数据库调用模块,因为已经在Spring的配置文件里面注册过了,所以可以直接使用getBean方法

main.java:

package MainModule;

import DaoCaller.daoCaller;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class main {
    public static void main(String[] args) {
        ApplicationContext context=new FileSystemXmlApplicationContext("ApplicationContext.xml");
        daoCaller daoCaller=(daoCaller)context.getBean("caller");
        daoCaller.callDao("oushile","123");

    }
}

小结

简单来讲,就是只有主模块才调用Spring的配置文件,其余的子模块都不要调用,如有需要,在配置文件里面对需要的属性进行注册,使用依赖注入完成操作,这样子模块在交付的时候只需要交付本身即可,而且修改的时候,也只需要对配置文件进行更改,无需修改子模块的源代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值