Spring
Spring业务层框架springmvc表现层框架mybatis/hibrnate持久层框架
什么是Spring
Spring 是一个用于轻量级IOC 和AOP 容器的开源框架,鼓励您以最少侵入性(可以理解为耦合)的方式管理应用程序中的代码。
IOC
概念
控制反转控制:对象的创建和管理反转:对象的控制从程序员转移到框架
核心目的
让Spring管理对象
优点
单例减少了耦合(类之间的依赖性)。
IoC核心容器
顶层接口BeanFactory和ApplicationContext的区别
构建核心容器时,会立即创建对象。换句话说,该对象适合BeanFactory。在构建核心容器时,对象使用延迟加载方法。即,通过ID 指定何时检索和创建对象。
ApplicationContext常用实现类
ClassPathXmlApplicationContext
读取类路径下的配置文件。
FileSystemXmlApplicationContext
读取计算机上任何位置的配置文件
当使用新的注释+配置类而不是XML配置文件时使用
AnnotationConfigApplicationContext
。
IOC创建对象方式
无参构造器
在Spring 配置文件中使用bean 标签进行配置
bean标签的属性
id
创建的对象名称
class
您需要管理的类的完整路径
静态工厂
条件:需要工厂类并且工厂类必须具有静态方法
配置文件语法
当在spring容器上调用getBean方法时,会创建一个工厂类对象,并执行工厂类的方法返回需要的对象,并将其放置到spring容器中。
实例工厂
条件:需要一个工厂类,并且该工厂类必须具有常规方法。
配置文件语法
您必须首先创建工厂对象,然后调用工厂中的常规方法。
DI(依赖注入)的方式
setter注入
条件:属性必须具有setter 方法
bean标签下标签
name:属性名称value:属性值,对于基本类型和String类型ref:对于对象类型,指向bean标签的id属性值
复杂注入(map、list、[]…)
list类型语法
@RequestMapping('/listEmp')public String ListEmp(ModelMap modelMap) { 列表list=empMapper.listEmpDept() return 'emplist' }
数组类型与list类型类似只是没有ref标签
map类型
properties类型
有参构造器注入
条件:需要施工人员
bean标签下标签
name attribute:属性名称value:值(对于基本类型)和Stirng ref:对于对象类型
p名称空间注入
问题产生条件:配置文件中必须导入p命名空间(Spring提供)。由于底层还在设置,所以属性还需要一个setter方法。
IOC三种开发方式
手动配置方式
bean标签:在配置文件中用bean标签配置一个类
id属性:用于命名对象Class属性:用于写入实体类的全路径名,用于反射
scope属性
singleton
proyotype
request
session
globle-session
010-1 010
对象销毁时机
name 属性:类值的属性名称:定义常规成员变量的值。 ref:如果一个类引用了另一个类的对象,则必须使用该属性。 ***注意:要在配置文件中设置属性的初始值,必须为该属性提供setter方法。
singleton
专门用于给列表集合类型的成员变量赋值。
proyotype
11
若需要给一个类中的成员变量赋初始值则需要在bean标签中定义property子标签
半自动配置方法主要使用注解来实现类之间的依赖关系。
property子标签
@Autowiredprivate EmpDAO empDAO; ***注意:为了效率,Spring框架在扫描类时默认不扫描注解,所以默认情况下只有Autowired注解必须在配置文件中配置。
格式
基本上就是用@Component注解类,并在配置文件中设置需要扫描的包。全自动配置模式还设置私有成员变量。无需提供setter 方法。反射自动打开权限并强制访问*** 注意:如果通过一个类型匹配多个实现类,则会出现错误。解决方案是在引用类型上添加@Qualifier('')注解来指示需要的类。
半自动配置方式
组件:类无法拆分时存储库:常用于标记DAO层或数据库操作层服务:业务层控制器:控制层/表示层(springmvc替代servlet) **上面有四个注解,分别对应不同的场景:已定义类的单个实例和多个实例。
类的对象还是需要手动配置,但类的依赖关系用注解@Autowired自动实现,例如A类中引用了B类,在配置文件中用bean标签配置A,在A中用注解标记引用的B
请注明处置方法
全自动配置方式
请指定初始化方法
四个创建对象的注解
PreDestory
用于基本数据类型和字符串类型
PostConstruct
该注释由Spring 框架提供。如果没有找到,使用Qualifier注解会报错。指示应用哪个注释。
三个依赖注入的注解
该注解由JDK提供,首先按名称搜索。如果未指定名称,则设置名称@Resource(name='name')。如果没有找到,则在最后按类型搜索。
Value
创建一个类并为其添加新的注释,以使该类具有与application.xml 相同的功能
Autowired
需要注解表名的类是配置类,但其本质功能并不是将其标记为配置类,添加此注解会导致该类中的所有方法都被代理。该方法将与原始方法完全相同,从而保证对象的生命周期和作用域。在这个类上使用bean注解很容易,不需要添加这个注解。使用AnnotationApplicationContext 从容器中检索对象也很容易。但是,如果该类中创建对象的一个方法调用了另一个方法,则该对象会被多次创建,因为创建该对象时使用了另一个方法,并且不能保证该对象是单例的。也就是说,范围不受保证。
Resource
这个注解告诉Spring在创建容器时应该扫描哪些包属性值。这与XML 配置文件中标记上的BasePackage 属性具有相同的效果。
spring新注解
用于注释配置类中的方法,并将方法的返回值对象存储在Spring容器中。 name 属性用于定义bean 的ID。如果未指定,则键默认为方法名称。存储在容器集合中,值是对象详细信息。当您使用注释配置方法时,如果该方法有参数,Spring会自动联系容器以查看是否有可用的bean。搜索方法是一样的。目前,ClassPathXmlApplicationContext不再用作@Autowired注解方法,而是将AnnotationConfigApplication传递给配置类的类对象。
@Configuration
@ComponentScan
通过IO 读取配置文件并使用反射创建对象:class.forName(配置文件中的完整路径名) 对于全自动模式,通过IO 读取配置文件并读取包。然后使用IO扫描这个包下的所有类(包括子包)。如果扫描的类标有Component 注释,则会创建该类的对象。否则,重点是反射+IO。
@Bean
扫描所有成员变量。如果成员变量有自动注入注解,它会从自己的容器中搜索要注入的对象,如果找到相应的对象,则直接暴力破解该值。如果发现则报告错误
原理
如何创建对象
项目主入口
如何管理依赖关系
Junit 集成main 方法。在运行时,invoke 执行方法来确定测试类是否具有用@Test 标记的方法。
spring整合junit
运行测试方法时,junit 不知道是否使用了框架,因此在执行过程中不会通过配置文件或配置类创建Spring 容器。因此,使用junit进行测试时,会出现以下问题:如果您没有Spring 容器,则使用Autowired 方法没有任何效果。
在spring下junit的问题
junit --- 导入集成spring-test.jar的spring jar包。使用junit提供的注解来告诉Spring容器是否应该运行,方法是将原来的main方法替换为spring自己的main@RunWith(SpringJUnit4ClassRunner.class)。spring和ioc都是基于xml或者注解创建的,用来表示位置。 @ContextConfiguration---使用位置属性。除了xml 文件的位置之外,还指定classpath 关键字以指示该文件位于类路径上。 classes 属性:指定配置类的位置。如果使用spring5.x版本,junit版本必须是4.12或更高版本。
junit单元测试中没有main方法也能执行
junit不会管我们是否用框架
开发效率高
整合思路
每个请求都会更新整个页面。如果页面数据量较大、用户设备较旧、或者网速较慢,就会出现页面卡顿、交互效果降低的情况。
开发模式
当您有多个前端页面(例如移动、计算机和iPad 版本)时,编写多个控制层很困难。
jsp开发模式
后台始终响应数据(json 格式),但不响应页面。前端使用前端语言和后台网络接口来接收数据并显示。
执行效率与交互效果低
不灵活,解决多端变化问题较难
只需要编写后端即可,不同的前端与后端的交互方式不同。
前后端分离
开发效率低在开发前后端分离的开发模式之前,首先要设计文档,指定后端和前端所需的接口和参数的标准格式。这样可以更轻松地同时开发前端和前端,并减少前端调用后端接口时出现问题的机会。
优点
灵活,易于解决多端变化问题
缺点
相同协议、相同IP、相同端口号
跨域问题跨域带数据
创建一个虚假网站,将银行网站http://mybank.com 嵌入iframe 中。 调整iframe 的宽度和高度以适合整个页面,以便除域名之外的所有内容都与您银行的网站相匹配。 当用户输入帐户密码时,我们的主网站可以跨域访问http://mybank.com dom 节点,并可以检索用户的帐户密码。
同源策略
当来源不同时,一台服务器向另一台服务器发送ajax请求,浏览器默认禁止这种请求,从而导致跨域错误。
同源
DOM 同源策略:禁止对不同源页面 DOM 进行操作。这里主要场景是 iframe 跨域的情况,不同域名的 iframe 是限制互相访问的。
XMLHttpRequest 同源策略:禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。
解决方案
1. 设置后台允许接受跨域请求
在后端设置响应头
或者通过注解设置
XHR 本机对象withCredentials 用于跨域请求。 false 如果请求跨域,这个数据可移植的跨域模式必须设置为Open**才能承载数据。
通过拦截器设置
在拦截器类上设置响应标头。 response.setHeader('Access-Control-Allow-Credentials', 'true');
2. 设置前端允许跨域请求携带数据
在前端页面设置xhr对象的属性
3. 后台允许跨域请求携带数据
DataSourceTransactionManager实现类主要用于dbutils和jdbcTemplate封装jdbc。这个实现类是一个方面类。
spring事务管理
事务隔离级别事务超时事务是否只读事务传播行为
API方式/硬编码
检查当前事务是否完成。 检查是否是新交易。检查是否已回滚。
PlatformTransactionManager 平台事务管理器 是一个接口 定义了开启事务、提交事务、回滚的方法
这个配置文件中的方法实际上是API的封装。
TransactionDefinition:定义事务参数的接口
交易包spring-tx.jar
TransactionStatus:事务运行状态接口
AOP联盟Aspectsj.jar spring-aspects.jar
声明式/配置文件式
jar包
事务依赖包
详细信息:必须为事务设置一些事务参数:只读、超时、是否在标签上设置传播行为(标签),设置此标签必须用于。交易参数是否应留空并仅保留默认值。
步骤
确定切面类即配置事务管理器
aop:advisor 使用标签设置切面类,标签设置切入点,使用事务作为切入点
用标签配置DataSourceTransactionManager类,该类需要一个数据源用ref属性配置
配置声明事务即切面
配置织入
核心控制器路径。如果这里的URL模式是/,则表示将包含除jsp文件之外的所有请求。 /* 包含jsp核心控制器创建时序。核心控制器所需的配置文件
ssm整合
当服务器启动时,侦听器通过配置文件初始化Spring 容器并实现IOC。配置监听器实现IOC时,必须配置以下全局配置参数:
在web.xml中配置
该参数指向Spring配置文件(该配置文件用于集成Spring和mybatis)。侦听器加载配置文件并在配置文件中创建数据源、对象和映射器扫描器。
配置核心控制器
mybatis.xml(可选),settings和typeAliases通常配置在此文件下,但也可以在配置sqlFactoryFactoryBean时配置别名。
配置监听器
数据源(德鲁伊)
配置全局参数
数据来源
持久层(dao)
applicationContext-dao.xml
配置sqlSession 工厂时,使用属性标记将name 值设置为mapper,将Locations 值设置为classpath:com/wxs/mapper。这样你就可以扫描任何路径。解决项目下的文件和接口不在约定路径的问题。
sqlSessionFactory
底层mapper接口仍然必须来自sqlSession,所以用这个bean标签配置sqlSessionFactoryBean。配置需要扫描的包。
别名
配置mapper扫描器
事务包扫描器(主要针对@Service注解)
mapper扫描器
业务层
applicationContext-service.xml
处理器适配器和处理器映射器的最新驱动程序配置主要用于@Controller 注释的包扫描器
web层(有mvc支持)
Setter 模式下的前缀和后缀插入异常处理程序、文件解析器和拦截器
springmvc.xml
Spring容器(配置文件)和springmvc容器(配置文件)存在父子容器关系,这两个容器内只能显示一个标签加载文件,子容器无法显示加载的配置文件您可以访问它。父容器和父容器Container无法访问子容器加载的文件
注解驱动版本
AOP,通常称为面向方面,是面向对象的补充,它抽象和封装与业务无关但影响多个对象的公共行为和逻辑,以便可以重用。名为“方面”,
减少了系统中的重复代码,降低了模块之间的耦合度,同时提高了系统的可维护性。使用动态代理提取常见内容并根据需要插入。除了代码之外,还可以扩展源代码。最底层是动态代理。扩展目标类的功能。
视图解析器
***父子容器关系
缺点:要扩展的方法的类必须继承。
AOP
缺点:除了扩展方法外,还必须实现该接口下的其他方法。
对目标类方法进行加强的方式
继承
需要接口,但可以指定扩展方法,不需要实现所有方法。
装饰者模式
参数列表:与目标对象相同的类加载器、目标类的所有接口、扩展类(可以自定义扩展类实现InvlcationHandler接口并重写其内部方法,也可以直接调用匿名内部方法这里的InvocabularyHandler 可以是一个匿名内部类,它实现了定义了扩展逻辑的内部调用方法。 (通过))我们已经知道该方法所需的所有代理方法参数)。
动态代理模式
proxyperson.run(); //该方法执行时,run的内容作为该方法的扩展返回值返回,返回的内容为最终值。通过判断if-else中的方法名,而不是需要扩展的方法的返回值来扩展指定的方法。
JDK
不需要接口,可以指定扩展方法,但代码量比较大
Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例
这种代理模式使用拦截器和过滤器来继承和扩展目标类的方法。
细节
CGLIB
CGLIB原理
要确定目标类(要剪切的类,即需要扩展的类),需要定义一个入口点。这里的入口点是所需的方法。对于Knife,您必须定义扩展方法编织配置,并在执行前、执行后、异常和最终执行入口点指定扩展方法。配置文件
AOP的三种方式
自由式
使用标签进行配置在入口点之前介入是指在需要扩展的方法(执行前记录)之前介入其他业务逻辑(例如打印等操作)。原始方法。
步骤
在原始方法执行后通过标签设置干预扩展方法。
织入时机
public void log(ProceedingJoinPoint joinPoint) { System.out.println('打印日志'); try { joinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace() } ('打印日志')要使用; } 标记进行设置,您必须将参数传递给扩展方法(ProceedingJoinPoint 类型的对象)。该对象包含必须由目标类扩展的方法。扩展method()方法相当于调用原来的方法。要实现环绕干预,您必须在此方法之前和之后编写自己的业务逻辑。
前置增强
当原始方法发生异常时,使用标签设置进行干预。这通常用于处理数据库事务。
标签中配置的
后置增强
将在需要扩展的方法成功返回后执行。
环绕增强
异常增强
定义一个切面类并让它实现特定的接口(5种编织机会) 确定目标类(要介入的类)并确定其切入点切面类(扮演对象的类)(确定)干预角色)配置文件
最终增强
定义的方面类必须实现MethodBeforeAdvice 接口并实现before 方法。该方法的底层调用必须在目标类中扩展的方法。只需编写自己的业务逻辑即可。方面类的方法之前。
接口规范式
中定义的方面类必须实现AfterReturnAdvice 接口并实现afterReturn 方法。
步骤
前置增强
后置增强
参数
Object returnValue
Method method
方面类必须实现MethodInterceptor 接口并实现invoke(MethodInitation incall) 方法。阻止方法。调用的progress()方法调用目标方法,并在语句前后实现自己的业务逻辑,从而达到环绕增强效果。
Object[] args
Aspect 类实现ThrowsAdvice 接口。该接口需要在方面类中自定义一个名为afterThrowing(Exception e) 的方法。
Object target
spr 是什么?
ingmvcspringmvc实际上是springframwork的一个模块,这个模块主要是对web的支持 springmvc是基于IoC和aop的