Spring单体应用之初识spring

Spring单体应用之初识spring

初见

	人生若只是初见,又岂在朝朝暮暮,感觉学习spring也是一样呀 只要慢慢的认识 了解才能慢慢的掌握它的大部分知识,博主也是第一次学习它,把自己学的记录下来也算是一种学习方法吧,看山是山,让我们慢慢来揭开它神秘的面纱;

Spring简介

  • 从诞生到现在有15年了,一个框架能活这多多年 肯定有着它很多优势,Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。
  • 但是spring最大的作用还是它的 还是解耦(解决企业级开发的复杂度问题,java的核心还是高内聚低耦合 所以spring这个框架确实是跟优秀 (关于Java的七大设计原则,我会在后面的博客有讲到,仅仅是初学者的一点小总结,不喜勿喷)
  • 低侵入式设计,代码的污染极低 但是现在的话还是很难做到完全没有耦合 我们只能说尽量降低耦合;
  • 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。 一次实现,各处运行
  • spring的LoC(依赖注入和依赖查找2种(第二种不怎么用了), Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。
  • Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
  • spring(胶水框架)Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。它的理念就是如果有另外一个框架有做的比我好的地方 你就能把我替换掉 因为我的的代码不会出现在你的逻辑业务中出现,

spring框架的架构组成

在这里插入图片描述

  1. 整体的包名Spring Framework Runtime
  2. Data Access 数据访问层四种
  3. integration 集成
  4. 1JDBC与数据库打交道的() 2orm 对象关系映射(mybaties) 4transactions 事物支持
  5. Web层 SpringMVC() ; portlet(聚合其他组件 由它完成组件的拼接,servlet容器,思想单一职责原则,最少知识原则,)
  6. AOP(面向切面编程)
  7. core Container(核心容器);
  8. beans core context ExpreesionLanguage(四个项目主架包需要依赖他们)
  9. Test(单元测试用)

Spring的核心机制

管理Bean

程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:

  1. ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。(从配置文件中来加载,这个方法的话就是要我们多关注配置文件)
  2. FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
  3. 来一个插曲虽然也没人这么用 对于servlet来说 因为servlet是由我们的tomcat创造的 所以他应该在我们的spring之前产生 但是我们如果在spring里一定要使用servlet也不是不可以 我们可以这样做 生成一个工具类 去实现ApplicationContextAware这个接口 实现get set方法 这样在启动spring之前会自动找到这个类 创造servlet这样的话我们就可以使用了
    代码如下
package com.qf.user.utils;

import org.springframework.context.ApplicationContext;

public abstract class SpringHolder implements  ApplicationContext{
    private  static ApplicationContext applicationContext;

    public static void setApplicationContext(ApplicationContext applicationContext) {
        SpringHolder.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

-----------------------------------------------------------------
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ApplicationContext applicationContext = SpringHolder.getApplicationContext();
        UserService bean = applicationContext.getBean(UserService.class);
        bean.getUserNum();
    }
}

依赖注入

  1. ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“spring-context.xml”);这种是写配置文件 这种 D d=(D) applicationContext.getBean(“d”); 传的是配置文件的id
  2. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(“com.qf.user”);
    D d = (D) applicationContext.getBean(D.class); 这种是传的要使用的那个类的.class文件
    这种是写注解 然后sprin会扫面所有的文件去寻找看有没有这种注解然后给我们配置 D d = (D) applicationContext.getBean(D.class);这种是写注解 然后sprin会扫面所有的文件去寻找看有没有这种注解然后给我们配置 @Service它是相当于配置< bean > @Autowired 相当于 prproperty
  • Spring容器作为超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。
  • Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。赖注入,不仅可以为Bean注入普通的属性值,还可以注入其他Bean的引用。依赖注入是一种优秀的解耦方式,其可以让Bean以配置文件组织在一起,而不是以硬编码的方式耦合在一起。
  • 原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法。
    简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。
  • 注意上面的主动二字,这必然会导致调用者与被依赖对象实现类的硬编码耦合,非常不利于项目升级的维护。使用Spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可,由此可见,使用Spring后,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受
  • 另外从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例,因此Martine Fowler称之为依赖注入。

JUnit 简介

JUnit 是用于编写和运行可重复的自动化测试的开源测试框架,这样可以保证我们的代码按预期工作。JUnit 可广泛用于工业和作为支架(从命令行)或IDE(如 IDEA)内单独的 Java 程序。

JUnit 特点

JUnit 是用于编写和运行测试的开源框架。
提供了注释,以确定测试方法。
提供断言测试预期结果。
提供了测试运行的运行测试。
JUnit 测试让您可以更快地编写代码,提高质量
JUnit 是优雅简洁。它是不那么复杂以及不需要花费太多的时间。
JUnit 测试可以自动运行,检查自己的结果,并提供即时反馈。没有必要通过测试结果报告来手动梳理。
JUnit 测试可以组织成测试套件包含测试案例,甚至其他测试套件。
Junit 显示测试进度的,如果测试是没有问题条形是绿色的,测试失败则会变成红色。

JUnit 断言

断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
意思就是我判断这个地方会是多少或者会不会是真 就是我理论上来说我已经知道这个代码要走的顺序 所以如果代码没有错误就会按我的想法来 如果错 了就会报错 这就是断言 我的理解就是现在判断未来

断言描述
void assertEquals([String message], expected value, actual value)断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息
void assertTrue([String message], boolean condition)断言一个条件为真
void assertFalse([String message],boolean condition)断言一个条件为假
void assertNotNull([String message], java.lang.Object object)断言一个对象不为空(null)
void assertNull([String message], java.lang.Object object)断言一个对象为空(null)
void assertSame([String message], java.lang.Object expected, java.lang.Object actual)断言,两个对象引用相同的对象
void assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual)断言,两个对象不是引用同一个对象
void assertArrayEquals([String message], expectedArray, resultArray)断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object.

看到了如此单元测试的写法
如下:
@RunWIth(SpringJunit4ClassRunner.class)
@ContextConfiguration(locations = {“classpath:applicationContext.xml”}
public class MyTest
{
这种写法是为了让测试在Spring容器环境下执行。
Spring的容器环境是啥呢?
比如常见的 Service Dao Action , 这些个东西,都在Spring容器里,junit需要将他们拿到,并且使用来测试。*

Log4j 简介(后面还有logback)

一个完整的软件,日志是必不可少的。程序从开发、测试、维护、运行等环节,都需要向控制台或文件等位置输出大量信息。这些信息的输出, 在很多时候是使用 System.out.println() 无法完成的。

  1. 日志信息根据用途与记录内容的不同,分为 调试日志、运行日志、异常日志 等。
  2. Log4j 的全称为 Log for java,即专门用于 Java 语言的日志记录工具。
  3. 为了方便对于日志信息的输出显示,对日志内容进行了分级管理。日志级别由高到低,共分 6 个级别:
    fatal(致命的)
    error
    warn
    info
    debug
    trace(堆栈)

为什么要对日志进行分级

  • 无论是将日志输出到控制台,还是文件,其输出都会降低程序的运行效率。但由于调试、运行维护的需要,客户的要求等原因,需要进行必要的日志输出。这时就必须要在代码中加入日志输出语句。

  • 这些输出语句若在程序运行时全部执行, 则势必会降低运行效率。例如, 使用 System.out.println() 将信息输出到控制台,则所有的该输出语句均将执行。会大大降低程序的执行效率。而要使其不输出,唯一的办法就是将这些输出语句逐个全部删除。这是个费时费力的过程。

  • 将日志信息进行分级管理,便可方便的控制信息输出内容及输出位置:哪些信息需要输出,哪些信息不需要输出,只需在一个日志输出控制文件中稍加修改即可。而代码中的输出语句不用做任何修改。

  • 从这个角度来说,代码中的日志编写,其实就是写大量的输出语句。只不过,这些输出语句比较特殊,它们具有级别,在程序运行期间不一定被执行。它们的执行是由另一个控制文件控制。

Slf4j 简介

slf4j 的全称是 Simple Loging Facade For Java,即它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则而已。所以单独的 slf4j 是不能工作的,必须搭配其他具体的日志实现方案,比如 apache 的 org.apache.log4j.Logger,JDK 自带的 java.util.logging.Logger 以及 log4j 等。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值