sping相关知识记录

sping相关知识记录,第1张

1、Spring AOP 的了解

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。 aop 底层是采用动态代理机制实现的:接口+实现类如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象。没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理。就是由代理创建出一个和 impl 实现类平级的一个对象,但是这个对象不是一个真正的对象, 只是一个代理对象,但它可以实现和 impl 相同的功能,这个就是 aop 的横向机制原理,这样就不需要修改源代码。

2、 Spring Bean 在容器中的生命周期

Bean 容器找到配置文件中 Spring Bean 的定义。Bean 容器利用 Java Reflection API 创建一个 Bean 的实例。Spring bean 在容器中的生命周期流程如下:

(1)Spring 容器根据配置中的 bean 定义中实例化 bean。

(2)Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。 如果涉及到一些属性值 利               用 set()方法设置一些属性值。

  (3) 如果 Bean 实现了BeanNameAware 接口,调用 setBeanName()方法,传入 Bean 的名字。

  (4) 如果 Bean 实现了BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法, 传入 ClassLoader 对象的实例。

(5) 如果 Bean 实现了 BeanFactoryAware 接口,调用 setBeanFactory()方法,传入BeanFactory 对象的实例。与上面的类似,如果实现了其他 *.Aware 接口,就调用相应的方法。

(6)如果为 bean 指定了 init 方法( 的 init-method 属性),那 么将调 用它。

(7)如果存在与 bean 关联的任何 BeanPostProcessors,则将调用postProcessAfterInitialization() 方法。如果 Bean 实现了 InitializingBean 接口,执行 afterPropertiesSet()方法。

(8)如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。

(9)如果为 bean 指定了 destroy 方法( 的 destroy-method 属 性),那么将调用它。 ​​​​​​​

3. Spring Bean 配置方式有几种,bean都有哪些作用域 ?

(1) 基于XML配置

(2)基于注解配置@service,@compment等

(3)基于API,@Configuration  和@Bean 注解

bean的作用域:单例 singleton : bean 在每个 Spring IOC 容器中只有一个实例.原型 prototype:一个 bean 的定义可以有多个实例。 request:每次 http 请求都会创建一个 bean。session:在一个 HTTP Session 中,一个 bean 定义对应一个实例。 globalsession application。

4、注解 @Autowired 和 @Resource 有什么区别?

(1)Resource 是 JDK 提供的,而 Autowired 是 Spring 提供的 Resource 不允许找不到 bean 的情况,而 Autowired 允许(@Autowired(required = false))指定 name 的方式不一样,@Resource(name = "baseDao"),@Autowired()@Qualifier("baseDao") Resource 默认通过 name 查找,而 Autowired 默认通过 type 查找(1)@Autowired 与@Resource 都可以用来装配 bean,都可以写在字段setter 方法上

(2)@Autowired 默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许 null值,可以设置它的 required 属性false。如果想使用名称装配可以结合@Qualifier 注解进行使用。

(3)@Resource默认按照名称进行装配,名称可以通过 name 属性进行指定,如果没有指定 name 属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在 setter方法上默认取属性名进行装配。当找不到与名称匹配的 bean 才按照类型进行装配。但是需要注意的是,如果 name 属性一旦指定,就只会按照名称进行装配。

5.Spring 框架事务注解用什么注解?使用该注解的失效场景?

spring框架使用@Transactional 注解来控制事务。以下几种情况会出现注解事务失效

(1) Transactional 注解应用在非 public 修饰的方法上,因为spring的的注解事务是通过动态代理实现的如果是私有方法会调用失败。

(2) @Transactional 注解属性propagation 设置错误 

(3) @Transactional 注解属性 rollbackFor 设置错误

(4) 同一个类中方法调用,导致@Transactional 失效

(5) 异常被 catch“吃了”导致@Transactional 失效,通过异常判断当前事务是否需要回滚。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795724.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存