Spring学习-01day【Spring是啥?+ IOC理论推导——耦合问题】

Spring :是一种轻量级开源框架

  • 两大核心
    • IOC 反转控制:实例的创建不由调用者管理,而是由Spring容器创建管理。 在控制权上发生了反转~ (作用:摆脱了项目里复杂的对象管理工作
    • AOP 面向切面编程:
  • 一般采用服务端三层架构:
    1. 表现层(web):测试、客户、用户操作

    2. 业务层(service):逻辑代码

    3. 持久层(dao):接口、接口实现类

创建步骤

1.创建项目

2.导入maven

Spring 的mevan:

1 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
2 <dependency>
3     <groupId>org.springframework</groupId>
4     <artifactId>spring-webmvc</artifactId>
5     <version>5.3.15</version>
6 </dependency>

3.创建目录结构

Spring学习-01day【Spring是啥?+  IOC理论推导——耦合问题】

 

 

 DAO

  创建UserDao接口,添加一个方法

1 package com.sen.dao;
2 
3 public interface UserDao {
4    void getUser();
5 }

  创建UserDao接口实现类 UserDaoImpl 实现接口中的方法 并在调用是时会输出语句

1 package com.sen.dao;
2 
3 public class UserDaoImpl implements UserDao {
4     public void getUser() {
5         System.out.println("获取默认用户数据");
6     }
7 }

Service

  创建UserService接口,添加一个方法

1 package com.sen.service;
2 
3 public interface UserService {
4     void getUser();
5 }

  创建UserService实现类 实现接口中的方法

 1 package com.sen.service;
 2 
 3 import com.sen.dao.UserDao;
 4 import com.sen.dao.UserDaoImpl;
 5 
 6 public class UserServiceImpl implements UserService{
 7     //业务层怎么调用接口层? 把dao引入到service中
 8     private UserDao userDao= new UserDaoImpl();
 9 //接口的实例化:声明一个UserDao,他可以调用UserDaoImpl中的所有方法。
10     public void getUser() {
11 //这样!业务层就能调接口层了
12         userDao.getUser();
13     }
14 }

表现层

  创建测试类 在测试类中创建 业务层对象 执行业务层的方法();

 1 import com.sen.service.UserService;
 2 import com.sen.service.UserServiceImpl;
 3 
 4 public class FirstTest {
 5     public static void main(String[] args) {
 6         //用户(测试层)实际调用的是业务层,他们不需要接触 接口层
 7         UserService userService = new UserServiceImpl();
 8         userService.getUser();
 9     }
10 }

以上就最简单的三层架构 接口层、业务层 、表现层

Spring学习-01day【Spring是啥?+  IOC理论推导——耦合问题】

 

 

IOC理论推导 → 问题是:如果要再增加 一个实现类怎么 让客户(表现层)能够使用到他?

Spring学习-01day【Spring是啥?+  IOC理论推导——耦合问题】

 

 

改这个太麻烦。如果又再增加 一个实现类怎么解决?

通过set()方法进行依赖注入 在接口层注入set,将程序由主动变为被动,等用户层(表现层)传递参数!

1 private UserDao userDao;
2 
3     //利用set实现 值的 动态注入  接收 传过来的 》?
4     public void setUserDao(UserDao userDao) {
5         this.userDao = userDao;
6     }
  • 之前,程序是主动创建对象!控制权在程序猿手上

  • 使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象!

     1 import com.sen.dao.UserDaoMysqlImpl;
     2 import com.sen.service.UserService;
     3 import com.sen.service.UserServiceImpl;
     4 
     5 public class FirstTest {
     6     public static void main(String[] args) {
     7         //用户(测试层)实际调用的是业务层,他们不需要接触 接口层
     8         UserService userService = new UserServiceImpl();
     9 
    10         //用户 自主选择 传递给 UserDaoImpl 哪一个 (new 接口实现类 )
    11         ((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
    12 
    13         userService.getUser();
    14     }
    15 }

     

    UserService 说:行行行! 给你个接口,你想用啥用啥 (前提是你别忘了 set 注入)

    这个传递过程 建立在this的基础上,用啥就注入传递啥!set 其实是一个赋权的过程,将程序员的权力解构,赋予用户

    使得程序员可以不用管理对象的创建了,耦合性(关联、依赖程度)降低!

上一篇:Spring 简介和配置


下一篇:解决com.xpand依赖引入问题