学习视频:【孙哥说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
-