您好,欢迎来到纷纭教育。
搜索
您的当前位置:首页Spring框架全解析持续补充

Spring框架全解析持续补充

来源:纷纭教育

1.Spring框架基本内容

1.1介绍Spring

Spring 的全称: Spring Framework

Spring是一个优秀的开源的轻量级的企业应用开发框架,是为了解决企业应用程序开发复杂性而创建的。它大大简化了java企业级开发的复杂性,提供了强大,稳定的功能,能够创建出松耦合,易测试,易扩展,易维护的java应用系统,又没有带来额外的负担。它坚持一个原则:不重新发明轮子。已经有较好解决方案的领域,Spring绝不做重复性的实现。例如对象持久化和ORM,Spring只是对现有的JDBC,mybatis,等技术提供支持,使之更易用,而不是重新做一个实现。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件。

Spring 的核心代码均来自于真实的项目,Rod Johnson是这个产品的创造者,是从商业项目开发实践中逐步提炼出的一种架构基调。

从2003年正式启动,整个项目的开发始终贯彻着如下的核心架构理念:

A.降低开发成本,方便使用,促进良好的编程习惯

B.整合各类框架,遵守轮子理论(不重复的造轮子 ,使用现有的轮子)

C.易于选择,方便测试

D.统一配置,灵活可扩展

E.非侵入式

F.提供最好的IOC解决方案

G.提供最好的AOP解决方案

1.2介绍Spring的架构图

Spring框架由大约20个功能模块组成。组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

1.3Spring框架学习

容器:一切Spring bean都存储在Spring容器内,并由其通过IoC技术管理

生态:Spring是一个一个非常庞大且完整的生态,里面包含了很多的的框架,

基石:很多框架都是依托于Spring框架来进行实现的。

1) IOC:控制反转--帮助我们创建对象的

2) AOP:面向切面编程---提升代码的扩展性,有点像过滤器.针对方法.

3) TX:声明式事务管理---强大事务管理机制.事务过程不需要程序员编写,只需要声明出哪些方法需要进行事务管理.

4)DI:依赖注入,给对象中的全局属性进行赋值的操作

2.IOC详解

2.1控制反转

控制:对类实例化的控制.指的是创建对象这个事情.

反转:以前由程序员实例化的过程,转交给Spring进行实例化.

2.2定义流程图

一堆map的原因:循环依赖

例如:BeanFactoryPostProcessor(BeanFactory)

1.BeanDefinition:

bean的定义信息,放到一个叫BeanDefinition对象的map结构存储 他实际上是一个接口,里面有很多的set,get方法。如 Bean 的类名、作用域、构造函数、属性值等。这些对象之后被 Spring 的容器管理。BeanDefinition 存储了关于 Bean 的所有信息。

2.BeanDefinitionReade:

是 Spring 框架中的一个接口,主要用于从外部资源(如 XML 文件、注解配置类、Java 配置类等)读取和加载 Bean 定义,并将这些定义注册到 Spring 的应用上下文中。

在 Spring 中,Bean 的定义通常包含了 Bean 的类类型、属性、依赖关系、作用域等信息。BeanDefinitionReader 的实现类负责读取这些定义,并将它们转换成 BeanDefinition 对象

3.BeanFactory和BeanFactoryPostProcessor

是Spring框架中最基本的容器接口,负责管理和提供应用上下文中的Bean。它提供了用于访问Bean的基本方法,最常见的是通过getBean()方法获取Bean实例。

特点是在每次获取对象时才会创建对象。结构比较单一,有一个子接口ApplicationContext

相对来说功能比较全面

可以通过BeanFactory的拓展接口BeanFactoryPostProcessor来解析BeanDefinition的定义信息

里面有个类,是一个抽象类用来进行属性资源配置,用来处理 bean definition中的 property中的 values值的占位符操作替换

操作:里面有很多的方法

简单实现,解析这句话打印出来。

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("高波,泰裤辣");
    }
}

【注意】这里不要忘记定义bean对象

4.ApplicationContext

是BeanFactory的子接口,提供了更多的功能和特性。它是Spring框架中最常用的容器类型,几乎所有的Spring应用都依赖于ApplicationContext。

每次容器启动时就会创建所有的对象。

2.3定义bean方式

  • XML 配置方式:通过XML文件定义Bean,适用于老版本的Spring项目或需要集成其他工具的场景。
  • 注解方式:通过@Component等注解自动扫描和注册Bean,适用于现代的Spring应用,简化配置。
  • Java Config 配置方式:通过@Configuration@Bean在Java类中配置Bean,适合追求类型安全和灵活性的开发方式。

其实上面的三种我们通常定义Bean的方式,最终也都会被解析成BeanDefinition对象。再由BeanFactory根据BeanDefinition生成对应的Bean。

2.4配置文件中定义bean进行依赖注入代码

属性注入方式
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driverClassName}"> </property>
</bean>
构造器注入方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
       <!--设置使用dept的无参构造器创建对象-->
       <bean id="dept" class="com.jr.entry.Dept"/>
       <!--设置使用dept的有参构造器创建对象-->
       <bean id="dept1" class="com.jr.entry.Dept">
              <constructor-arg name="deptno" value="0"/>
              <constructor-arg index="1" value="客服"/>
              <constructor-arg name="loc" value="南京"/>
       </bean>

      <!-- 配置DeptMapper对象-->
       <bean id="deptMapper1" class="com.jr.mapper.DeptMapper"/>

      <!-- 配置DeptService对象-->
       <bean id="deptService" class="com.jr.service.DeptService" autowire="byName">
              <!--属性方式  实现 依赖 注入-->
       <!--  <property name="deptMapper" ref="deptMapper"/>-->
              <!--构造器方式 实现 依赖 注入-->
             <!-- <constructor-arg name="deptMapper" ref="deptMapper"/>-->

       </bean>

       <!--aop例子配置User对象Bean标签-->
       <bean id="user" class="com.aop.serivce.User"/>
       <!--aop例子第二阶段,配置代理类对象-->
       <bean id="userProxy" class="com.aop.serivce.UserProxy">
              <constructor-arg name="user" ref="user"/>
       </bean>
      <!-- aop例子第三阶段,配置jdk动态代理对象-->
       <bean id="jdkProxy" class="com.aop.serivce.JDKProxy"/>


</beans>

2.6. 介绍Bean标签

 <bean>的一个属性,控制如何实例化对象

 lazy-init 属性

true:懒加载

false:立即加载

<beans>里default-lazy-init:当前配置文件里的所有bean对象都设置为懒加载。

init-method 属性

用于设置对象 初始化阶段 调用的方法。

destory-method 属性

用于设置对象 销毁阶段 调用的方法

Scope属性可取值 singleton: 默认值,单例模式.使用ApplicationContext启动时实例化对象

2.7BeanFactory 和 ApplicationContext 两个接口的区别

BeanFactory:是父接口
BeanFactory   :延迟加载,第一次使用getBean()方法的时候获得bean对象;
  ---好处:按需加载。

 ApplicationContext:子接口
 ApplicationContext  :加载配置文件的时候,把文件里的所有bean 标签所对应的对象都加载出来。
 ---好处:把问题,由运行期转换到编译器。
 ---如果某些项目,很在意内存的使用,还是要考虑使用BeanFactory

区别:

立即加载
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu=applicationContext.getBean("stu",Student.class);
//BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml");
延迟加载
//BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
Student stu=factory.getBean("stu",Student.class);

3..bean的生命周期

3.1实例化阶段

在堆中申请空间,对象属性一般是默认值,反射创建对象的过程。下面的源码对应着反射的代码

1、获取Class对象

Class cllazz = Class.forName("包名+类名")

Class clazz=对象.getClass();

Class clazz =类名,class;
2、获取构造器
Constructor ctor= clazz.getDeclaredConstructor()

3、创建对象

Object obj = ctor.newinstance();

源码中的方法createBeanInstance

获取class对象

创建对象

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务