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对象
创建对象