对应文件工程为heima。

1.三层架构

Spring 是分层的轻量级开源框架,以 IoC(Inverse of Control,控制反转)和 AOP(Aspect Oriented Programming,面向切面编程)为内核。在实际开发中,通常服务器端采用三层体系架构,分别为表现层(web)、业务逻辑层(service)、持久层(dao)。

1.1持久层(dao)

全称Data Access Object,是和数据库交互的。Dao层比较底层,负责与数据库打交道具体到对某个表、某个实体的增删改查

1.2业务层(service)

是处理业务需求的。又叫服务层或业务层,封装Dao层的操作,使一个方法对外表现为实现一种功能,例如:网购生成订单时,不仅要插入订单信息记录,还要查询商品库存是否充足,购买是否超过限制等等。

1.3表现/控制层

是用于展示数据的。主要负责具体的业务模块流程控制,通过要调用Service层的接口来控制业务流程,控制的配置也同样是在Spring的xml配置文件里面,针对具体的业务流程,会有不同的控制器。

2.初识ioc

以前对象之间的引用都是通过new来实现的,有了Spring IOC后,我们可以把对象之间的引用交给它来管理,这样就把控制权交给了Spring,所以就叫控制反转。作用也是减低程序代码之间的耦合程度。

2.1ioc常用功能

IOC容器的结构是Map结构,采用maven来创建工程。pom配置为:

            <groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>

使用基于xml文件来获取对象,使用bean标签。首先获取spring的Ioc核心容器,并根据id获取对象。

bean.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">

<!--把对象的创建交给spring来管理-->
<bean id="accountService" class="cn.smm.service.impl.AccountServiceImpl"></bean>
<bean id="accountDao" class="cn.smm.dao.impl.AccountDaoImpl"></bean>
</beans>

通过ioc容器来获取对象:

//        IAccountService as = new AccountServiceImpl();//new增加了代码的耦合
// 1.获取核心容器,有以下两种:
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
ApplicationContext ac = new FileSystemXmlApplicationContext("D:\\ideacode\\spring-demo-heima\\src\\main\\resources\\bean.xml");

ApplicationContext的三个常用实现类:

  • ClassPathXmlApplicationContext :(常用)它可以加载类路劲下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。
  • FileSystemXmlApplicationContext:它可以加载磁盘任意路径下的配置文件(必须有访问权限)
  • AnnotationConfigApplicationContext:它是用于读取注解创建容器的
    核心容器的两个接口引发出的问题:
  • (常用)ApplicationContext:
    单例对象适用。它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件,马上就创建配置文件中的配置对象。
  • BeaFactory:
    多例对象适用。它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。其有个实现类XmlBeanFactory即将过时。

如下是通过核心容器获取对象:

//        2.根据id获取bean对象,以下展示两种方式,一是强制类型转换,二是传入字节码文件
IAccountService as = (IAccountService) ac.getBean("accountService");
IAccountDao adao = ac.getBean("accountDao", IAccountDao.class);