学习了一段时间的Spring,决定进行一个自我总结,防止自己忘了,顺便也是和大家交流一下,看有没有需要补充的。第一次写博客。。。有点小激动
Spring概述:
1.Spring:春天,给整个行业带来春天,蓬勃发展
2.2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架(前身)
3.2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。
4.很难想象Rod Johnson的学历 , 他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
5.Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术
6.官网:https://spring.io/
7.官网下载:https://repo.spring.io/release/org/springframework/spring/
8.文档:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java
优点
1.他是一个开源免费的框架,容器
2.两大特点:控制反转 IOC, 面向切面 AOP
3.Spring是一个轻量级的框架 , 非侵入式的(没什么概念,可能还没有学到)
…
组成
Spring框架是一个分层架构,由7个模块组成。
七大模块的功能如下:
1.核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开来
2.Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
3.Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
4.Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
5.Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
6.Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
7.Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
注:对于一些模块的理解不到位,等之后学习了回来复习
IOC基础
新建一个maven项目
实现分析
-
原来的方式
1.先写一个UserDao接口public interface UserDao { public void getUser(); }
2.再去写Dao的实现类
public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("获取用户数据"); } }
3.然后去写UserService的接口
public interface UserService { public void getUser(); }
4.最后写Service的实现类
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public void getUser() { userDao.getUser(); } }
5.测试一下
@Test public void test(){ UserService service = new UserServiceImpl(); service.getUser(); }
之前我们都是这么写的,如果不是,建议回去回炉重造。
-
现在我们修改一下,把UserDao的类修改一下
public class UserDaoMySqlImpl implements UserDao { @Override public void getUser() { System.out.println("MySql获取用户数据"); } }
然后如果我们要去使用MySql的话,我们就要去service实现类里面去修改对应的对象
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoMySqlImpl(); @Override public void getUser() { userDao.getUser(); } }
这时候如果我们再增加一个UserDao的实现类
public class UserDaoOracleImpl implements UserDao { @Override public void getUser() { System.out.println("Oracle获取用户数据"); } }
那这时候如果我们要去使用,就又要去service类里面去改
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoOracleImpl(); @Override public void getUser() { userDao.getUser(); } }
看似很简单,但是这是因为工程小,代码少,如果多起来呢,那就很麻烦,甚至改错了,忘了一两处没改都不知道哪里错。
解决方法
我们可以在需要用到它的地方设置一个set()方法,就是我们不再是去实现它,而是留一个接口给它,需要用的时候就直接注入。
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void getUser() { userDao.getUser(); } }
再测试看看
@Test public void test(){ UserServiceImpl service = new UserServiceImpl(); service.setUserDao(new UserDaoImpl()); service.getUser(); service.setUserDao(new UserDaoOracleImpl()); service.getUser(); }
是不是觉得没什么区别???
肯定有啊,没有要他干嘛
仔细想想,在之前,我们是不是所有的东西都要去到代码里面去进行修改,现在是不是直接把主动权交给了调用者了。
打了比方,我们都diy自己的网站吧,什么大小啊等等这些功能。如果每次diy都要去改代码是不是很烦,那现在我把接口流出来了,你要改的话直接把他注入进去就行,是不是就方便了很多。再品品。。。IOC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
说白了,就是代码直接的关系不再是那么紧密了,不用牵一发而动全身,那对我们来说是不是就方便了很多。
学Spring必须要懂,不懂的话,后面的学了也是白给。
最后
以上所有是通过在哔哩哔哩中遇见狂神说,狂神老师学习的,在这里表示热衷的感谢,又不懂的大家也可以去看看他的视频。