# spring5 **Repository Path**: li_mingzhu/spring5 ## Basic Information - **Project Name**: spring5 - **Description**: spring5学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-12 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### spring5学习练习代码 #### factory子模块 该模块是个**简单工厂**的代码示例,因为spring中大量使用了工厂模式,需要先对工厂模式有个简单了解。 使用通用工厂创建对象步骤: 1. 定义类型 2. 在配置文件中增加配 3. 通过工厂方法来获取类的对象 接下来会学习spring的基础使用并逐步深入了解spring的设计理念和实现原理 此次更新时间:2020-05-13 ---- #### basic-use 该模块主要是学习spring工厂接口中一些核心方法的使用。 此次更新日期: 2020-05-15 --- ##### 1. spring的基本注入 - spring的注入可以分为JDK内置类型的注入,和自定义对象的注入 其中JDK内置对象的注入,对于8种基本类型的注入都使用标签来注入,对于其他集合类型 如:list,set,map,array这些数据类型的注入,spring则提供了专用的注入标签。 - 自定义类型的注入,则需要先声明出需要注入的对象,然后在需要注入的地方使用ref属性来对已声明 的bean对象做引用。 ##### 2. 构造注入和set注入 - 构造注入 构造注入需要提供有参的构造方法,注入时配置文件中使用标签进行注入,name属性指定属性名,value属性则为属性赋值 - set方法注入 相较于构造注入,set更加常用,需要为注入的属性提供对应的set方法。使用标签注入,name属性指定属性名,value为属性赋值 ##### 3. 创建复杂对象的方式 ​ 所谓的复杂对象是指无法直接通过new关键字创建的对象,例如 JDBC中的connection对象的获取 - 自定义类实现spring提供FactoryBean方式来创建对象,重写getObject()方法来实现创建对象的逻辑 - 实例工厂创建对象,通过已有类(通常是无源码,只有.class),先在配置文件中配置该类的bean,然后在 需要注入的地方,使用标签引入该工厂类,指定创建对象所调用 的方法来完成对象的注入 - 静态工厂创建对象,和实例工厂的作用基本一致,但是由于是静态方法,无需实例化再调用方法,所以配置文件中会和实例工厂的配置有点差别 此次更新日期:2020-05-17 ##### 4. 对象创建的生命周期 ​ 对象创建的三个阶段: - 创建 根据对象socpe的不同设置,创建的时机不同,scope为singleton的对象,在完成工厂创建时就会创建对象,而scope为prototype的对象,则是在获取对象(调用context.getBean方法)时创建。 如果需要让scope为singleton的对象在获取时再创建,那么可以设置lazy-init属性为true,实现懒加载 - 初始化 初始化有两种方式,一种是实现InitializingBean接口,spring框架会自动调用初重写的接口中的方法进行初始化。 另一种是在配置文件中,为bean指定init-method属性,值为自己指定的初始化方法。 - 销毁 销毁可以在配置文件中指定destroy-method,值为自定义的方法,或者是实现spring的接口DisposableBean来做销毁时的回收工作 ##### 5. 加载properties配置 - 对于像jdbc链接字符串这种不常变的字符串,可以将其放入properties文件中,然后在spring的配置文件中加载该配置文件。 - ~~~xml 1. db.properties jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/sys?useSSL=false&allowPublicKeyRetrieval=true" jdbc.username=root jdbc.password=123321 2. applicationContext.xml 3. 使用db.properties中的配置 ~~~ #### converter ##### 1. 自定义类型转换器 ​ 主要是spring自定义转换器的演示,对于一些特殊的类型,当spring内置转换器无法满足需求时,需要使用自定义类型转换器 ​ 自定义类型转换器的开发步骤: - 自定义转换类实现Converter接口,接口有泛型参数,第一个泛型参数为要转换的类型,第二个参数为目标类型。 - 实现接口提供的方法:convert,该方法的参数就是要转换的原始参数。写自己的转换逻辑操作参数即可。 - 在配置文件中配置自定义转换器完成开发 ##### 2. 对bean做加工 ​ 通过自定义类实现BeanPostProcessor接口可以实现对spring管理的bean进行加工,接口中提供了两个方法: - postProcessBeforeInitialization 在对象初始化之前进行一些加工操作。 - postProcessAfterInitialization 在对象初始化后进行一些加工操作。 重写上述两个方法,并在spring配置文件中配置该bean,即可实现对bean进行加工。 如果不区分bean初始化前后,通常考虑去实现postProcessAfterInitialization方法,至于postProcessBeforeInitialization直接返回bean即可。 > 自定义的加工类,在配置文件中配置后,会对所有spring容器所管理的bean生效,所以需要在加工代码中做一个类型的判断,例如用instanceof方法去判断一下是否是需要加工的类型,如果是指定的对象,再执行转换的逻辑。 #### aop-proxy ##### 静态代理 ###### 静态代理中涉及的名词 - 目标对象(被代理对象) - 代理对象,为目标对象实现功能增强的对象 ###### 静态代理的开发步骤 - 写代理类,代理类和目标类实现同样的接口 - 代理类中持有目标类的对象 - 在代理类中调用目标对象的方法,同时可以根据需求在代理类执行目标类方法之前和之后增强一些附加功能 - 客户端使用时,声明接口对象,new代理类的实例,因为代理类和目标类实现了同样的接口,可以像调用目标类一样使用代理类。 ###### 静态代理的缺点 ​ 静态代理要求有目标类的源文件,需要代理哪个目标类就需要自己写一个代理类并和目标类实现相同的接口,如果需要代理的对象比较多,那么静态代理会产生目标类*2数量的代理文件,不易于后期的维护。 ##### spring-aop ###### aop中涉及的概念 - 切点,表示要在哪些地方应用代理增强,它可以表示一个位置,例如一个UserService中有两个方法,注册和登录,需要给登录加日志,那么切点就对应UserService类中的login方法。 -