学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】
第二章、第一个Spring程序
1.软件版本
1.JDK1.8+
2.Maven3.5+
3.IDEA2018+
4.SpringFramework 5.1.4
2.环境搭建
- 
Spring的jar包 1.设置pom的依赖 xml<!-- 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框架时,需要进行配置文件路径的位置。  
3.Spring的核心API
- 
ApplicationContext 作用:Spring提供的ApplicationContext这个工厂,用于对象的创建 好处:解耦合 - 
ApplicationContext接口类型 接口:屏蔽实现的差异 非web环境:ClassPathXmlApplicationContext(例如:main junit) web环境:XmlWebApplicationContext 
  可以看到ApplicationContext就是一个接口 - 
重量级资源(对象占用内存多就是重量级资源。) 1.ApplicationContext工厂的对象占用大量内存(指的是下面的实现类) 2.不会频繁的创建对象:一个应用程序只会创建一个工厂对象 3.ApplicationContext工厂:一定是线程安全的(多线程并发访问) 
 
- 
4.程序开发
spring开发的4个步骤
1.创建类型
2.配置文件的配置 applicationContext.xml
<bean id="person" class="com.baizhi.basic.Person"/>
3.通过工厂类 获得对象
ApplicationContext | ClassPathXmlApplicationContext
            
            
              java
              
              
            
          
          //1.获取Spring的工厂
ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
//2 通过工厂类获取对象
Person person = (Person) context.getBean("person");5.细节分析
- 
名此解释 Spring工厂创建的对象叫做bean 
- 
Spring工厂的相关方法 javaPerson person = context.getBean("person", Person.class); System.out.println("person = " + person); 当前Spring的配置文件中只能有一个<bean class是Person类型 Person person = context.getBean(Person.class); System.out.println("person = " + person); 获取的是 Spring工厂配置文件中所有bean标签的id值 person person1... String[] beanDefinitionNames = context.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { System.out.println(beanDefinitionName); } //根据类型获取Spring配置文件中对应的id值 String[] beanNamesForType = context.getBeanNamesForType(Person.class); for (String s : beanNamesForType) { System.out.println(s); } //用于判断是否存在指定id值的bean System.out.println(context.containsBeanDefinition("person")); //用于判断是否存在指定id值的bean System.out.println(context.containsBean("person"));
- 
配置文件 1.只配置class属性 
 上述这种配置 有默认id值:com.baizhi.basic.Person#0应用场景:如果这个bean只需要使用一次,那么就可以省略id 如果这个bean使用多次,则需要设置id值2.name属性 作用:用于在Spring的配置文件中,为bean对象定义别名 相同: context.getBean("name|id");
 区别:1.别名可以定义多个,但是id属性只能有一个值 2.XML的id属性的值,命名要求:必须以字母开头,字母 数字 下划线 连字符 不能以特殊字符开头 name属性的值,命名没有要求 命名灵活 XML发展到了今天:id属性的限制不存在了 3.代码 java//用于判断是否存在指定id值的bean,不能判断name值 System.out.println(context.containsBeanDefinition("p")); //用于判断是否存在指定id值以及name值的bean System.out.println(context.containsBean("p"));
6.Spring工厂的底层实现原理(简易版)
"Spring工厂是可以调用对象私有的构造方法创建对象" 这就是比 new 创建对象 强大的地方

Spring的运行原理/机制
7.思考
问题:未来在开发过程中,是不是所有的对象,都会交给Spring工厂来创建呢?
回答:理论上 是的,但是有特例:实体对象(entity)是不会交给Spring创建的,它是由持久层框架进行创建,因为它需要数据,数据来源于数据库,而Spring没有数据。
第三章、5.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 bash# 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
 
-