• Spring是什么?为什么要使用Spring?


    目录

    前言

    一、Spring是什么?

    1.1 轻量级

    1.2 JavaEE的解决方案

    二、为什么要使用Spring

    2.1 传统方式完成业务逻辑

    2.2 使用Spring模式完成业务逻辑

    三、为什么使用Spring?


    前言

    本文主要介绍Spring是什么,并且解释为何要去使用Spring,通过一个实际的案例来展示了Spring的强大之处。通过本章正式开始Spring的学习!


    一、Spring是什么?

    Spring是一个轻量级的Java企业开发的解决方案,整合了许多优秀的设计模式。

    1.1 轻量级

    • 对于运行环境是没有要求的

            开源的可以,收费的也可以

    • 代码的移植性高

            不用实现额外的接口

    1.2 JavaEE的解决方案

    为什么说Spring是JavaEE中的解决方案呢,在项目开发的过程中类似于Mybatis这种框架只是针对于DAO这一层进行操作,但是Spring对每一个层次都有相对的解决方案,所以这里称Spring为JavaEE中的解决方案。

    二、为什么要使用Spring

    2.1 传统方式完成业务逻辑

    上面只是简单的介绍了一下Spring,对于Spring详细介绍后面再来分析,接下来就分析一下为什么要使用Spring。

    对于传统的创建对象的模式,我们是通过直接new对象的方式。假设我现在有一个User类,我要通过UserDao类进行业务操作,然后通过UserService对UserDao类进行控制操作。那么传统的方法就是一步一步的new对象。

    1)首先,创建一个User类

    1. public class User {
    2. private String id;
    3. private String name;
    4. public User(String name, String password) {
    5. this.name = name;
    6. this.password = password;
    7. }
    8. }

    2)在UserDao中写出相应的业务操作

    1. public class UserDao {
    2. public void login(User user) {
    3. // 这里本来是需要写crud的具体操作的,但是为了演示方便就不写了
    4. System.out.println("name:"+user.name+",password:"+user.password);
    5. }
    6. }

    3)在UserService中进行相应的操作

    1. public class UserService {
    2. UserDao userDao = new UserDao();
    3. public void login(User user) {
    4. userDao.login(user);
    5. }
    6. }

    4)进行测试,模拟登录的过程

    1. @org.junit.Test
    2. public void test() {
    3. UserService userService = new UserService();
    4. User user = new User("张三","123456");
    5. userService.login(user);
    6. }

    此时该业务逻辑就完成了 

    假设这个时候UserService过时了,我想重新写一个UserServiceNew来操作业务逻辑,对于传统的方式可能就需要对代码进行修改。但是在项目中对代码进行了修改,就意味着要重新测试并部署。

    1. @org.junit.Test
    2. public void test() {
    3. //UserService userService = new UserService();
    4. UserServiceNew userServiceNew = new UserServiceNew();
    5. User user = new User("张三","123456");
    6. //userService.login(user);
    7. userServiceNew.login(user);
    8. }

    2.2 使用Spring模式完成业务逻辑

     此时就涉及解耦合,那么什么是耦合呢?

    耦合:指定是代码之间的强联系关系,一方的改变就会影响到另一方

    • 不利于代码的维护
    • 将类硬编码在程序中

    接下来就使用Spring模式再对上述业务逻辑进行操作。在测试的过程中,就不new Service对象了而是使用工厂模式去生产Service对象,这样可以解耦

    创建一个工厂类

    1. public class BeanFactory {
    2. public static UserService getUserService() {
    3. return new UserService();
    4. }
    5. }

     此时利用工厂类再去创建UserService对象

    1. @org.junit.Test
    2. public void test() {
    3. //UserService userService = new UserService();
    4. UserService userService = BeanFactory.getUserService();
    5. User user = new User("张三","123456");
    6. userService.login(user);
    7. }

    这时候细心的同学可能就发现了,工厂类中也是new对象啊,那不还是有耦合。确实是这样的,接下来就对工厂类继续修改(由于测试流程是一致的,这里就不在展示测试过程)

    1. public class BeanFactory {
    2. public static UserService getUserService() {
    3. // 这里使用反射创建对象
    4. UserService userService = null;
    5. try {
    6. Class clazz = Class.forName("com.gl.demo.UserService");
    7. userService = (UserService) clazz.newInstance();
    8. } catch (ClassNotFoundException e) {
    9. e.printStackTrace();
    10. } catch (InstantiationException e) {
    11. e.printStackTrace();
    12. } catch (IllegalAccessException e) {
    13. e.printStackTrace();
    14. }
    15. return userService;
    16. }
    17. }

    此时使用反射创建类对象大大降低了耦合,但是再细心一点的同学就会发现,那要是这个类名称变化了呢,这个代码还不是要修改 。说的对,接下来就是重头戏了,使用文件加载的方式加载类对象!

    1. public class BeanFactory {
    2. // 创建文件对象
    3. private static Properties env = new Properties();
    4. // 利用静态代码块一次性的加载文件
    5. static {
    6. InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
    7. try {
    8. env.load(inputStream);
    9. inputStream.close();
    10. } catch (IOException e) {
    11. e.printStackTrace();
    12. }
    13. }
    14. public static UserService getUserService() {
    15. UserService userService = null;
    16. try {
    17. Class clazz = Class.forName(env.getProperty("userService"));
    18. userService = (UserService) clazz.newInstance();
    19. } catch (ClassNotFoundException e) {
    20. e.printStackTrace();
    21. } catch (InstantiationException e) {
    22. e.printStackTrace();
    23. } catch (IllegalAccessException e) {
    24. e.printStackTrace();
    25. }
    26. return userService;
    27. }
    28. }

    此时回看代码,耦合基本上就没有了,如果要添加类的话,也只需要更改文件中的类路径就行了

    三、为什么使用Spring?

    对于类对象,不只是单单的存在一个UserService,回看UserService方法,也是new了一个UserDao对象。肯定也是存在耦合的,这里肯定也要利用工厂类获取

    此时在UserService中使用BeanFactory工厂类创建UserDao对象,并且在BeanFactory中创建对应的方法获取UserDao对象

    1. public class BeanFactory {
    2. // 创建文件对象
    3. private static Properties env = new Properties();
    4. // 利用静态代码块一次性的加载文件
    5. static {
    6. InputStream inputStream =
    7. BeanFactory.class.getResourceAsStream("/applicationContext.properties");
    8. try {
    9. env.load(inputStream);
    10. inputStream.close();
    11. } catch (IOException e) {
    12. e.printStackTrace();
    13. }
    14. }
    15. public static UserDao getUserDao() {
    16. UserDao userDao = null;
    17. try {
    18. Class clazz = Class.forName(env.getProperty("userDao"));
    19. userDao = (UserDao) clazz.newInstance();
    20. } catch (ClassNotFoundException e) {
    21. e.printStackTrace();
    22. } catch (InstantiationException e) {
    23. e.printStackTrace();
    24. } catch (IllegalAccessException e) {
    25. e.printStackTrace();
    26. }
    27. return userDao;
    28. }
    29. public static UserService getUserService() {
    30. UserService userService = null;
    31. try {
    32. Class clazz = Class.forName(env.getProperty("userService"));
    33. userService = (UserService) clazz.newInstance();
    34. } catch (ClassNotFoundException e) {
    35. e.printStackTrace();
    36. } catch (InstantiationException e) {
    37. e.printStackTrace();
    38. } catch (IllegalAccessException e) {
    39. e.printStackTrace();
    40. }
    41. return userService;
    42. }
    43. }

    此时,问题又出现了,每当需要获取一个对象的时候我都要写一个方法,那这样的代码冗余不是非常高吗!此时就可以使用Object来返回对象解决此问题!

    1. public class BeanFactory {
    2. // 创建文件
    3. private static Properties env = new Properties();
    4. // 利用静态代码块一次性的加载文件
    5. static {
    6. InputStream inputStream =
    7. BeanFactory.class.getResourceAsStream("/applicationContext.properties");
    8. try {
    9. env.load(inputStream);
    10. inputStream.close();
    11. } catch (IOException e) {
    12. e.printStackTrace();
    13. }
    14. }
    15. // 此时就利用参数获取想要创建的对象
    16. public static Object getBean(String key) {
    17. Object ret = null;
    18. try {
    19. Class clazz = Class.forName(env.getProperty(key));
    20. ret = clazz.newInstance();
    21. } catch (ClassNotFoundException e) {
    22. e.printStackTrace();
    23. } catch (InstantiationException e) {
    24. e.printStackTrace();
    25. } catch (IllegalAccessException e) {
    26. e.printStackTrace();
    27. }
    28. return ret;
    29. }
    30. // public static UserService getUserService() {
    31. // UserService userService = null;
    32. // try {
    33. // Class clazz = Class.forName(env.getProperty("userService"));
    34. // userService = (UserService) clazz.newInstance();
    35. // } catch (ClassNotFoundException e) {
    36. // e.printStackTrace();
    37. // } catch (InstantiationException e) {
    38. // e.printStackTrace();
    39. // } catch (IllegalAccessException e) {
    40. // e.printStackTrace();
    41. // }
    42. // return userService;
    43. // }
    44. //
    45. // public static UserDao getUserDao() {
    46. // UserDao userDao = null;
    47. // try {
    48. // Class clazz = Class.forName(env.getProperty("userDao"));
    49. // userDao = (UserDao) clazz.newInstance();
    50. // } catch (ClassNotFoundException e) {
    51. // e.printStackTrace();
    52. // } catch (InstantiationException e) {
    53. // e.printStackTrace();
    54. // } catch (IllegalAccessException e) {
    55. // e.printStackTrace();
    56. // }
    57. // return userDao;
    58. // }
    59. }

    对于之前的类对象获取也需要进行相应的处理,强制类型转化即可。

    至此,所有的问题都已经解决完毕了!!! 从上面的过程可以发现,解耦的过程还是很复杂的,但是在Spring中已经包含了工厂的设计模式!并不需要我们去手动的写工厂类,我们只需要去使用Spring中的工厂类就可以了。Spring 框架提供了许多功能和特性,可以帮助开发人员快速构建企业应用程序。所以这也就是我们为什么要使用Spring进行项目开发的原因!

    这里Spring的本质也就可以总结为:工厂!一个功能强大的工厂!至此Spring的学习正式开始

  • 相关阅读:
    API攻防-接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
    【产品运营】如何提升B端产品竞争力(下)
    Java毕业设计 SpringBoot 美食推荐系统 美食分享系统
    【Python 零基础入门】常用内置函数 再探
    代码随想录训练营二刷第五十二天 | 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV
    ES6中什么是Promise?
    如何用CHAT 写会后总结
    STM32_HAL_I2C_串行接口
    前端面试(手写题)
    pytest系列之参数化
  • 原文地址:https://blog.csdn.net/x2656271356/article/details/133815822