spring相关问题

什么是spring ?
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.
spring的设计思想是,单例模式和工厂模式


一、解释一下Dependency injection(DI依赖注入)和IOC(Inversion of control控制反转)?
当一个调用者需要被另一个调用者协助时,创建被调用者的工作不再由调用者来完成,称为控制反转。创建调用者实例的工作通常由spring容器来完成,然后注入调用者,称为依赖注入。


二、spring中的BeanFactory与ApplicationContext的作用有哪些
bean工厂作用:
(1) 创建对象实例
(2) 创建和管理对象之间的依赖
(3) 参与bean的生命周期管理,调用用户定义的初始化方法和销毁方法
ApplicationContext工厂作用: 
(1) 包括BeanFactory的所有功能
(2) 提供国际化的消息访问(getMessage) 
(3) 资源管理:可以直接读取一个文件的内容,例如URL 
(4)事件传播(事件处理),实现了ApplicationListener接口的bean
(5) 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层 web应用中自动加载ApplicationContext

三、如何在spring中实现国际化
写个中英文属性文件messageRsource_en_US.properties、messageRsource_zh_CN.properties
XML配置
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
            <list>
                <value>messageResource</value>
            </list>
        </property>
</bean>
后台获得:
ApplicationContext/MessageResource ctx = new
FileSystemXmlApplicationContext("demo.xml");
//加载上面的xml userName为资源文件里的key
ctx.getMessage("userName",new String[]{"dddd"},Locale.getDefault());
这个dddd  需要在资源文件里 配一下 通配符  userName=\u7528\u6237\u540d{0}

四、spring中的核心类有那些,各有什么作用?
BeanFactory:产生一个新的实例,可以实现单例模式 创建和管理对象之间的依赖
BeanWrapper:提供统一的get及set方法
ApplicationContext:提供框架的实现,包括BeanFactory的所有功能  国际化(getMessage) 资源管理

五、spring的组成部分
Spring 核心容器(Core):提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际的应用代码程序分开。
Spring AOP:通过配置管理特性,Spring AOP模块直接面向方面的编程功能集成到了Spring框架中,所以可以很容易的使Spring框架管理的任何对象支持 AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖于EJB组件,就可以将声明性事务管理集成到应用程序中。
Spring ORM:Spring框架集成了若干ORM框架,从而提供了ORM的对象关系工具,其中包括 JDO、Hibernate、iBatis和TopLink。所有这些都遵从Spring的通用事务和DAO异常层结构。
Spring DAO:JDBC DAO抽象层提供了有意义的异常层次的结构,可用该结构来管理异常处理和不同数据供应商抛出的异常错误信息。异常层次结构简化了错误处理,并且大大的降低 了需要编写的异常代码数量(例如,打开和关系连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层结构。
Spring WEB:Web上下文模块建立在上下文模块(Context)的基础之上,为基于Web服务的应用程序提供了上下文的服务。所以Spring框架支持 Jakarta Struts的集成。Web模块还简化了处理多部分请求及将请求参数绑定到域对象的工作
Spring上下文(Context):Spring上下文是一个配置文件,向Spring框架提供上下文信息。 Spring上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化校验和调度功能。
Spring MVC:Spring的MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳的大量视图技术,包括JSP、Velocity、Tiles、iText和Pol

六、spring 中bean的作用域
singleton
当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
prototype
Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域
request
在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用 域仅在基于web的Spring ApplicationContext情形下有效。
session
在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring
ApplicationContext情形下有效。
global session
在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet
context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。

七、spring的四大特点
1、低侵入式设计,代码污染极低
2、独立于各种应用服务器,spring应用真正实现编写一次到处运行。
3、DI机制降低了替换业务对象的复杂性
4、高度开放性,并不强制完全依赖spring。贯穿表现层、业务层、持久层

八、什么是ioc容器
Org.springframework.beans包是SpringIoc容器的基础,org.springframework.beans.factory.BeanFactory接口是springIoc容器的实际代表者。Ioc容器负责容纳此前所描述的bean,并对bean进行管理。容器的工作就是创建bean时注入那些依赖关系。

Inversion of Control,是一种模式,处理类之间和接口之间或类与接口之间关联关系。控制反转意味着在系统开发过程中,设计的类将交由容器去控制,而不是在类的内部去控制,类与类之间的关系将交由容器处理,一个类在需要调用另一个类时,只要调用另一个类在容器中注册的名字就可以得到这个类的实例,与传统的编程方式有了很大的不同,”不用你找,我来提供给你”,这就是控制反转的含义。

九、spring注入的2种方式
设值注入:设值注入是指通过setter方法传入被调用者的实例  这种注入方式简单、直观。
设值注入需要在指定注入的类(person)提供被注入属性的setter()和getter()方法,还需要提供一个无参的构造方法
优点: setter 方法可以自动生成,简单。
缺点: 组件使用者或许会忘记给组件注入它需要的依赖; 在第一次注入后,依赖可能会因为 setter 方法的调用而被修改。
构造注入:通过构造函数来完成依赖关系的设定  在构造期即创建一个完整、合法的对象
构造注入需要在指定注入的类(person)提供一个带参数的构造方法, 接收被注入的属性
优点:
1、解决了setter注入的缺点
2、构造注入可以再构造器中决定依赖关系的注入顺序,优先依赖的优先注入        
3、对于依赖关系无须变化的Bean,构造注入更有用处;因为没有setter方法,所有的依赖关系全部在构造器内设定,因此,不用担心后续代码对依赖关系的破坏
缺点: 需通过参数位置来确定参数; 若组件有多个依赖需要注入, 会导致构造器参数列表非常冗长。

十、spring创建实例的方式(如默认的, 静态工厂 工厂方法)
创建静态工厂方法:(xml配置)
<bean id="cat" class="包名.类名" factory-method="静态工厂的方法名">
<constructor-arg>
            <value>参数</value>
        </constructor-arg>
</bean>

创建非静态工厂方法(xml配置):
<bean id="factory" class="包名.类名"/>
<bean id="cat1" factory-bean="factory" factory-method="非静态工厂方法名">
<constructor-arg>
           <value>参数</value>
   </constructor-arg>
</bean>


十一、spring初始化回调方法以及销毁( 析构回调)方法配置
在bean里 配置 init-method="fun" 和 destroy-method
<!-- init-method 指定最先运行的方法  并且会自动运行-->
<bean id="person" class="com.lxit.Person" init-method="fun">


十二、IOC容器的实现类型
Spring 提供了两种类型的 IOC 容器实现.:BeanFactory: IOC 容器的基本实现,ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口,无论使用何种方式, 配置文件时相同的。 ApplicationContext 只是一个接口, 需要实例化其实现类:ClassPathXmlApplicationContext: 从 classpath 下加载配置文件,FileSystemXmlApplicationContext: 从文件系统中加载配置文件,XmlWebApplicationContext: 只能用于 web 应用。最长使用的是ClassPathXmlApplicationContext这个实现类。调用 ApplicationContext 的 getBean() 方法可以获取IOC容器中的对象。

十三、spring框架中bean的生命周期
  (1)  bean定义
    在配置文件里面用<bean></bean>来进行定义。
  (2)  bean初始化
    有两种方式初始化:
A.在配置文件中通过指定init-method属性来完成
B.实现org.springframwork.beans.factory.InitializingBean接口
  (3)  bean调用
    有三种方式可以得到bean实例,并进行调用
  (4)  bean销毁
    销毁有两种方式
A.使用配置文件指定的destroy-method属性
B.实现org.springframwork.bean.factory.DisposeableBean接口

十四、Spring读取配置文件的方式
InputStream is = new FileInputStream("beans.xml");
InputStreamResource isr = new InputStreamResource(is);
BeanFactory beanFactory = new XmlBeanFactory(isr);

Spring给出一些BeanFactory的实现类,其中最为常用的是XmlBeanFactory。
1、通过文件系统
Resource res = new FileSystemResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
2、通过类路径
ClassPathResource res = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
3、通过ApplicationContext加载
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
BeanFactory factory = (BeanFactory) appContext;

十五、  连接点,切入点,切面,方面,处理,代理,目标对象
连接点:
在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。
切入点:
匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
切面:
一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式来实现。
方面:
有了切面组成了方面:事务、日志、安全、权限
处理:

代理:
AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
目标对象(Target Object):
被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。

十六、  spring中代理的两种方式
1、jdk动态代理--面向接口编程(默认)
2、cglib代理--面向具体类(实现)编程

十七、  事务的类型
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用

十八、  jdbc是如何支持事务
jdbc它是通过connection这个接口来支持事务的。
主要是setAutoCommit()和commit()以及rollback()方法。

十九、 spring事务的组成部分
事务主要是由:事务的传播行为,事务的隔离级别,事务的超时值,事务只读标志组成

二十、 说说一下spring事务支持的几个类
TransactionTemplate类(事务模板类)和PlatformTransactionManager(事务平台管理类)

二十一、 spring定义事务的几种方式
包括编程型事务的和声明型事务。
编程型:通过TransactionTemplate、PlatformTransactionManager这二个超级接口实现
声明型:就在配置文件中配置,主要配置三个部分:DataSource、TransactionManager和代理机制这三部分

二十二、 spring中事务代理的几个类
ProxyFactoryBean实现单个代理机制
BeanNameAutoProxyCreator实现动态代理机制

二十三、  -exception与+exception
-Exception指碰到异常强制回滚事务,+Exception事务回滚失效

二十四、 log4j日志的几种级别
fatal>error>warn>info>debug>off

二十五、 说说一下在我们项目中用aop加入日志的流程
1、首先定义一个类实现BeforeAdvice或AfterAdvice接口
2、配置这个类的bean
3、选择使用代理类BeanNamesAutoProxyCreate或ProxyFactoryBean来引入目标类和处理类
4、再配置一下log4j.properties资源文件
5、用前置通知来处理目标类。

二十六、 spring模板技术 ,他有什么好处
在bean定义中包含了大量的配置信息,其中包括容器相关的信息(比如初始化方法、静态工厂方法名等等)以及构造器参数和属性值。子bean定义就是从父bean定义继承配置数据的bean定义。它可以覆盖父bean的一些值,或者添加一些它需要的值。使用父/子bean定义的形式可以节省很多的输入工作。
好处:子类可以继承父类的一些属性,也可改变或增加属性,减少代码量, 使用bean模板技术可以节省很多的输入工作

二十七、 说说一下spring支持的通知有几种
(1).before advice(前置通知)实现MethodBeforeAdvice接口。
是在方法调用前调用,没有返回值,通常意外情况下,会继续运行下一步方法.记住的一点是没有返回值。
(2).after advice(后置通知)实现AfterReturningAdvice接口
是在方法调用后调用,有返回值,记住的一点是有返回值。
(3).around advice(环绕通知)实现MethodInterceptor接口
around是针对具体的某个切入点的方法,around的切入类型是就这个方法的内部调用,是通过java的元数据,在运行时通过Method.invoke来调用,具有返回值,当发生意外的时候会终止.记住的一点是有返回值。
(4).throws advice(异常通知)实现ThrowsAdvice接口
就在当程序有异常的时候进行通知,提供一些异常的信息
(5).introduce advice(引入通知)
引入通知是一种特殊的通知,它能将新的成员变量、成员方法引入到目标类中。它不能作用于任何切入点,因为它只作用于类层次,而不是方法层次。实现引入通知需要实现IntroductionAdvisor和IntroductionInterceptor接口。

二十八、 spring事务的原理(从架构图回答)
事务管理的方式:编程型和声明型,spring推荐使用后一种方式
声明型事务管理的优势非常明显:代码中无需关于关注事务逻辑,让Spring声明式事务管理负责事务逻辑,声明式事务管理无需与具体的事务逻辑耦合,可以方便地在不同事务逻辑之间切换。
声明式事务管理的配置方式,通常有如下三种:
1.使用TransactionProxyFactoryBean为目标bean生成事务代理的配置。此方式是最传统,配置文件最臃肿、难以阅读的方式。
2.采用bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。
3.使用BeanNameAutoProxyCreator,根据bean name自动生成事务代理的方式,这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。
4.DefaultAdvisorAutoProxyCreator:这也是直接利用Spring的AOP框架配置事务代理的方式,效果也非常不多,只是这种配置方式的可读性不如第三种方式。
编程式:围绕着两个核心PlatformTransactionManager和TransactionStatus
spring提供了几个关于事务处理的类:
TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。


二十九、 spring的后处理技术是干什么的
创建代理对象

三十、 spring事务的传播属性(7个,最好能说出3个)
1.PROPAGATION_MANDATORY:要求调用该方法的线程必须处于事务环境中,否则抛出异常。
2.PROPAGATION_NESTED:如果执行该方法的线程已处于事务环境下,依然启动新的事务,方法在嵌套的事务里执行。如果执行该方法的线程并未处于事务中,也启动新的事务,然后执行该方法,此时与PROPAGATION_REQUIRED相同。
3.PROPAGATION_NEVER:不允许调用该方法的线程处于事务环境下,如果调用该方法的线程处于事务环境下,则抛出异常。
4.PEOPAGATION_NOT_SUPPORTED:如果调用该方法的线程处于在事务中,则先暂停当前事务,然后执行该方法。
5.PEOPAGATION_REQUIRED:要求在事务环境中执行该方法,如果当前执行线程已处于事务中,则直接调用,如果当前执行线程不已处于事务中,则启动新的事务后执行该方法。
6.PEOPAGATION_REQUIRES_NEW:该方法要求有一个在新的事务环境中执行,如果当前执行线程已处于事务中,先暂停当前事务,启动新的事务后执行该方法;如果当前执行线程不已处于事务中,则启动新的事务后执行该方法
7.PEOPAGATION_SUPPORTS:如果当前执行线程已处于事务中,则使用当前事务,否则不使用事务。


三十一、 spting默认的事务隔离级别是什么?
isolation="READ_COMMITTED"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值