Spring5深入浅出篇:Spring工厂简单原理以及日志应用
Spring⼯⼚的底层实现原理(简易版)
还是通过分析第一个Spring程序来展开说说Spring工厂的简单原理
首先创建实体类
package com.baizhiedu.basic; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; // new Person() 通过工厂 public class Person { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person() { } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
然后在Spring配置文件中配置bean(applicationContext.xml)
<bean id="person" class="com.baizhiedu.basic.Person"/>
然后编写测试类
/** * 用于测试:用于测试Spring的第一个程序 */ @Test public void test3() { //1 获得Spring的工厂 ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml"); //2 通过工厂类 获得 对象 Person person = (Person) ctx.getBean("person"); System.out.println("person = " + person); }
因为我们是通过测试类使用Spring工厂的,所以我们也从测试类开始进行分析.
- 首先通过ApplicationContext工厂读取配置文件applicationContex.xml
- 获取bean标签的相关信息 如 id = person ,class的值 = com.baizhiedu.basic.Person
- 通过反射来创建对象
Class<?> clazz = Class.forName(class的值); id的值 = clazz.newInstance();
- 反射创建对象底层也是会调用对象自己的构造方法
Class<?> clazz = Class.forName(class的值); id的值 = clazz.newInstance(); 等效于(注意这里使用的是等效) Account account = new Account()
对象创建的问题
问题:未来在开发过程中,是不是所有的对象,都会交给Spring⼯⼚来创建呢? 回答:理论上 是的,但是有特例 :实体对象(entity)是不会交给Spring创建,它是由持久层框架进⾏创建。
Spring5.x与⽇志框架的整合
Spring与⽇志框架进⾏整合,⽇志框架就可以在控制台中,输出Spring框架运⾏过程中的⼀些 重要的信息。 好处:便于了解Spring框架的运⾏过程,利于程序的调试
- Spring如何整合⽇志框架
默认 Spring1.2.3早期都是于commons-logging.jar Spring5.x默认整合的⽇志框架 logback log4j2 Spring5.x整合log4j 1. 引⼊log4j jar包 2. 引⼊log4.properties配置⽂件
- 引入依赖到pom.xml
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 新建log4j.properties配置文件配置日志输出
# resources # resources⽂件夹根⽬录下 ### ### 配置根 log4j.rootLogger = debug,console ### ### ⽇志输出到控制台显示 log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n