`
wangyihust
  • 浏览: 438743 次
文章分类
社区版块
存档分类
最新评论

spring阶段性的一点感受

阅读更多

一直不能坐下来好好学习一下, 最近研究了spring framework, 一点感受:

1. IOC

传统方法:如果动态设置一个对象属性,可以借助JavaReflection机制完成,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标签接口。 取出就可使用的通知有 MethodInterceptorThrowsAdviceBeforeAdviceAfterReturningAdvice

    也可以自己写个拦截器,在实现自己的方法之前出发某个动作,执行一些处理。

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得启动要稍微延迟一些,如果在这时要做一些业务的操作,启动的前后顺序是有影响的。

那么在ContextLoaderListenerContextLoaderServlet中到底做了什么呢?
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是把WebApplicationContextXmlWebApplicationContext是默认实现类)放在了ServletContext中,ServletContext也是一个“容器”,也是一个类似Map的结构,而WebApplicationContextServletContext中的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.xmlAction的配置变成类似下面的样子
<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>

分享到:
评论

相关推荐

    spring阶段测试

    在IT行业中,Spring是Java企业级应用开发中最常用的框架之一,它提供了一种强大的方式来管理应用程序的复杂性,尤其是对于依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming, AOP)的...

    Spring Cloud 阶段性开发与测试

    本代码的主要内容为 Spring Cloud 阶段性开发与测试的源码包,主要分为以下几个模块: 001-项目基础模块; 002-接入Eureka注册中心以及Eureka集群; 003-接入Ribbon负载均衡客户端组件; 004-接入Feign负载均衡...

    spring阶段知识点总结xmind

    spring阶段知识点总结

    北大青鸟spring阶段项目-(青鸟在线投票系统)

    【青鸟在线投票系统】是北大青鸟在Spring阶段教学中的一个实践项目,旨在帮助学员深入理解和应用SSH(Struts2、Hibernate、Spring)三大框架技术。SSH是Java Web开发中常用的三大开源框架,它们各自负责不同的职责:...

    Spring源码分析第一阶段

    在Spring框架中,使用了多种设计模式来实现框架的灵活性和易用性: - **工厂模式**:Spring的BeanFactory就是一个典型的工厂模式应用,用于创建和管理Bean实例。 - **单例模式**:Spring的很多核心组件默认是单例的...

    spring cloud 体系版本选型,涉及spring cloud alibaba spring boot spring cloud

    在构建基于Spring Cloud的微服务架构时,版本选型是一个至关重要的步骤,它直接影响到系统的稳定性和可维护性。Spring Cloud作为一个广泛使用的微服务框架,其版本迭代迅速,每个版本都有其特定的功能特性和生命周期...

    Spring攻略(第二版)书籍源码

    5. **事务管理**:Spring提供了声明式和编程式的事务管理,确保业务操作的一致性。通过源码,我们可以学习如何设置事务边界和回滚策略。 6. **Spring Boot**:虽然标题没有提及,但Spring Boot简化了Spring应用的...

    spring2.0升级到spring3.0.5的开发包

    6. **Spring Expression Language (SpEL)**:Spring 3.0引入了强大的表达式语言SpEL,可以在运行时查询和操作bean的属性,增强了依赖注入的灵活性。 7. **AspectJ集成加强**:Spring 3.0进一步强化了与AspectJ的...

    spring v3.2源码

    个人觉得spring3.2的源代码比较好编译,没啥脾气,像我之前下载的spring的最新版本源代码,还有spring4.0的源代码,不论是使用jdk1.6还是1.7甚至是1.8编译都出问题,结果还是觉得spring3.2编译过程轻松一点,配合...

    idea spring assistant插件

    而且,由于其基于IntelliJ平台,因此兼容性良好,适用于Java、Groovy、Kotlin等多语言的Spring开发。 总的来说,Spring Assistant插件是Spring开发者在IntelliJ IDEA中不可或缺的工具。它通过增强IDE的Spring相关...

    北大青鸟spring阶段项目(FaceLook)

    北大青鸟spring阶段项目(FaceLook)源码

    spring6pdf详细讲解

    在 Spring 中, Bean 的生命周期包括实例化、依赖注入、初始化和销毁等阶段。开发者可以通过多种方式来管理 Bean 的生命周期,包括使用 @PostConstruct 和 @PreDestroy 等注解。 Spring 的 AOP 模块提供了多种方式...

    spring-cloud项目

    在IT行业中,Spring Cloud是一个非常重要的框架,它构建于Spring Boot之上,为开发分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...

    spring类库 spring类库

    6. **Spring Transaction**:事务管理模块提供了声明式和编程式的事务管理,确保了在分布式环境下的数据一致性。 7. **Spring Aspects**:此模块提供了AOP的扩展,支持自定义切面和通知类型,增强了Spring的面向切...

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    总的来说,将Spring Cloud Gateway与Spring Security相结合,可以构建出一套高效、安全的微服务认证系统,提高整体系统的稳定性和用户体验。这种整合不仅简化了微服务之间的交互,还增强了系统的安全性,是现代...

    spring4.0框架demo

    Spring框架作为Java企业级应用开发的基石,自推出以来就以其强大的功能和灵活性赢得了广大开发者的心。Spring 4.0作为其一个重要版本,引入了许多改进和新特性,使得开发效率进一步提升。本文将围绕一个基于Maven...

    SpringBatch+Spring+Mybatis+MySql (spring batch 使用jar)

    Spring Batch是一个轻量级的,完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统。Spring Batch以POJO和大家熟知的Spring框架为基础,使开发者更容易的访问和利用企业级服务。Spring Batch可以提供...

    Spring5.pdf

    Spring Cloud是基于Spring Boot的一系列工具集,旨在快速建立分布式系统中的一些常见模式(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态)。...

    spring_in_action-sixth-edition.pdf

    Spring 生命周期包括应用程序的初始化、启动、运行和关闭等阶段。 11. Spring 配置 Spring 配置是指使用 Spring 框架的配置机制,帮助开发者快速构建应用程序。Spring 配置包括使用配置文件、使用注解配置、使用 ...

    spring3.0.5 所有jar文件

    包含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...

Global site tag (gtag.js) - Google Analytics