【spring】spring基础笔记以及面试知识点

6 篇文章 0 订阅

ioc

控制反转:

Inverse of Control 反转控制的概念,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理,简单说,就是创建对象控制权被反转到了Spring框架
例子:<bean id = "userService" class="com.demo.spring.UserServiceImpl"> </bean>

DI解释

Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件。
例子:在UserService中提供一个get/set的name方法,在beans.xml中通过property去注入

<property name="name" value="zhangsan"> </property>
<!--userService.setName("")-->

底层技术:工厂+反射+配置文件

spring核心包

beans core context expression
还会去找一个日志包:
commons-logging.jar(必导包 )
企业开发用的日志包:apache-log4j.jar
spring运行的时候,找logging,logging会自动找log4j,

三种加载Spring配置文件方式:

1.类路径获得配置文件
ApplicationContext context =
new ClassPathXmlApplicationContext(“com/demo/spring/beans.xml”);

2.文件系统路径获得配置文件
ApplicationContext context = new FileSystemXmlApplicationContext(“H:\xxx\beans.xml”);

3.使用BeanFactory (了解)
BeanFactory 采取延迟加载,第一次getBean时才会初始化Bean
ApplicationContext是对BeanFactory扩展,提供了更多功能
国际化处理
事件传递
Bean自动装配
各种不同应用层的Context实现

bean的作用域

掌握前两个常用的即可
singleton 在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值
prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean()
request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session 同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext 环境
globalSession 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext 环境

生命周期解释

1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware 执行 setBeanName
4.如果Bean实现BeanFactoryAware 执行setBeanFactory ,获取Spring容器
5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean 执行 afterPropertiesSet
7.调用 指定初始化方法 init
8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
执行业务处理
9.如果Bean实现 DisposableBean 执行 destroy
10.调用 指定销毁方法 customerDestroy

注解:

@Component
@component取代
6.4.2 @Component(“id”)
取代
6.4.4 web开发,提供3个@Component注解衍生注解(功能一样)取代
@Repository(“名称”):dao层
@Service(“名称”):service层
@Controller(“名称”):web层

@Autowired:自动根据类型注入 如果是接口则去spring容器中找实现类
@Qualifier(“名称”):指定自动注入的id名称

@Resource(name = “名称”) 代替上面两行代码

@ PostConstruct 自定义初始化
@ PreDestroy 自定义销毁

spring 线程

Spring框架中的单例Beans是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。

Spring如何处理线程并发问题?

在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。

ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

装配bean的三种方式:

<!-- 所谓的装配bean就是在xml写一个bean标签-->
 <!-- 第一种方式: new 实现类-->
 <bean id="userService1" class="com.gyf.service.UserServiceImpl"></bean>
 <!-- 第二种方式:通过静态工厂方法
    spring的版本过低,3.0版本,把jdk改成1.7
  -->
 <bean id="userService2" class="com.gyf.service.UserSereviceFactory1" factory-method="createUserService"></bean>

 <!--第三种方式:通过实例工厂方法 -->
 <!-- 创建实例factory2 bean-->
 <bean id="factory2" class="com.gyf.service.UserSereviceFactory2"></bean>

 <bean id="userService3" factory-bean="factory2" factory-method="createUserService"></bean>

Aop

OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。

AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。横向抽取。

如果说到权限判断,日志记录等,可能就明白了。如果我们单纯使用OOP,那么权限判断怎么办?在每个操作前都加入权限判断?日志记录怎么办?在每个方法里的开始、结束、异常的地方手动添加日志?所有,如果使用AOP就可以借助代理完成这些重复的操作,就能够在逻辑过程中,降低各部分之间的耦合了。

Spring使用的AOP是基于AspectJ的AOP开发。

Joinpoint:连接点,可以被拦截到的点(可以被增强的点)
Pointcut:切入点, 真正被拦截到的点
Advice:通知/增强 增强的方法称为是通知(方法层面)
Introduction:引介 类层面的增强(在类里面加个方法、属性)
Target:被增强的对象
Weaving:织入 将通知应用到目标的过程
Proxy:代理对象
Aspect:切面 多个通知和多个切入点的组合。

通知类型:

  1. 前置通知 在目标方法执行之前进行操作
public void checkPri(JoinPoint joinPoint){
    sout(joinPoint)
<!--各种通知都可以获取 !切入点! 的信息-->
}
  1. 后置通知 在目标方法执行之后进行操作
    还可以获得方法的返回值
    <aop:after-returning method=“writeLog” pointcut-ref=“pointcut1”/>

  2. 环绕通知 在目标方法执行之前和之后进行操作
    可以阻止目标方法的执行

  3. 异常通知 出现异常进行的操作

  4. 最终通知 无论代码是否有异常 ,总是会执行

eclipse 写aop xml 设置提示:
windows - preferences - xml catalog -
add fileSystem 添加xsd

事务

PlatformTransactionManager:平台事务管理器
接口,是spring用于管理事务的真正的对象
DataSourceTransactionManager:底层使用JDBC管理事务
HibernateTransactionManager:hibernate管理事务

TransactionDefinition:事务定义信息
事务定义:用于定义事务的相关的信息,隔离级别、超时信息、传播行为、是否只读

TransactionStatus:事务的状态
事务状态:用于记录在事务管理过程中,事务的状态的对象

spring在进行事务管理的时候,平台事务管理器会根据事务定义信息进行事务管理,在事务管理过程中,就会产生事务的状态,将这些状态的信息记录到事务状态的对象中。

事务的传播行为:
主要用于解决业务层方法相互调用的问题
1 保证多个操作在同一个事务中:
PROPAGATION_REQUIRED: 默认值

2 保证多个操作不在同一个事务中:
PROPAGATION_REQUIRED_NEW
3 嵌套事务:
PROPAGATION_NESTED

事务四大特征ACID:

1.原子性:是不可分割的最小操作单位,要么同时成功 要么同时失败 2.一致性:事务操作前后 数据总量不变 3.隔离性:多个事务之间 相互独立 (实际中一般都会有 影响,所以有事务的隔离级别) 4.持久性:如果事务一旦提交或者回滚 数据库会持久化 保存数据。

事务的隔离级别:

多个事务之间 相互独立的,但是如果多个事务操作同 一批数据,则会引发一些问题,设置不同的隔离级别就 可以解决这些问题。 存在问题: 1.脏读:一个事务读取到另一个事务中没有提交的数据 2.不可重复读(虚读 ):同一个事务中 两次读取到的数据不一样. (A事务读取了一条数据 执行逻辑的时候 事务B将这条数据改变了 A再读发现不匹配 侧重update和delete) 3.幻读:一个事务操作(DML)数据表中所有记录, 另一个事务添加了一条数据,则第一个事务查询不到自己的修改 侧重在insert。

隔离级别:

read uncommitted;读未提交 脏读,不可重复读,幻读3种问题都会发生。
read committed;读已提交 (Oracle默认) 会产生不可重复读 幻读
repeatable read; 可重复读 (Mysql默认) 会产生幻读 4.serializable:串行化 (锁表 即一个 事务操作的时候 另一个事务不允许操作) 可以解决所有问题 但是越安全效率则越低
mysql:
数据库查询隔离级别: select @@tx_isolation; 设置: (关闭窗口 重新打开生效) set global transaction isolation level 加级别的单词

Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别(Oracle还提供了自己独有的事务隔离级别:read only ;default READ COMMITTED(最低级别))。
如spring配置文件 repeatable read 则会报错声明仅 READ_COMMITTED 和 SERIALIZABLE 是有效的事务处理级

动态代理

jdk代理

如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。

cglib代理

如果目标对象实现了接口,可以强制使用CGLIB实现AOP。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟秋与你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值