spring基础知识
1 spring是怎么创建类的对象的?
显而易见:先通过配置文件等方式获得类的全类名,然后通过反射 Class.forName获得类的class对象,在获得类的构造函数生成类的对象,并存入spring容器里。
2 spring容器实际上就是一个Map<String,BeanDefinition>,
key默认是类名首字母小写,BeanDefinition则是类的定义信息
spring存储bean的map在DefaultListableBeanFactory类中
3对于日志配置文件,无外乎先配置日志格式,输出类型(控制台,文件,按大小,日期分多个文件),两者一起。再配置日志级别。
4 ioc介绍,
ioc本身是一个理念,类似于算法的一个东西,需要别人去实现他,而spring就是实现了ioc 。
ioc就是控制反转,即把对象的创建权和对象之间依赖的管理权交给第三方容器去处理,而不是程序员自己写代码去new对象。这个第三方容器时常被称为ioc容器。
di依赖注入就是实现控制反转的一种方式,具体即通过配置给对象的属性赋值。通常是配置setter方法属性(字符串,数据,map)或者构造函数来实现di,具体见文章
5 BeanFactory接口是ioc容器的基本实现,即父类。ApplicationContext接口是BeanFactory的子类,
提供了更多高级特性,我们一般使用ApplicationContext的具体实现类
6 要从spring的ioc容器中获取一个bean,
可以通过id匹配,就是key匹配。或者类或接口匹配,类或接口匹配时要求ioc容器中只有一个该类或接口的对象,否则会报错。或者类或接口和id双重匹配。通过id匹配不用担心重复id的对象,可以ioc容器是一个map,id就是map的key,map的key是不会重复的。
而类或接口判断具体是通过instanceof操作实现『对象 instanceof 指定的类型』
7 平时看xml文件,有时会看到CDATA的字样,其实其效果就跟转义字符串差不多,具体如下:
8解读下面的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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
</beans>
xmlns即表示要定义xml的命名空间,声明xml元素的时候带上xmlns命令空间,就可以防止一个xml文件里元素名重复导致的冲突。xmlns表示默认的命名空间,xmlns:后面(如xsi,context)是整个命令空间的缩写。在下面的标签里会用到,
xmlns:xsi表示缩写为xsi的命名空间,xmlns:context表示缩写为context的命名空间。元素context:property-placeholder就是在context命名空间下的元素。
xsi:schemaLocation描述上面的命名空间url的具体文档的url在哪里?里面用换行符分割,第一项表示命名空间url,第二项表示命名空间文档的url,所以它的项的数量必须是偶数,否则报错。
9 spring配置bean是如果配置scope属性
为singleton(默认值),则对象在容器初始化时创建
为prototype,则对象在调用getBean()时创建
10 spring bean的生命周期
具体的生命周期过程**
- bean对象创建(调用无参构造器)
- 给bean对象设置属性
- bean的后置处理器(初始化之前)
- bean对象初始化(需在配置bean时指定初始化方法)
- bean的后置处理器(初始化之后)
- bean对象就绪可以使用
- bean对象销毁(需在配置bean时指定销毁方法)
- IOC容器关闭
11 后置处理器和对象初始化方法的区别是,
总的来说,后置处理器是 Spring 提供的一个通用机制,用于在 bean 的生命周期的特定阶段执行自定义逻辑,而对象初始化方法是每个 bean 可以独立定义的一个初始化逻辑,用于在 bean 实例化后执行一些特定的初始化操作。
12 FactoryBean使用工厂模式,帮你把复杂的对象创建逻辑屏蔽起来。
从spring的ioc容器中取出FactoryBean接口实现类的对象时(getBean方法),实际上得到的是调用FactoryBean接口的getObject()方法得到的返回值。这在spring整合第三方框架,比如mybatis时,会经常用到。
13 配置bean的类属性的自动装配,即autowire="byType"或者autowire=“byName”,前者通过class属性匹配,没有则为null。后者通过id属性匹配
java编程注意点
1 “1.1.1.1”.split(“.”)不对,会报错,应该用"1.1.1.1".split(“\\.”)
基于注解管理Bean
1 需要配置开启注解并且指令扫描根目录:
<context:component-scan base-package="com.primer.spring6"></context:component-scan>
可配置扫描过程中,只扫描指定类或注解,或排除指令类或注解。
2 @Autowired默认是byType
1即通过class属性匹配,没有则根据注解的required属性,默认是true则报错,如果为false,则为null。
2@Autowired除了可以放在属性上,还能放在set方法,构造函数和参数上。
3如果有多个则会报错,或者搭配@Qualifier即搭配byName双重匹配。
3@Resource注入
1默认是byNname,未指定name时,使用属性名作为name,通过name找不到的话会自动启动通过类型byType装配,byType注入时,某种类型的Bean只能有一个。
2@Resource注解用在属性上、setter方法上。
4不使用spring配置文件 全注解开发
使用@Configuration和@ComponentScan注解。
@Configuration
//@ComponentScan({"com.atguigu.spring6.controller", "com.atguigu.spring6.service","com.atguigu.spring6.dao"})
@ComponentScan("com.atguigu.spring6")
public class Spring6Config {
}
等于
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启组件扫描功能-->
<context:component-scan base-package="com.primer.spring6"></context:component-scan>
</beans>