javaEE面试宝典-Spring框架
1、Spring体系结构组成
Date Access/Integration 数据访问/集成
JDBC模块提供了删除冗余的JDBC相关编码的JDBC抽象层。
ORM模块为流行的对象关系映射API,包括JPA,JDO,Hibernate和iBatis,提供了集成层。
OXM模块提供了抽象层,它支持对JAXB,Castor,XMLBeans,JiBX和XStream的对象/XML映射实现。
Java消息服务JMS模块包含生产和消费的信息的功能。
事务模块Transactions为实现特殊接口的类及所有的POJO支持编程式和声明式事务管理。
Web(MVC/Remoting远程处理)
Web模块提供了基本的面向web的集成功能,例如多个文件上传的功能和使用servlet监听器和面向web应用程序的上下文来初始化IoC容器。
Web-MVC模块包含Spring的模型-视图-控制器(MVC),实现了web应用程序。
Web-Socket模块为WebSocket-based提供了支持,而且在web应用程序中提供了客户端和服务器端之间通信的两种方式。
Web-Portlet模块提供了在portlet环境中实现MVC,并且反映了Web-Servlet模块的功能。
AOP模块提供了面向切面的变成实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,它实现了应该分离的功能。
Aspects模块提供了与AspectJ的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。
Instrumentation模块在一定的应用服务器中提供了类instrumentation的支持和类加载器的实现。
Messaging模块为STOMP提供了支持作为在应用程序中WebSocket子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自WebSocket客户端的STOMP信息。
Core Container 核心容器
Beans模块提供BeanFactory,它是一个工厂模式的复杂实现。
Core模块提供了框架的基本组成部分,包括IoC和依赖注入功能。
Context上下文模块建立在由Core和Beans模块提供的坚实基础上,它是访问定义和配置任何对象的媒介。ApplicationContext接口是Context模块的重点。
SpEL表达式语言模块在运行时提供了查询和操作一个对象图的强大的表达式语言。
Test测试模块支持对具有JUnit或TestNG框架的Spring组件的测试。
2、Spring的理解
首先,spring是一个开源框架,Spring为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能。Spring是一个IOC和AOP容器框架。
Spring主要核心是:
(1)控制反转(IOC):传统的java开发模式中,当需要一个对象时,我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象,而在Spring开发模式中,Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring为我们提供的对象即可,这就是控制反转的思想。实例化一个java对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法,当使用spring时我们就不需要关心通过何种方式实例化一个对象,spring通过控制反转机制自动为我们实例化一个对象。
(2)依赖注入(DI):Spring使用Java Bean对象的Set方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。
(3)面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
在Spring中,所有管理的对象都是JavaBean对象,而BeanFactory和ApplicationContext就是spring框架的两个IOC容器,现在一般使用ApplicationContext,其不但包含了BeanFactory的作用,同时还进行更多的扩展。
3、Spring Bean生命周期
1.Spring容器 从XML 文件中读取Bean的定义,并实例化Bean。
2.Spring根据Bean的定义填充所有的属性。
3.如果Bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。
4.如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。
5.如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
6.如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
7.如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。
8.如果bean实现了 DisposableBean,它将调用destroy()方法。
注意:
有两个重要的bean 生命周期方法,第一个是setup() , 它是在容器加载bean的时候被调用。第二个方法是 teardown() 它是在容器卸载类的时候被调用。
The bean 标签有两个重要的属性init-method和destroy-method。使用它们你可以自己定制初始化和注销方法。它们也有相应的注解@PostConstruct和@PreDestroy。
4、Spring 中的设计模式
4、Spring 中的设计模式
1.代理模式—Spring中两种代理方式,若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理,若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
2.单例模式—在spring配置文件中定义的bean默认为单例模式。
3.模板方法模式—用来解决代码重复的问题。
比如: RestTemplate, JmsTemplate, JpaTemplate。
4.前端控制器模式—Srping提供了DispatcherServlet来对请求进行分发。
5.视图帮助(View Helper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
6.依赖注入—贯穿于BeanFactory/ApplicationContext接口的核心理念。
7.工厂模式—在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。Spring中使用BeanFactory用来创建对象的实例。
5、Spring注解
Spring在2.5版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代XML方式的bean描述,可以将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。
注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。
<beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans>
在 <context:annotation-config/>标签配置完成以后,就可以用注解的方式在Spring中向属性、方法和构造方法中自动装配变量。
几种比较重要的注解类型:
@Required:该注解应用于设值方法。
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。
JSR-250 Annotations: Spring支持基于JSR-250 注解的以**解,@Resource、@PostConstruct 和 @PreDestroy。
6、Spring事务
Spring支持两种类型的事务管理:
1.编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
2.声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
Spring事务配置示例(使用tx标签配置的拦截器)
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置Advice通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 配置切点切面 -->
<aop:config>
<aop:pointcut id="interceptorPointCuts"
expression="execution(* com.bluesky.spring.dao.*.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts" />
</aop:config>
免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。