依赖注入通常有如下两种:设置注入和构造注入:
构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入
设值注入是指IoC容器使用属性的setter方法来注入被依赖的实例。这种注入方式比较简单、直观
在没有设值注入的情况下才会根据配置文件中的构造注入,一旦有设值注入,则构造注入失效
SpringMVC的原理:
SpringMVC是Spring中的模块,它实现了mvc设计模式的web框架,首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handler,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handler进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到reponset域,返回给用户。
DispatcherServlet作为springMVC的前端控制器,负责接收用户的请求并根据用户的请求返回相应的视图给用户。
七大模块,如下:
1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
2.Spring Context: 构建于Core封装包基础上的Context封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。
3.Spring DAO:DAO(Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。
4.Spring ORM:ORM封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate和iBatis。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。
5.Spring AOP: Spring的AOP封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。
6.Spring Web: Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。
7.Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。
Servlet接口的方法有哪些?
doGet和doPost是HttpServlet中的方法;forward是RequestDispatcher的方法
下面有关spring依赖注入说法错误的是?
spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了,也就是控制权的转让。
spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。
我们一般都不直接用BeanFactory,而是用它的实现类 ApplicationContext ,这个类会自动解析我们配置的applicationContext.xml
ApplicationContext初始化时会检验,而BeanFactory在第一次使用时未注入,才会抛出异常
Spring的特色之一,简单而强大的事务管理功能,包括编程式事务和声明式事务。
1. Spring中涉及到事务管理的API有100多个,核心的只有三个: TransactionDefinition、PlatformTransactionManager、TransactionStatus。所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。“给定的事务规则”就是用 TransactionDefinition 表示的,“按照……来执行提交或者回滚操作”便是用 PlatformTransactionManager 来表示,而 TransactionStatus 用于表示一个运行着的事务的状态。
2. TransactionDefinition, 该接口在前面已经介绍过,它用于定义一个事务。它包含了事务的静态属性,比如:事务传播行为、超时时间等等。Spring 为我们提供了一个默认的实现类:DefaultTransactionDefinition,该类适用于大多数情况。如果该类不能满足需求,可以通过实现 TransactionDefinition 接口来实现自己的事务定义。
3. PlatformTransactionManager 用于执行具体的事务操作。
Public interface PlatformTransactionManager{
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status)throws TransactionException;
void rollback(TransactionStatus status)throws TransactionException;
}
根据底层所使用的不同的持久化 API 或框架,PlatformTransactionManager 的主要实现类大致如下:
DataSourceTransactionManager :适用于使用JDBC和iBatis进行数据持久化操作的情况。
HibernateTransactionManager :适用于使用Hibernate进行数据持久化操作的情况。
JpaTransactionManager :适用于使用JPA进行数据持久化操作的情况。
另外还有JtaTransactionManager 、JdoTransactionManager、JmsTransactionManager等等。
4. 编程式事务需要你在代码中直接加入处理事务的逻辑,可能需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法,如在执行a方法时候需要事务处理,你需要在a方法开始时候开启事务,处理完后。在方法结束时候,关闭事务. 声明式的事务的做法是在a方法外围添加注解或者直接在配置文件中定义,a方法需要事务处理,在spring中会通过配置文件在a方法前后拦截,并添加事务.二者区别.编程式事务侵入性比较强,但处理粒度更细. 相当于一个是手动事务,另一个是系统自动事务。 编程试事务就是需要手工写代码提交事务,回滚事务等。 声明性事务就是在配置文件里面定义一下什么时候需要事务,到时候系统会自动commit,出异常了自动rollback,不需要在代码里面写commit或者rollback。
Spring并没有为我们提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring是一系列轻量级Java EE框架的集合
核心容器,Spring上下文,Spring AOP, Spring DAO, Spring ORM, Spring Web, Spring MVC。
在Spring框架中获取连接池可以有哪些方式?
DBCP数据源
C3P0数据源
Spring的数据源实现类(DriverManagerDataSource)
获取JNDI数据源
Bean的创建时会提到Spring的单例模式,就是说默认情况下Spring中定义的Bean是以单例模式创建的。如果以前了解设计模式中的单例模式的话很容易对这种说法产生先入为主的印象。事实上,Spring中的单例模式还有许多需要注意的地方。
在GoF中的单例模式是指一个ClassLoader中只存在类一个实例。
而在Spring中的单例实际上更确切的说应该是:
1.每个Spring Container中定义的Bean只存在一个实例
2.每个Bean定义只存在一个实例。
spring mvc 和struts2的区别: 1.spring mvc是基于方法的设计,而struts2是基于类的设计。 2.struts2有以自己的interceptor机制,spring mvc用的是独立的AOP方式。 3.spring mvc的方法之间基本上独立的,独享request response数据,struts2所有Action变量是共享的。 4.机制:spring mvc的入口是servlet,而struts2是filter。 5.性能:spring会稍微比struts快。 spring mvc是基于方法的设计 , 而sturts是基于类 , 每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细
参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
设计思想上: struts更加符合oop的编程思想 , spring就比较谨慎,在servlet上扩展。 8.intercepter(拦截器)的实现机制:struts有以自己的interceptor机制, spring mvc用的是独立的AOP方式 。
1. 机制:spring mvc的入口是servlet,而struts2是filter。
2. 性能:spring会稍微比struts快。 spring mvc是基于方法的设计 , 而sturts是基于类 ,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细(粒度级别的东西比较sychronized和lock),但要小心把握像在servlet控制数据一样。 spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。 而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
3. 参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。所以D是对的。
4. 设计思想上: struts更加符合oop的编程思想 , spring就比较谨慎,在servlet上扩展。
5. intercepter(拦截器)的实现机制:struts有以自己的interceptor机制, spring mvc用的是独立的AOP方式 。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得,就拿使用上来讲,spring mvc使用更加简洁, 开发效率Spring MVC确实比struts2高 。 spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上 spring3 mvc就容易实现restful url 。 struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。 spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量, 而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。
6. 另外,spring3 mvc的验证也是一个亮点,支持JSR303, 处理ajax的请求更是方便 ,只需一个注解 @ResponseBody ,然后直接返回响应文本即可。
网友评论