当我们学习javaweb到一定程度时,如果还使用简单的mvc设计模式,什么框架都不使用,对于开发者来说是痛苦的,我们不仅要了解,前台开发的知识,这里主讲后台的实现,你会发现作为一个后台程序员,要学习的东西太多了,我们不仅了解,各个主流数据库的差异,还要了解标准数据库语言,还要了解jdbc操作,以及jsp+servlet+javaBean,等实现原理,还要了解过servlet过滤器,监听器,等,以及事务的处理,事务的隔离级别,如果不使用任何框架,我们可能采用mvc三层模式,即web,service,dao,但是分为三层并没用多大的意义,因为宏观上,三层是分开了,给人的印象也许是,也许是代码上的三层,底层实际上还是耦合在一起.对事务的管理也许会拉长事务的处理时间,在请求级别上,开启事务session,在过滤器中开启session,然后绑定到当前线程,也许这样可以保证,一次请求一次事务,但是拉长了事务处理的时间,对于大访问量的网站来说,也是间接浪费服务器资源.
好了,言归正传,总之框架的出现,减少了程序员的重复代码,可以使我们快速特定的业务需求,也定义了代码标准.
现在流行的mvc模式面向接口编程等设计思想,都是减少各个层次的耦合度,软件的设计就是要高内聚低耦合,比如说我们当前的项目满足了我们当前的需求,但是如过某一天,我们的客户又提出了另一种需求,难道我们还用重新再写一遍项目吗?这显然费时费力,这时也就体现了高内聚低耦合的优势,如果一开始我们的项目各个层次之间的耦合度较低,也许我们只要修改配置文件,增加一些模块,就可以当前项目满足客户的要求.
目前经典的三层体系架构所使用的框架都有:
web:struts2,springmvc
service:spring
dao:hibernate,mybatis,ibatis, jdbctemplate,spring data等;
未使用框架的时的三层耦合度(上图):
而当我们使用spring框架时,我们可以使用spring框架可以从配置文件中得到Dao层实现类和Service层实现类,还可以指定要使用的工厂,我们要使用的具体类可以右spring来管理,也就是具体的依赖管理,不由被
依赖的双方管理,而是由第三方管理,这就是spring容器,其实淘宝也是就是一个大容器,
这就实现了各个层次的解耦,增强了程序的健壮性.
spring第一个程序:
dao层:
package com.leige.dao;
public interface UserDao {
public void add();
}
daoimpl
package com.leige.dao;
public class UserDaoImpl implements UserDao{
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("userDao----add");
}
}
service层:
package com.leige.dao;
public interface UserService {
public void save();
}
service实现:
package com.leige.dao;
public class UserServiceImpl implements UserService {
private UserDao dao;
//被注入的属性要包含set方法:
public void setDao(UserDao dao) {
this.dao = dao;
}
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("userService");
dao.add();
}
}
spring配置beans:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--
<context:component-scan base-package="com.itheima.g_annotation.b_web"></context:component-scan>
-->
<!-- 使 注入的注解可以使用 -->
<!-- 所有的bean都在xml配置
所有的依赖都是注解
--><bean name=" userDaoId" class="com.leige.dao.UserDaoImpl"></bean>
<bean name="userServiceId" class="com.leige.dao.UserServiceImpl">
<property name="dao" ref="userDaoId"></property>
</bean>
</beans>
测试:
package com.leige.dao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo {
@Test
public void test() {
String xmlPath = "beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
UserService service=(UserService) applicationContext.getBean("userServiceId");
service.save();
}
}