Spring框架总结

Posted You295

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架总结相关的知识,希望对你有一定的参考价值。

一:spring框架简介以及核心

Spring框架是一个开放源代码的JavaEE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。
Spring解决了开发者在JavaEE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。
Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JavaEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。

总结:1. javaee(SE)的开源框架
2. 设计上: 软件解耦,解除(降低)对象对象的依赖
3. 软件设计:超级工厂(创建对象,注入对象,管理对象等)
4. 应用:与各大框架的整合技术(hibernate,struts2–>ssh, mybatis–>SSM)

核心:
1.loc:即控制反转。举例:在之前的操作中,假设在一个类中,我们想要调用类中的方法(不是静态方法),就要创建该类的对象,使用对象调用方法来实现。但是对于spring中,spring创建对象的过程,没有在代码中实现,而是交给spring来进行配置进行的。
2.AOP:面向切面编程。

二:开发流程

1.引入依赖
根据此图进行引入:

引入代码:

<dependencies>
      //必须引入
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.9</version>
		</dependency>
      //测试
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

       
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.20</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.32</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.32</version>
		</dependency>
	</dependencies>

2.创建实体类


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
	
	private Integer id;
	private String title;
	private String author;
	private Double price;

3.定义spring中管理的内容,配置文件applicationContext.xml
:id/name:唯一名称 ; class: 类全名;property: 对象的属性(set 方法)

<?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">


	<bean id="myBook" class="com.dyit.spring.entity.Book">
		<property name="id" value="001" />
		<property name="title" value="西游记" />
		<property name="author" value="吴承恩" />
		<property name="price" value="33.33" />
	</bean>
</beans>

Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载、实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用。
4.创建spring容器

//配置路径
final String CONFIG_LOCATION = "classpath:spring/applicationContext.xml";
//创建spring工厂(容器)
		ApplicationContext factory=
				new FileSystemXmlApplicationContext(CONFIG_LOCATION);

5.读取Bean(组件、对象)

Book book = factory.getBean("myBook", Book.class);

6.运行

三:spring bean的生命周期


1.Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化。
2.Bean实例化后对将Bean的引入和值注入到Bean的属性中。
3.如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法。
4.如果Bean实现了BeanFactoryAware接口的话,Spring将调用。setBeanFactory()方法,将BeanFactory容器实例传入。
5.如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
6.如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
7.如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用。
8.如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
9.此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
10.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

四:注解-释意

1.加载注解:

<context:component-scan base-package="com.dyit.spring.entity"/>

2.@Component 当前类是容器中的组件
@Controller -->控制层
@Service —》service
@Repository—> mapper/dao

含义: 扫描 com.dyit.spring.entity文件夹下的所有类,如果有@Compoent,@Controller,@Service,@Repository注解的类将其创建对象放入容器中备用。

4.@Configuration
使用配置类替代appliationContext.xml

@Configuration
public class HelloConfiguration {
	
	@Bean(name = "b3")
	public Book3 book3() {
		return new Book3();
	}
}

//测试
	ApplicationContext factory =new AnnotationConfigApplicationContext("com.dyit.spring.config");
		Book3 b3 =factory.getBean("b3", Book3.class);
		System.out.println(b3);

5.属性:

prototype: 原生态, 不由spring IoC容器管理
request: 一个请求
session: 会话周期
singleton:单例,存在于容器

问题
如何判断对象是有状态的?
有状态:对象中持有(可存储)数据,由多个线程可以共享,对象(持有其它属性,属性的可以改变的),线程的不安全
无状态的对象: Dao Mapper

五:常见问题

1.spring中用到了那些设计模式?

1)单例模式:spring中的bean在默认情况下都是单例的。
2)工厂模式:主要通过对BeanFactory和ApplicationContext来生产bean对象。
3)代理模式:最常见的AOP的实现方式就是通过代理来实现的,spring主要是使用JDK动态代理和CGLIB代理。
4)模板方法模式:只要在一些对数据库的操作类中用到,比如:JdbcTemplate,JpaTemplate,因为数据库的建立连接,执行查询,关闭连接几个过程中,非常适合用模板方法。

2.对loc和Aop的理解?以及他们的实现原理?

1)loc叫做控制反转,就是通过spring来管理对象的创建,配置,生命周期。相当于将对对象的控制权交给了spring,就不需要人工来管理对象之间的复杂关系,好处就是解耦。spring中主要提供了两种loc容器,分别是:BeanFactory和ApplicationContext,通过他们来实现对Bean的管理。

2)AOP叫做面向切面编程,是一个编程范式,目的是提高代码的模块性。Spring AOP基于动态代理的方式实现,如果是实现了接口的话就会使用jdk动态代理,反之则会使用CGLIB代理,aop中的应用主要体现在 事务.日志 .异常处理等的方面。通过在代码的前后做一些增强处理,可以实现对业务逻辑的隔离,提高代码的模块化能力,同时也是解耦。spring主要提供了Aspect切面,JoinPoint连接点,PointCut切入点,Advice增强等的实现方式。

3.JDK动态代理和CGLIB代理有什么区别

1)JDK动态代理主要是针对实现某个接口,AOP则会使用jdk动态代理。他是基于反射的机制实现,生成一个实现同样接口的代理类,然后通过重写方法的方式,实现对代码的增强。

2)而如果某个类没有实现接口,AOP则会使用CGLIB代理。它的底层原理是基于asm第三方框架,通过修改字节码生成一个子类,然后重写父类的方法。实现对代码的增强。

4.BeanFactory和FactoryBean有什么区别?

1)BeanFactory是Bean的工厂,ApplicationContext的父类,是Loc的核心,负责生产和管理bean对象。

2)FactoryBean是Bean,可以通过实现FactoryBean接口定制实例化Bean的逻辑,通过代理一个Bean对象,对方法的前后做出一些操作。

5.SpringBoot的启动流程

1)准备环境,根据不同的环境创建不同的Environment
2)准备,加载上下文,为不同的环境选择不同的SpringContext,然后加载资源,配置Bean
3)初始化,刷新SpringContext,启动应用。
4)流程结束。

以上是关于Spring框架总结的主要内容,如果未能解决你的问题,请参考以下文章

万字Spring框架学习总结(附核心代码详细注释)

回归 | js实用代码片段的封装与总结(持续更新中...)

Spring框架总结

Spring框架总结

spring框架总结(03)重点介绍(Spring框架的第二种核心掌握)

Spring+SpringMVC+MyBatis+Maven框架整合