spring一文通关

1.spring思想

1.1OCP原则(最核心的) 开闭原则 Open Closed Principle
2.DIP原则 依赖倒置原则 Dependence Inversion Principle
IoC 控制反转 思想 Inversion of Control
引出Spring框架 Spring是一个实现了IoC思想的容器
3.DI 依赖注入 Dependency Injection 实现IoC的思想,使之符合OCP和DIP原则
依赖:A对象heB对象
方式:(1 set注入
(2 构造方法注入
4.GoF(23种设计模式) 之外还有Javaee的DAO和MVC等
工厂模式
简单工厂模式 抽象产品类,具体产品类,具体工厂类 工厂里的方法是静态的
优点:达到了初步职责分离,客户端不需要关系生产细节
缺点:1.要拓展时候,需要修改,违背了OCP原则
2.工厂类的责任特别重大,是上帝类
工厂方法模式 抽象产品类,具体产品类,抽象工厂类,具体工厂类 一个产品对应一个具体工厂
优点:符合OCP原则
缺点:每次增加一个产地,都需要增加具体类和实现工厂,类的个数成倍增加,增加了系统复杂度。也增加了具体类的依赖
抽象工厂模式 了解
5. GoF之代理模式
(1)代理模式中的角色:
代理类(代理主题)
目标类(真实主题)
代理类和目标类的公共接口(抽象主题)
(2)静态代理: OrderService接口是代理类和目标类的共同接口,OrderServiceImpl是目标类。OrderServiceProxy是代理类
一个接口对应一个代理类,显然也是不合理的,会导致类爆炸
(3)动态代理: 在程序运行阶段,在内存中动态生成代理类,被称为动态代理
JDK动态代理 采用实现接口 :
第一步:创建目标对象
OrderService target = new OrderServiceImpl();
第二步:创建代理对象(类加载器,接口类型,调用处理器)
OrderService orderServiceProxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), 调用处理器对象);
第三步:调用代理对象的代理方法
注:调用处理器 继承InvocationHandler接口,实现invoke(代理对象,目标方法,目标方法的实参)方法,
目标对象 可以通过调用处理器的构造方法传过来
返回值 一定要把目标对象的目标方法的返回值返回
封装一个工具方法,可以通过这个方法来返回代理类
CGLIB代理 采用继承(类和接口都适用,不适用final)
第一步:需要引入它的依赖
第二步:创建字节码增强器new Enhancer()
第三步: 告诉cglib要继承哪个类
enhancer.setSuperclass(UserService.class);
第四步: 设置回调接口
enhancer.setCallback(方法拦截器对象);
第五步:生成源码,编译class,加载到JVM,并创建代理对象
UserService userServiceProxy = (UserService)enhancer.create();
第六步:调用代理对象的代理方法
JDK动态代理要提供InvocationHandler调用处理器,CGLB要提供MethodInterceptor方法拦截器
注:方法拦截器对象 是一个实现MethodInterceptor接口和intercept拦截方法的类
通过methodProxy.invokeSuper(target, objects) 调用目标(父类)方法
返回值 一定要把目标对象的目标方法的返回值返回
对于高版本的JDK,如果使用CGLIB,需要在启动项中添加两个启动参数

2. Bean

1.Bean的作用域
singleton单例
prototype原型 多例 getBean时候创建
request请求(web)
session会话(web)

2.Bean的实例化(获取方式)
(1 构造方法实例化 使用全类名调用无参构造器获取
(2 简单工厂模式实例化 factory-method 来获取
(3 工厂方法模式实例化 在配置文件中使用factory-bean 和factory-method 来获取
(4 实现Factory接口 自动指定factory-bean 和factory-method
BeanFactory 和 FactoryBean 的区别
3. Date的注入 使用FactoryBean
4.Bean的生命周期 *重要
(1 周期 五步: 实例化 赋值 初始化 使用 销毁
(2 周期 七步: 实例化 赋值 (Bean后处理器的before方法) 初始化 (Bean后处理器bafter方法) 使用 销毁
(3 周期 十步: 实例化 赋值 1 (Bean后处理器的before方法) 2 初始化 (Bean后处理器bafter方法) 使用 3 销毁
点位1:检查是否实现了Aware相关接口,并调用方法
点位2:检查是否实现了InitializingBean接口,并调用方法
点位3:检查是否实现了DisposableBean接口,并调用方法
5. 基于单例singleton和set注入下,循环依赖可以正常执行(因为是单例,对象唯一,可以提前曝光)
正常执行的原因:第一阶段,bean容器加载时,实例化Bean,只有任意一个Bean实例化后,就立马进行曝光(不等属性赋值就曝光)
第二阶段,bean曝光之后,再对属性进行赋值
基于构造注入下,循环依赖无法解决
6. 反射:
获取类 Class<?> clazz =Class.forName(“Com.it.spring6.bean.Bean”);
创建对象 Object obj = clazz.newInstance;
获取方法 Method doSomeMethod=clazz.getDeclareMethod(“doSome”,String.class,int.class);
调用方法 Object retValue = doSomeMethod.invoke(obj,参数1,参数2…);
获取属性 Field field = clazz.getDeclareField(属性名);

3.注解式开发

  1. Spring IoC注解式开发
    (1) 负责声明Bean的注解,常见的包括四个: 使用前 ● 第一步:加入aop的依赖
    @Component ● 第二步:在配置文件中添加context命名空间
    @Controller ● 第三步:在配置文件中指定扫描的包
    @Service ● 第四步:在Bean类上使用注解
    @Repository (存储库)
    细节:如果注解的属性名是value,那么value是可以省略的
    如果不写Value,默认名字的规律是:Bean类名首字母小写
    多包扫描和选择实例化Bean

    (2) Bean属性赋值需要用到这些注解:
    @Value 简单类型
    @Autowired 非简单&自动装配,根据类型 构造函数只有一个时,可省略
    @Qualifier 联合,根据名字自动装配
    ** @Resource ((推荐))根据名称装配byName,未指定name时,使用属性名作为name,通过name找不到的话会自动启动通过类型byType装配
    @Resource注解是JDK扩展包中的,需要导入依赖

    (3) 全注解式开发 ----用SpringConfiguration类代替
    @Configuration
    @ComponentScan({“com.powernode.spring6.dao”, “com.powernode.spring6.service”})

4.集成JdbcTemplate

JdbcTemplate
(1) 环境准备
数据库-idea模块-引入依赖-实体类-spring配置文件-数据源DataSource-bean配置
(2) 功能:增删改查
(3) 回调函数
(4) 引入德鲁伊连接池

5.springAOP

面向切面编程AOP Aspect Oriented Programming 与业务逻辑不挂钩的代码单独提取出来,叫切面 比如事务,日志等
(1)一般一个系统当中都会有一些系统服务,例如:日志、事务管理、安全等。这些系统服务被称为:交叉业务
用一句话总结AOP:将与核心业务无关的代码独立的抽取出来,形成一个独立的组件,然后以横向交叉的方式应用到业务流程当中的过程被称为AOP。
(2)AOP的优点:
第一:代码复用性增强。
第二:代码易维护。
第三:使开发者更关注业务逻辑。
(又叫增强)
(3)七大概念: 连接点JoinPoint 切点 Pointcut + 通知Advice = 切面 Aspect
织入Weaving 代理对象 Proxy 目标对象 Target
前置通知 后置通知 环绕通知(前后都有) 异常通知(catch) 最终通知(final)
切点表达式 execution([访问控制权限修饰符] 返回值类型 [全限定类名]方法名(形式参数列表) [异常])
(4)使用Spring的AOP
* 第一种方式:Spring框架结合AspectJ框架实现的AOP,基于注解方式。
第二种方式:Spring框架结合AspectJ框架实现的AOP,基于XML方式。
第三种方式:Spring框架自己实现的AOP,基于XML配置方式。(基本不用)
准备工作:引入spring-aop 和 spring-aspects依赖,在spring配置文件中添加context和aop命名空间
第一种 注解方式:
第一步:定义目标类以及目标方法 通知类型包括:
第二步:定义切面类 ● 前置通知:@Before 目标方法执行之前的通知
第三步:目标类和切面类都纳入spring bean管理 ● 后置通知:@AfterReturning 目标方法执行之后的通知
第四步:在spring配置文件中添加组件扫描 ● 环绕通知:@Around 目标方法之前添加通知,同时目标方法执行之后添加通知。
第五步:在切面类中添加通知 ● 异常通知:@AfterThrowing 发生异常之后执行的通知
第六步:在通知上添加切点表达式 ● 最终通知:@After 放在finally语句块中的通知
第七步:在spring配置文件中启用自动代理
通知类型执行顺序: 前环绕 前置通知 系统在运行 后置通知 最终通知 后环绕
前环绕 前置通知 系统在运行 异常通知 最终通知
切面执行顺序:@Order(数字,越小,优先级越高)
通用切点表达式的定义 @Pointcut(“execute(…)”) public void 通用切点名(){}
连接点类JoinPoint (除了环绕通知是ProceedingJoinPoint) 主要方法 getSignature()获取目标方法的签名
全注解式开发 :@Configuration
@ComponentScan({“com.it.spring6.service”})
@EnableAspectJAutoProxy(proxyTargetClass = true)
new AnnotationConfigApplicationContext(Spring6Configuration.class);
第二种 XML方式: 第一步:编写目标类
第二步:编写切面类,并且编写通知
第三步:编写spring配置文件

6.spring对事务的支持

方式一: 编程式事务
方式二: 声明式事务 ->1.基于注解(用的多) 2.基于XML文件
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。
PlatformTransactionManager接口:spring事务管理器的核心接口。在Spring6中它有两个实现: 平台事务管理器
● DataSourceTransactionManager:支持JdbcTemplate、MyBatis、Hibernate等事务管理。 数据源事务管理器
● JtaTransactionManager:支持分布式事务管理。
基于注解方式:
第一步:在spring配置文件中配置事务管理器。
第二步:在spring配置文件中引入tx命名空间。
第三步:在spring配置文件中配置“事务注解驱动器”,开始注解的方式控制事务。
第四步:在service类上或方法上添加**@Transactional**注解。
@Transactional注解的重要属性: 要求 支持 强制性的 要求新的 不支持 从不 嵌套的
● 事务传播行为 propagation 七种 required supports mandatory required_new not_supports never nested
● 事务隔离级别 isolation 四种 read_uncommitted read_committed repeatable_read serializable (对应3大读问题:脏读,不可重复读,幻读)
● 事务超时时间 timeout 在当前事务当中,最后一条DML(主要有insert、update、delete语法组成)语句执行之前的时间,表示超过n秒还没有执行完毕的话,最终结果会选择回滚。 (有坑)
● 只读事务 readOnly 当true时,只可执行select语句, insert、update、delete语句无法使用(启动spring的优化策略,提高select语句执行效率)
● 设置出现哪些异常回滚事务 rollbackFor 异常类A.class 表示 表示只有出现A及其子类,都回滚
● 设置出现哪些异常不回滚事务 noRollbackFor 异常类A.class 表示 表示出现A及其子类,不回滚,其他都回滚
全注解开发:@Configuration //代理spring.xml配置文件
@ComponentScan({“com.it.bank”}) //组件扫描
@EnableTransactionManagement //开启事务管理器
类中使用@Bean(name=“xx”) 注解,spring看到@Bean后,会调用这个@Bean的方法,返回一个对象,这个对象会自动纳入Ioc容器,并且这个名字是xx
借助@Bean完成对数据源DataSource ,jdbc模板JdbcTemplate , 数据源事务管理器 DataSourceTransactionManager 的实例化
方便在后续Dao中的调用
XML文件方式:
● 第一步:(依赖spring-aspects) 在spring配置文件中配置事务管理器。
● 第二步:在spring配置文件中引入tx命名空间,引入Aop命名空间(要配置切面)
● 第三步:配置通知 <tx:advice id=“txAdvice” transaction-manager=“txManager”>
tx:attributes
<tx:method name=“方法名” 后面加事务的属性 事务传播,隔离级别 等等等
● 第四步:配置切面

aop:config

<aop:pointcut id=“txPointcut” expression=“execution(* com.it…*(…))”/>

<aop:advisor advice-ref=“txAdvice” pointcut-ref=“txPointcut”/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值