A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Spring
Spring的优点有什么?
1.Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分
2.轻量
3.AOP编程的支持
4.声明式事务支持
2.方便集成各种优秀框架
3.Spring使得对象管理集中化和简单化
6.Spring属于低侵入,代码污染极低。
请使用自己的语言对Spring中Ioc实现原理进行简要说明?
IOC,也就是控制反转的实现主要用到工厂模式和java反射机制,通过反射,可以获得该类的实例,可以得到该类的方法信息。在Ioc容器中,首先读取Spring配置bean的xml文件信息,通过解析xml得知哪些bean需要容器为其注入哪些属性等,并在适当的时机将所需要的属性等信息注入,这些类在使用这些属性时,已经由IoC容器注入了属性值等信息。此种方式与传统方式不同的地方在于不再由需要方主动获取,而是由IoC容器在适当时机注入,需要对方被动的接收,因此IoC也可以叫做DI,依赖注入。
描述一下spring中实现DI的几种方式
构造方法注入 set方法注入
AOP的概念
AOP,面向切面编程,指的是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加功能的一种技术。AOP的核心实现和IOC一样依赖于Java的反射机制,但是与IOC不同的地方是,IOC用到的设计模式是工厂模式,而AOP用到的是代理模式,代理模式的思想就是不让外部直接访问某个具体的目标,而是要通过一个代理才能访问。
Spring的AOP基于反射和动态代理实现,在目标对象的方法调用前后插入响应的处理代码,SpringAOP动态代理有两种实现方式,即java动态代理(面向接口)和CGLib(面向Class)
AOP一般用于实现那些与业务无关,但是业务模块所共同调用的逻辑,列入异常拦截,事务管理,日志记录和权限控制。AOP将这些代码封装起来,有利于减少系统的重复代码,降低模块间耦合度,提供可维护性。
连接点:目标对象中,所有可以增强的方法
切入点:目标对象中,已经增强的方法
通知/增强(advice):增强的代码
目标对象:被代理对象
织入:将增强应用到切入点的过程
切面:切入点+增强

Spring有哪几种通知类型?
前置通知:在目标方法运行之前调用
后置通知:在目标方法运行之后调用(如果出现异常,将不会调用)
环绕通知:在目标方法运行之前和之后都调用
异常拦截通知:如果出现异常,就会调用
后置通知:在目标方法运行之后调用(不论是否出现异常,都会调用)
OpenSessionInViewFilter
在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时 session已关闭,所以就会出现异常。 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们 希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Session In view 。 我们可以filter来达到此目的
OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。。
请简要描述在Spring中使用Hibernate的方法
1.在Spring配置文件中定义DataSource(数据源)的bean
2.在Spring配置文件中定义SessionFactory,设置参数
3.在Spring配置文件中定义数据库事务控制的bean
4.Dao类中继承HibernateDaoSupport实现具体接口,从中获得HibernateTemplate进行具体操作
在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInView过滤器
项目中如何体现Spring中的切面编程,具体说明。
项目中用到的Spring中的切面编程最多的地方:声明式事务管理。
   a、定义一个事务管理器
   b、配置事务特性(相当于声明通知。一般在业务层的类的一些方法上定义事务)
   c、配置哪些类的哪些方法需要配置事务(相当于切入点。一般是业务类的方法上)
spring的事务如何配置
声明式和注解式
spring的声明式事务配置:
    1. <!-- 配置sessionFactory -->
    2. 配置事务管理器
3. 配置事务特性
    4. 配置哪些类的哪些方法需要事务
事务的隔离级别
Spring的事务隔离级别DEFAULT:默认的隔离级别,使用数据库默认的事务隔离级别
1)read uncommitted :读未提交 是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。
2)read committed:读已提交,保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。 ---- oracle默认的
3)repeatable read:可重复读:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免不可重复读。 ---mysql默认的
4)serializable:串行化:可以解决 脏读 不可重复读和虚读----事务被处理为顺序执行相当于锁表
事务传播行为
所谓传播行为就是业务方法之间调用的时候,事务应该如何处理。
REQUIRED:(默认)如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
SUPPORTS: 支持当前事务,如果不存在,就不使用事务
REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。
NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常
NESTED:如果事务存在,则嵌套事务执行
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。
三种对象创建方式
1.空参构造创建 2.实例工厂创建 3.静态工厂创建
scope:singleton,单例对象(默认),被标识为单例的对象在Spring容器中只会存在一个实例
        prototype:多例原型,被标识为多例的对象,每次再获得才会创建,每次创建都是新的对象.
静态工厂创建
        <bean  name="user2" class="com.三种对象创建方式.UserFactory" factory-method="createUser"></bean>
实例工厂创建
<bean  name="userFactory" class="com.三种对象创建方式.UserFactory"></bean>        
<bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean>

   

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马