Spring :是一种轻量级开源框架
-
两大核心
- IOC 反转控制:实例的创建不由调用者管理,而是由Spring容器创建管理。 在控制权上发生了反转~ (作用:摆脱了项目里复杂的对象管理工作
- AOP 面向切面编程:
- 一般采用服务端三层架构:
-
表现层(web):测试、客户、用户操作
-
业务层(service):逻辑代码
-
持久层(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.创建目录结构
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 }
以上就最简单的三层架构 接口层、业务层 、表现层
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 其实是一个赋权的过程,将程序员的权力解构,赋予用户
使得程序员可以不用管理对象的创建了,耦合性(关联、依赖程度)降低!