Spring框架的七大模块
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框架的其他特性。
Spring框架中的三大核心思想是什么
DI(依赖注入),IOC(控制反转),AOP(面向切面编程)
IOC的概念以及在Spring容器中如何进行IOC的操作。
IOC:Inversion of Control,控制反转。在Java开发中,IOC意味着将你设计好的类交给系统去控这里写代码片
制,而不是在你的类内部控制,这称为控制反转,就是被调用类的实例由原先的调用类控制创建、销毁现在转变成由Spring的容器管理。
Spring容器是如何管理Bean的生命周期的(如Bean的初始化方法,Bean的销毁方法)
创建:
<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”userDao”</span> <span class="hljs-attribute">ref</span>=<span class="hljs-value">”被引用bean的名称”</span> /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”username”</span> <span class="hljs-attribute">value</span> = “字符串”/></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
在Spring框架中获取连接池有几种方式。
当JNDI与DBCP同时存在时,会不会出现问题,如果不能同时存在的话,请说明原因
四种方式,如下:
1:DBCP数据源
DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池,所以在类路径下还必须包括/lib/jakarta-commons/commons-pool.jar。下面是使用DBCP配置oracle数据源的配置片断:
<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">bean</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">”dataSource”</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">”org.apache.commons.dbcp.BasicDataSource”</span> <span class="hljs-attribute">destroy-method</span>=<span class="hljs-value">”close”</span>></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”driverClassName”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”</span> <span class="hljs-attribute">oracle.jdbc.driver.OracleDriver</span> ” /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”url”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”jdbc:oracle:thin:@localhost:1521:orcl</span> ” /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”username”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”root”</span> /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”password”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”1234″</span> /></span> <span class="hljs-tag"></<span class="hljs-title">bean</span>></span> </code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>
2:C3P0数据源
C3P0是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明的Connection 和Statement 池。C3P0类包位于/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一个Oracle数据源:
<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">bean</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">”dataSource”</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">”com.mchange.v2.c3p0.ComboPooledDataSource”</span> <span class="hljs-attribute">destroy-method</span>=<span class="hljs-value">”close”</span>></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”driverClassName”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”</span> <span class="hljs-attribute">oracle.jdbc.driver.OracleDriver</span> ” /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”url”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”jdbc:oracle:thin:@localhost:1521:orcl</span> ” /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”username”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”root”</span> /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”password”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”1234″</span> /></span> <span class="hljs-tag"></<span class="hljs-title">bean</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>
3. Spring的数据源实现类(DriverManagerDataSource)
Spring本身也提供了一个简单的数据源实现类DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中。这个类实现了javax.sql.DataSource接口,但它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试或简单的独立应用中使用,因为它不需要额外的依赖类。
<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">bean</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">”dataSource”</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">”org.springframework.jdbc.datasource.DriverManagerDataSource”</span> <span class="hljs-attribute">destroy-method</span>=<span class="hljs-value">”close”</span>></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”driverClassName”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”</span> <span class="hljs-attribute">oracle.jdbc.driver.OracleDriver</span> ” /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”url”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”jdbc:oracle:thin:@localhost:1521:orcl</span> ” /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”username”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”root”</span> /></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”password”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”1234″</span> /></span> <span class="hljs-tag"></<span class="hljs-title">bean</span>></span> </code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>
4.获取JNDI数据源
如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。下面是一个简单的配置:
<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">bean</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">”dataSource”</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">”org.springframework.jndi.JndiObjectFactoryBean”</span>></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”jndiName”</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">”java:comp</span>/<span class="hljs-attribute">env</span>/<span class="hljs-attribute">jdbc</span>/<span class="hljs-attribute">oracle</span>”/></span> <span class="hljs-tag"></<span class="hljs-title">bean</span>></span> </code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>
通过jndiName指定引用的JNDI数据源名称。
在使用Spring的JDBCTemplate操作数据时,必须要往模板中注入哪些对象,同时模板要不要手动关闭数据库连接
注入DataSource数据源对象
不要手动关闭数据库连接,JdbcTemplate会帮我们关闭数据库连接
JdbcTemplate的QueryForList方法得到List集合,请问List集合中每一个对象为什么数据类型,在JSP页面使用EL表达式如何取值。
每一个对象为java.util.Map类型的数据,EL表达式里用取值
AOP的概念以及使用AOP机制有什么好处。Java编程中实现AOP有几种方式
AOP的概念是Aspected Oriented Programming 面身向方面编程。
好处:AOP将程序分解成各个方面或者说关注点。这使得可以模块化,相当横向上分切了。它可以解决OOP和过程化方法不能够很好解决的横切(crosscut)问题,如:事务、安全、日志等横切关注
实现AOP有几种方式:
-
Spring 1.2版本中通过ProxyFactoryBean来实现aop,即通过动态代理来实现的,Aspect必须继承MethodBeforeAdvice,MethodAfterAdvice等
-
Spring 2.0 AOP需要改的是FBI 这个类,而且它也不需要再实现某些接口
-
三使用标注(@AspectJ)实现AOP
Spring框架中的事务处理有几种。请分别阐述两者的区别
spring提供的事务管理可以分为两类:编程式的和声明式的。
编程式的,比较灵活,但是代码量大,存在重复的代码比较多;
声明式的比编程式的更灵活.
编程式事务的总接口是什么?使用编程式事务需要用到哪几个Spring事务的核心类对象
总接口
PlatformTransactionManager接口,
核心类:
<code class="hljs cs has-numbering">TransactionDefinition <span class="hljs-comment">//事务属性定义</span> TranscationStatus <span class="hljs-comment">//代表了当前的事务,可以提交,回滚。</span> PlatformTransactionManager核心接口的子类</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>
Spring的声明式事务能不能为普通的类产生代理接口,能不能在代码中使用Try/Catch能捕获异常,如果不可以,请说明原因
不能。Spring的声明式事务为实现类产生代理。不能在代码中使用Try/Catch,因为代码中捕获了异常,Spring容器捕获不了异常。
使用TransactionProxyFactoryBean为Bean产生事务物理时,需要哪几个属性值的设置:
<code class="hljs avrasm has-numbering"><bean name=”baseTransactionProxy” class=”org<span class="hljs-preprocessor">.springframework</span><span class="hljs-preprocessor">.transaction</span><span class="hljs-preprocessor">.interceptor</span><span class="hljs-preprocessor">.TransactionProxyFactoryBean</span>”></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
<code class="hljs xml has-numbering">⑴<span class="hljs-tag"><<span class="hljs-title">!–</span> 为事务代理<span class="hljs-attribute">bean</span>注入事务管理器–></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”transactionManager”</span> <span class="hljs-attribute">ref</span>=<span class="hljs-value">”transactionManager”</span>></span> <span class="hljs-tag"></<span class="hljs-title">property</span>></span> ⑵<span class="hljs-tag"><<span class="hljs-title">!–</span> 设置事务属性–></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”transactionAttributes”</span>></span> <span class="hljs-tag"><<span class="hljs-title">props</span>></span> ⑶<span class="hljs-tag"><<span class="hljs-title">!–</span> 所有方法采用<span class="hljs-attribute">required</span>的事务策略 <span class="hljs-attribute">-</span>></span> <span class="hljs-tag"><<span class="hljs-title">prop</span> <span class="hljs-attribute">key</span>=<span class="hljs-value">”*”</span>></span>PROPAGATION_REQUIRED<span class="hljs-tag"></<span class="hljs-title">prop</span>></span> <span class="hljs-tag"></<span class="hljs-title">props</span>></span> <span class="hljs-tag"></<span class="hljs-title">property</span>></span> ⑷<span class="hljs-tag"><<span class="hljs-title">!–</span> 为事务代理<span class="hljs-attribute">bean</span>设置目标<span class="hljs-attribute">bean</span> –></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”target”</span> <span class="hljs-attribute">ref</span>=<span class="hljs-value">”userDao”</span>></span> <span class="hljs-tag"></<span class="hljs-title">property</span>></span> <span class="hljs-tag"></<span class="hljs-title">bean</span>></span> ⑸<span class="hljs-tag"><<span class="hljs-title">!–</span> 目标<span class="hljs-attribute">bean</span> –></span> <span class="hljs-tag"><<span class="hljs-title">bean</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”userDao”</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">”com.dao.userDao”</span>></span> <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">”dataSource”</span> <span class="hljs-attribute">ref</span>=<span class="hljs-value">”dataSource”</span> /></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span> <span class="hljs-tag"></<span class="hljs-title">bean</span>> 转自:http://blog.csdn.net/xlgen157387/article/details/40071651 </span></code>