一直不能坐下来好好学习一下, 最近研究了spring framework, 一点感受:
1. IOC
传统方法:如果动态设置一个对象属性,可以借助Java的Reflection机制完成,invoke()激活返回调用
Class cls = Class.forName("com.eking.User");
Method mtd = cls.getMethod("setName",new Class[]{String.class});
Object obj = (Object)cls.newInstance();
mtd.invoke(obj,new Object[]{"Erica"});
return obj;
在spring中, 面向接口编程,动态代理机制:BeanWrapper, BeanFactory,ApplicationContext提供了管理javabean的包装器,所有的一切都在容器中配置,dependency injection.
也可以不提供接口,CGLib与Dynamic Proxy的代理机制基本类似,只是其动态生成的代理对象并非某接口的实现,而是针对目标类扩展的子类。换句话说,Dynamic Proxy返回的动态代理类,是目标类所实现的接口的另一个实版本,它实现了对目标类的代理(如同UserDAOProxy与UserDAOImp的关系)。而CGLib返回的动态代理类,则是目标代理类的一个子类(代理类扩展了UserDAOImp类)。
2. AOP
各种通知类型有MethodInterceptor (来自AOP联盟的拦截器API)和定义在org.springframework.aop包中的 通知接口。所有通知必须实现org.aopalliance.aop.Advice标签接口。 取出就可使用的通知有 MethodInterceptor、 ThrowsAdvice、 BeforeAdvice和 AfterReturningAdvice。
也可以自己写个拦截器,在实现自己的方法之前出发某个动作,执行一些处理。
3. WebApplicationContext
1) web.xml 中通过声明监听器接口 或servlet类加载
通过:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener-->
或:
<servlet>
<servlet-name>SpringContextServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Web 容器会自动加载 /WEB-INF/applicationContext.xml 初始化 ApplicationContex t实例;
也可以通过
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml</param-value>
</context-param>
使 Web 容器加载指定名称路径的 Spring 配置文件。
我个人认为Listerner要比Servlet更好一些,因为Listerner监听应用的启动和结束,而Servlet得启动要稍微延迟一些,如果在这时要做一些业务的操作,启动的前后顺序是有影响的。
那么在ContextLoaderListener和ContextLoaderServlet中到底做了什么呢?
以ContextLoaderListener为例,我们可以看到
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
protected ContextLoader createContextLoader() {
return new ContextLoader();
}
ContextLoader是一个工具类,用来初始化WebApplicationContext,其主要方法就是initWebApplicationContext,我们继续追踪initWebApplicationContext这个方法(具体代码我不贴出,大家可以看Spring中的源码),我们发现,原来ContextLoader是把WebApplicationContext(XmlWebApplicationContext是默认实现类)放在了ServletContext中,ServletContext也是一个“容器”,也是一个类似Map的结构,而WebApplicationContext在ServletContext中的KEY就是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,我们如果要使用WebApplicationContext则需要从ServletContext取出,Spring提供了一WebApplicationContextUtils类,可以方便的取出WebApplicationContext,只要把ServletContext传入就可以了。
2) struts-config.xml 中通过插件加载
通过
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml,
/WEB-INF/action-servlet.xml"/>
</plug-in>
来加载 Spring 配置文件。
在struts-config.xml中Action的配置变成类似下面的样子
<action attribute="aForm" name="aForm" path="/aAction" scope="request" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="forward" path="forward.jsp" />
</action>
别急,我们还是来看一下ContextLoaderPlugIn的源码(源码不再贴出),我们可以发现,原来ContextLoaderPlugIn仍然是把WebApplicationContext放在ServletContext中,只是这个KEY不太一样了,这个KEY值为ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX+ModuleConfig.getPrefix()(具体请查看源代码),这下好了,我们知道了WebApplicationContext放在哪里,只要我们在Web应用中能够取到ServletContext也就能取到WebApplicationContext了
4.Struts+spring+hibernate
spring live中myusers,一个3层架构的web 程序,通过一个Action 来调用业务代理,再通过它来回调 DAO类。下面的流程图表示了MyUsers是如何工作的。数字表明了流程的先后顺序,从web层(UserAction)到中间层(UserManager),再到数据层(UserDAO),然后返回。
Spring是AOP, UserManager和UserDAO都是接口.
1) web层(UserAction) :调用中间层的接口方法,将UserManager作为属性注入
2) 中间层(UserManager):将UserDAO作为属性注入,其实现主要是调用数据层接口的一些方法; 它处于事务控制中
3) 数据层(UserDAO):实现类继承HibernateDaoSupport类,在该类中可以调用getHibernateTemplate()的一些方法执行具体的数据操作。
spring配置部分文件:
<bean id="userDAO" class="com.eking.entity.UserDAOImp">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="userManagerTarget" class="com.eking.service.UserManagerImp">
<property name="userDAO"><ref local="userDAO"/></property>
</bean>
<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="userManagerTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED</prop>
<prop key="is*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean name="/login" class="com.eking.struts.action.LoginAction" singleton="false">
<property name="userManager">
<ref local="userManager" />
</property>
</bean>
spring live中myusers,一个3层架构的web 程序,通过一个Action 来调用业务代理,再通过它来回调 DAO类。下面的流程图表示了MyUsers是如何工作的。数字表明了流程的先后顺序,从web层(UserAction)到中间层(UserManager),再到数据层(UserDAO),然后返回。
Spring是AOP, UserManager和UserDAO都是接口.
1) web层(UserAction) :调用中间层的接口方法,将UserManager作为属性注入
2) 中间层(UserManager):将UserDAO作为属性注入,其实现主要是调用数据层接口的一些方法; 它处于事务控制中
3) 数据层(UserDAO):实现类继承HibernateDaoSupport类,在该类中可以调用getHibernateTemplate()的一些方法执行具体的数据操作。
spring配置部分文件:
<bean id="userDAO" class="com.eking.entity.UserDAOImp">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
分享到:
相关推荐
在IT行业中,Spring是Java企业级应用开发中最常用的框架之一,它提供了一种强大的方式来管理应用程序的复杂性,尤其是对于依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming, AOP)的...
本代码的主要内容为 Spring Cloud 阶段性开发与测试的源码包,主要分为以下几个模块: 001-项目基础模块; 002-接入Eureka注册中心以及Eureka集群; 003-接入Ribbon负载均衡客户端组件; 004-接入Feign负载均衡...
spring阶段知识点总结
【青鸟在线投票系统】是北大青鸟在Spring阶段教学中的一个实践项目,旨在帮助学员深入理解和应用SSH(Struts2、Hibernate、Spring)三大框架技术。SSH是Java Web开发中常用的三大开源框架,它们各自负责不同的职责:...
在Spring框架中,使用了多种设计模式来实现框架的灵活性和易用性: - **工厂模式**:Spring的BeanFactory就是一个典型的工厂模式应用,用于创建和管理Bean实例。 - **单例模式**:Spring的很多核心组件默认是单例的...
在构建基于Spring Cloud的微服务架构时,版本选型是一个至关重要的步骤,它直接影响到系统的稳定性和可维护性。Spring Cloud作为一个广泛使用的微服务框架,其版本迭代迅速,每个版本都有其特定的功能特性和生命周期...
5. **事务管理**:Spring提供了声明式和编程式的事务管理,确保业务操作的一致性。通过源码,我们可以学习如何设置事务边界和回滚策略。 6. **Spring Boot**:虽然标题没有提及,但Spring Boot简化了Spring应用的...
6. **Spring Expression Language (SpEL)**:Spring 3.0引入了强大的表达式语言SpEL,可以在运行时查询和操作bean的属性,增强了依赖注入的灵活性。 7. **AspectJ集成加强**:Spring 3.0进一步强化了与AspectJ的...
个人觉得spring3.2的源代码比较好编译,没啥脾气,像我之前下载的spring的最新版本源代码,还有spring4.0的源代码,不论是使用jdk1.6还是1.7甚至是1.8编译都出问题,结果还是觉得spring3.2编译过程轻松一点,配合...
而且,由于其基于IntelliJ平台,因此兼容性良好,适用于Java、Groovy、Kotlin等多语言的Spring开发。 总的来说,Spring Assistant插件是Spring开发者在IntelliJ IDEA中不可或缺的工具。它通过增强IDE的Spring相关...
北大青鸟spring阶段项目(FaceLook)源码
在 Spring 中, Bean 的生命周期包括实例化、依赖注入、初始化和销毁等阶段。开发者可以通过多种方式来管理 Bean 的生命周期,包括使用 @PostConstruct 和 @PreDestroy 等注解。 Spring 的 AOP 模块提供了多种方式...
在IT行业中,Spring Cloud是一个非常重要的框架,它构建于Spring Boot之上,为开发分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
6. **Spring Transaction**:事务管理模块提供了声明式和编程式的事务管理,确保了在分布式环境下的数据一致性。 7. **Spring Aspects**:此模块提供了AOP的扩展,支持自定义切面和通知类型,增强了Spring的面向切...
总的来说,将Spring Cloud Gateway与Spring Security相结合,可以构建出一套高效、安全的微服务认证系统,提高整体系统的稳定性和用户体验。这种整合不仅简化了微服务之间的交互,还增强了系统的安全性,是现代...
Spring框架作为Java企业级应用开发的基石,自推出以来就以其强大的功能和灵活性赢得了广大开发者的心。Spring 4.0作为其一个重要版本,引入了许多改进和新特性,使得开发效率进一步提升。本文将围绕一个基于Maven...
Spring Batch是一个轻量级的,完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统。Spring Batch以POJO和大家熟知的Spring框架为基础,使开发者更容易的访问和利用企业级服务。Spring Batch可以提供...
Spring Cloud是基于Spring Boot的一系列工具集,旨在快速建立分布式系统中的一些常见模式(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态)。...
Spring 生命周期包括应用程序的初始化、启动、运行和关闭等阶段。 11. Spring 配置 Spring 配置是指使用 Spring 框架的配置机制,帮助开发者快速构建应用程序。Spring 配置包括使用配置文件、使用注解配置、使用 ...
包含spring 3.0.5的所有jar文件: org.springframework.aop-3.0.5.RELEASE.jar org.springframework.asm-3.0.5.RELEASE.jar org.springframework.aspects-3.0.5.RELEASE.jar org.springframework.beans-3.0.5.RELEASE...