spring

Posted instinct-em

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring相关的知识,希望对你有一定的参考价值。

1. 引言

1.1 EJB存在的问题

  1. 运行环境苛刻
  2. 代码移植性差

1.2 什么是Spring

Spring是一个轻量级的JavaEE解决方案,整合众多优秀的设计模式。

  • 轻量级
    1. 对于运行环境没有特殊要求
      开源: Tomcat resion jetty
      收费: weblogic webaphere
    2. 代码移植性高: 不需要实现额外接口
  • JavaEE的解决方案
    img1
  • 整合设计模式
    1. 工厂
    2. 代理
    3. 模板
    4. 策略
  • 设计模式
    • ?义概念:?向对象设计中,解决特定问题的经典代码。
    • 狭义概念:GOF4?帮定义的23种设计模式:??、适配器、装饰器、??、代理、模板…

1.3 ??设计模式

  1. 概念:通过??类,创建对象;

    User user = new User();
    UserDAO userDAO = new UserDAOImpl();
    
  2. 好处:解耦合
    • 耦合:指定是代码间的强关联关系,??的改变会影响到另??;
    • 问题:不利于代码维护;
    • 简单:把接?的实现类,硬编码在程序中;

      UserService userService = new UserServiceImpl();
      

1.4 简单工厂的设计

package com.baizhiedu.basic;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {
    private static Properties env = new Properties();

    static{
        try {
            //第一步 获得IO输入流
            InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
            //第二步 文件内容 封装 Properties集合中 key = userService value = com.baizhixx.UserServiceImpl
            env.load(inputStream);

            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /*
           对象的创建方式:
               1. 直接调用构造方法 创建对象  UserService userService = new UserServiceImpl();
               2. 通过反射的形式 创建对象 解耦合
               Class clazz = Class.forName("com.baizhiedu.basic.UserServiceImpl");
               UserService userService = (UserService)clazz.newInstance();
     */

    public static UserService getUserService() {
        UserService userService = null;
        try {
            //com.baizhiedu.basic.UserServiceImpl
            Class clazz = Class.forName(env.getProperty("userService"));
            userService = (UserService) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userService;
    }

    public static UserDAO getUserDAO(){
        UserDAO userDAO = null;
        try {
            Class clazz = Class.forName(env.getProperty("userDAO"));
            userDAO = (UserDAO) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userDAO;
    }

}

配置文件 applicationContext.properties:

# Properties 集合 存储 Properties文件的内容
# 特殊Map key=String value=String
# Properties [userService = com.baizhiedu.xxx.UserServiceImpl]
# Properties.getProperty("userService")

userService = com.baizhiedu.basic.UserServiceImpl
userDAO = com.baizhiedu.basic.UserDAOImpl

1.5 通用工厂的设计

问题:简单??会存在?量的代码冗余。
img2

通???的代码:

package com.baizhiedu.basic;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {
    private static Properties env = new Properties();
    static{
        try {
            //第一步 获得IO输入流
            InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
            //第二步 文件内容 封装 Properties集合中 key = userService value = com.baizhixx.UserServiceImpl
            env.load(inputStream);

            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

     /*
      key 小配置文件中的key [userDAO,userService]
      */
     public static Object getBean(String key){
         Object ret = null;
         try {
             Class clazz = Class.forName(env.getProperty(key));
             ret = clazz.newInstance();
         } catch (Exception e) {
            e.printStackTrace();
         }
         return ret;
     }

}

1.6 通???的使??式

  1. 定义类型 (类)
  2. 通过配置?件的配置告知?? applicationContext.properties 中 key = value;
  3. 通过??获得类的对象 Object ret = BeanFactory.getBean("key");

1.7 总结:

Spring本质: ?? ApplicationContext (applicationContext.xml)

2. 第一个 Spring 程序

使用工具idea

2.1 环境搭建

依赖查询网站:https://mvnrepository.com/;

  • 配置 Spring 的 jar 包:

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.4.RELEASE</version>
    </dependency>
    
  • Spring 的配置文件:
    1. 配置?件的放置位置:任意位置,没有硬性要求;
    2. 配置?件的命名 :没有硬性要求,建议: applicationContext.xml
  • 思考:?后应? Spring 框架时,需要进?配置?件路径的设置。

以上是关于spring的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段

一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式