版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/panhaigang123/article/details/79587566
什么是Spring框架?Spring框架有哪些主要模块?
Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器开源框架,他主要是为了解决企业应用开发的复杂性而诞生的
spring core(核心容器)是spring的核心类库 spring的所有功能都依赖于该类库 core主要实现了IOC
AOP:是spring的aop库,提供了aop的拦截器机制
ORM:对常用的ORM框架的管理和辅助支持
DAO:提供对jdbc进行封装 允许jdbc使用spring资源 并能统一管理jdbc
WEB:对常见的框架支持 spring能管理这些框架并将资源注入给框架
Context:提供框架式的Bean访问方式 程序通过context访问spring的bean资源
MVC:spring提供了一套轻量级的MVC实现
什么是控制反转(IOC)?什么是依赖注入?
IOC:spring是bean的容器 负责的bean的创建和销毁 传统的编程模式由开发者通过编码来创建bean 管理bean IOC通过容器的技术来控制bean的生命周期
依赖注入:通过预先定义好的方式接受来之容器的资源注入
可以通过构造器注入(传参)
Setter方法注入 使用@AutoWired(先根据名字,在根据类型自动装配)
@Resource(和@Autowired装配顺序一样但是他可以指定名字装配==@Resource(value="b"))
什么是AOP,AOP的作用
面前切面编程 能够动态的将代码切入到类的指定方法、指定位置上 他有切点 连接点 通知等概念
切点:是一个模糊匹配表达式 用于匹配特定规则的方法 save* delete* update* 只是预先定义的
连接点:通过切点匹配到具体的方法就是连接点
通知:当连接点执行时 会发送通知 有前置通知 后置通知 异常通知 环绕通知
AOP一般作用于Spring声明式事务中 (
先说事务介绍在说事务配置在说传播属性
)
spring事务的介绍
对一系列的数据库的操作(增,删,改)进行统一的提交或回滚 防止数据库的数据出现混乱
事务分为编程式事务和声明式事务
编程式
比较灵活,代码量比较大,重复代码比较多 需要手动提交或回滚事务
声明式
声明式比编程式更灵活 一般可以用配置文件和注解声明 而我们一般使用配置文件并使用PlatformTransactionMananger进行管理事务他是事务管理的基础接口
像DataSourceTransactionManager就是实现了他
当Service层的方法互相调用时,会产生事务的传播问题
PROPAGATION_REQUIRED:父方法中没有事务就创建一个事务 否则使用父方法中的事务
REQUIRES_NEW:不管父方法中是否存在事务 都会创建一个事务
SUPPORTS:父方法中存在事务使用当前事务 否则使用jdbc事务(自动提交)
NOT_SUPPORTED:不管父方法中是否存在事务 都不会使用父方法中的事务(挂起事务)
MANDATOPY:必须在事务环境中运行 父方法中没有事务 抛出异常
NEVER:父方法中不能存在事务 否则抛出异常
如何配置事务
配置过程:引入aop和tx的schema文件,声明事务管理器,将DataSource注入到事务管理器。
定义通知(tx:advice),注入事务管理器,声明需要代理的方法,指定转播特性、是否只读等。
最后定义切点(aop:config、aop:pointcut),将切点和通知关联到一起。
DataSource连接池:DBCP c3p0 druid===》提供了sql监控功能
BeanFactory和ApplicationContext
BeanFactory:是spring里面最底层的接口 提供了简单的容器功能 如==》bean的实例化 bean的生命周期的控制 装配bean的功能等
ApplicationContext:继承了BeanFactory 提供了更多的功能 如:支持国际化的文本消息 统一的资源文件读取方式
三种实现方式
从classPath下的xml配置文件读取上下文
从文件系统中xml配置文件读取上下文
从web应用的xml配置文件读取上下文
Spring的配置方式
基于xml的配置
<beans>
<bean id="myService" class="com.howtodoinjava.services.MyServiceImpl"/>
</beans>
基于注解的配置
在类上使用@Component @Controller @Repository @Service
然后引入该类实例 使用@AutoWired或@Resource
基于Java的配置
@Configuration
public class AppConfig
{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
spring bean的生命周期
在一个bean实例被初始化时,需要执行一系列的初始化操作达到可用状态
当一个bean不再被调用时 从bean容器中移除
初始化之后调用init-method 销毁之前调用destroy-method
<beans>
<bean id="demoBean" class="com.howtodoinjava.task.DemoBean" scope=”prototype”
init-method="customInit" destroy-method="customDestroy"></bean>
</beans>
Spring bean的作用域之间有什么区别
singleton:单例(默认) 不管有多少请求 容器中只有一个bean的实例来处理
prototype:多例 为每一个请求创建一个bean的实例
request:同一次请求中创建一个bean的实例
session:在同一次会话中创建一个bean的实例
Spring 框架中的单例bean是线程安全的吗?
Spring框架并没有对单例bean进行任何多线程的封装处理 关于线程安全问题需要开发者自己去解决
解决办法:可以将默认的单实例改为多实例(内存压力变大) 使用锁机制 使用局部变量
举例说明如何在Spring中注入一个Java Collection
使用<list>标签 值可重复 中使用<value>
使用<set>标签 值不可重复 中使用<value>
使用<map>标签 键值对可以是任何类型的集合 中使用<entry>
使用<props>标签 键值对都是字符串类型 中使用<prop>
解释Spring bean的自动装配
spring可以通过BeanFactory中注入的方式自动搞定bean之间的依赖关系 自动装配可以设置在每个bean上或特定的bean上
解释自动装配模式的区别(autowire属性)
no:默认的设置 自动装配是关闭的 需要使用ref手动引用需要的bean
byName:根据名字自动装配
byType:根据类型自动装配
constructor:与byType类似 通过构造器自动装配
spring框架中用到了那些设计模式
代理模式==在aop使用的比较多
单例模式==在spring配置文件中定义的bean默认为单例模式
模板模式==用来解决代码重复的问题 jdbcTemplate RestTemplate(微服务中使用)
前端控制器==Spring提供了DispatcherServlet来对请求进行分发 收集所有的请求 然后由一个单一的处理程序处理
工厂模式==BeanFactory用来创建对象的实例
策略模式==对算法的包装 把算法的责任和本身分开