Spring整合日志框架以及Spring核心控制反转依赖注入(上)

免费内容(初学,复习,和就业前,知识回顾)
Spring工厂模式的实现

学习中如果有想要了解的知识和不会的可以评论留言,尽最大可能帮助你们,也会把问题的答案免费发布出来供提问的和其他人参考
章语
所谓天才,只不过是把别人不以为然的顶顶点点时间用在了工作和学习上,利用零星时间的人才会有更大的成功,与其羡慕,不如自己努力。 --恠咖


请认真仔细阅读发布的内容,有很多实战开发中的细节,很容易忽视掉

此文档连续更新中,所有框架内容以及微服务架构开发和实战项目
Spring概述以及第一个Spring(第一章)
Spring整合日志框架以及Spring核心控制反转依赖注入(第二章上内容多正在整理)
持续更新

Spring整合日志框架及Spring的第一个核心

在使用Spring的时候,我们可以通过日志输出从而达到更好的掌握和了解程序,进行改善,现在主流的框架也非常多常用的有Log4j,Log4j2,Logback,SLF4j等,而这里我们使用的是Log4j。

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息的打印输出从而进行程序的调试、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最方便的是,这些都可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

在Spring的学习中牵扯到整合xxx框架或者其他东西都是需要导入相关依赖就是我们所说的jar包如果创建的不是maven项目需要添加jar包可以去maven官网下载对应的jar包即可

步骤:1,导入相关依赖。2,配置log4j.properties配置文件

步骤
1. 导入依赖
2. 编写配置文件

导入依赖

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.25</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

配置文件

log4j.rootLogger=debug,stdout,info,debug,warn,error 

#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/com/hp/log/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout 
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/com/hp/log/error.log 
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR 
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

关于配置文件我们也可以使用xml配置效果等同properties

第三模块

注入(lnjection)

什么是依赖注入

首先了解一下什么是控制反转,控制反转即IOC(Inversion of Control)是一个重要的编程思想,主要用来减少代码之间的耦合度,也是轻量级框架Spring的核心

通俗理解

控制反转:它把传统上由程序代码直接操控的对象的控制权交给容器,通过容器来实现对象的创建和管理。

控制:对于成员变量的控制权,

控制反转:就是把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中完成,其最大的好处就是解耦合,底层采用了工厂的设计模式.

依赖注入(Dependency Injection)和控制反转(Inversion of Control),具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

依赖注入的基本原则

应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IoC容器负责。DI(依赖注入)主要有两种方式:基于构造器的依赖注入和基于 Set 的依赖注入。

控制反转和依赖注入的区别

控制反转:创建对象实例的控制权从代码中转移到IOC容器控制,实际就是你在xml文件控制,侧重于原理。依赖注入:创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。

为什么需要注入?

学习就是知其然 知其所以然,下面用一个例子说明当通过第一个Spring程序.我们通过创建容器已经把对象创建出来了,在以前的开发中都是这样

Student student = new Student();
student.setName("小飞");

问题随之而来,如果我们在Spring中也可以这样应用

import com.jing.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InjectionTest {

    @Test
    public void BeanTest(){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/ApplicationContext01.xml");
        Student student = ctx.getBean("student",Student.class);
        student.setName("小飞");
        System.out.println(student.getName());
    }
}

在功能上可能没有任何区别,当我们需要更改的时候需要在代码中进行更改,却存在了耦合,这时候就可以使用Spring所提供的注入(DI)。

Set注入

在Spring的开发中解决了这个问题我们可以在配置文件中进行属性值的注入,从而达到解耦合

JDK内置类型的注入

String+基本数据类型实例
步骤
1. 编写实体类
2. 配置文件
3. 测试类

实体类Student

public class Student {
    private String name;
    private int age;
    private double score;
    private float English;
    private long values;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public float getEnglish() {
        return English;
    }

    public void setEnglish(float english) {
        English = english;
    }

    public long getValues() {
        return values;
    }

    public void setValues(long values) {
        this.values = values;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                ", English=" + English +
                ", values=" + values +
                '}';
    }
}

ApplicationContext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    

 <bean id="student" class="com.jing.Student" >
  <property name="name" value="小飞"/>
  <property name="age" value="18"/>
  <property name="english" value="99"/>
  <property name="score" value="95"/>
  <property name="values" value="20090701"/>
 </bean>
</beans>

name属性是实体类中的属性名 value则是属性值

测试类

import com.jing.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InjectionTest {

    @Test
    public void BeanTest(){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/ApplicationContext01.xml");
        Student student = ctx.getBean("student",Student.class);
        System.out.println(student.toString());
    }
}

这样赋值当需要修改的时候可以不需要修改代码就可以对属性值进行修改以达到解耦合的作用。

思考分析

验证是不是通过set方法进行赋值

正在整理中依赖注入(中)

  • 基本数据类型注入和复杂数据类型注入和依赖注入总结
  • 第三章节
    • 学完依赖注入并且学会通过Bean创建简单对象之后,下面就是复杂数据类型的创建,在学习中需要掌握的也是工作实战面试中较为重要的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离落&恠咖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值