SSM-IOC入门案例/DI入门案例
了解:分层架构包括:表现层(Controller层),业务逻辑层(Service层),数据访问层(Dao层)
每个层只关注特定的功能:
- 表现层:专注于用户界面和 HTTP 处理。
此处不涉及用户端,不需要controller,直接模拟APP调用Service:
import Service.BookService;
import Service.impl.BookServiceImpl;public class APP {public static void main(String[] args) {BookService bookservice=new BookServiceImpl();bookservice.save();}
}
- Service 层:专注于业务逻辑,不关心数据存储细节。
//接口
package Service;public interface BookService {void save();}
//实现类
package Service.impl;import Dao.BookDao;
import Dao.impl.BookDaoImpl;
import Service.BookService;public class BookServiceImpl implements BookService {BookDao bookdao=new BookDaoImpl();public void save(){System.out.println("book service save");bookdao.save();}
}
- DAO 层:专注于数据访问,不关心业务规则
package Dao;public interface BookDao {void save();
}
package Dao.impl;import Dao.BookDao;public class BookDaoImpl implements BookDao {public void save(){System.out.println("Book Dao Impl.save");}
}
用户请求(Web) → Controller接收请求 → Service验证业务规则(如用户名是否存在) → DAO查询数据库 → Service调用DAO保存用户 → Controller返回响应
一.IOC入门案例
(1)要进行IOC容器管理(将创建对象的权限交给SpringBoot容器管理),需要:
1.管理什么?(Service 和Dao)
2.通过配置文件,告诉容器哪些类需要管理
3.将对象交给IOC容器管理后,如何获得IoC容器? (通过接口)
4.IoC容器获得后,如何从容器中获得Bean? (接口方法,即接口的实现类)
具体实现:已经写好基础的调用Service,Dao后:
1.pom文件导入包spring,新增一个配置文件applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>beaProject</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- 修正Spring Context依赖的groupId --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>
2.在配置文件中配置对应的bean
<?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"><!--2编写配置文件:注意配置的是实现类不是接口通过id给他起别名,方便取的时候指定是哪一个BeanClass 表示给Bean定义类型--><bean id="bookDao1" class="Dao.impl.BookDaoImpl"></bean><bean id="Service1" class="Service.impl.BookServiceImpl"></bean></beans>
3.通过接口 获取IOC容器,4.通过容器获取bean 将需要调用的Bean的id作为参数传入
import Dao.BookDao;
import Service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App2 {public static void main(String[] args) {
// 3获取容器//需要将配置文件作为参数告诉接口ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");// 4.通过容器获取bean 将需要调用的Bean的id作为参数传入BookDao bookdao=(BookDao) ctx.getBean("bookDao1");bookdao.save();BookService bookService=(BookService)ctx.getBean("Service1");//多态写法bookService.save();}
}
二.DI入门案例
问题:上面的Service层中还是通过自己创建Dao中对象的方式,没有实现完全解耦: BookDao bookdao=new BookDaoImpl();
解决:DI注入
1.Service中需要的Dao对象如何进入到Service中 (提供方法)
2.Service和Dao间的关系如何描述?(通过配置指明)
还是在上面IoC容器的步骤上继续修改:
5.删除业务层中使用new方式创建Dao对象的代码:
6.提供Set方法,方便传入对象
package Service.impl;import Dao.BookDao;
import Service.BookService;public class BookServiceImpl implements BookService {
// 5.删除业务层中使用new方式创建Dao对象的代码
// BookDao bookDao=new BookDaoImpl();private BookDao bookDao;public void save(){System.out.println("book service save");bookDao.save();}//6.提供Set方法,方便传入对象public void setBookDao(BookDao bookDao){ //注意:需要使用正确的驼峰命名法,才能被正确识别set要小写,其他的开头大写this.bookDao=bookDao;}
}
7.在配置中指定Service 与Dao关系 (因为是Service中调用Dao所以在Dao中配置)
<?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"><!--2编写配置文件:注意配置的是实现类不是接口通过id给他起别名,方便取的时候指定是哪一个BeanClass 表示给Bean定义类型--><bean id="bookDao1" class="Dao.impl.BookDaoImpl"></bean><bean id="Service1" class="Service.impl.BookServiceImpl"><!--配置Service 与Dao关系 (因为是Service中调用Dao所以在Dao中配置)--><property name="bookDao" ref="bookDao1"/> <!--注意区分:name中指定的是Service中的属性,而ref中指定的是Bean的id名--></bean></beans>