Spring的模块组装
前排提示,代码都放在github上哦,戳这里:1.场景使用Spring模拟一个登录模块,要求登录后可以判别出是「用户登录」还是「学生登录」2.代码实现Spring配置文件:ApplicationContext.xml:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframewo...
前排提示,代码都放在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的配置文件,其余的子模块都不要调用,如有需要,在配置文件里面对需要的属性进行注册,使用依赖注入完成操作,这样子模块在交付的时候只需要交付本身即可,而且修改的时候,也只需要对配置文件进行更改,无需修改子模块的源代码。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)