了解基本的Spring Framework和Total Flow

时间:2012-07-06 09:34:14

标签: spring spring-3 springsource spring2.x

我是Spring Framework的新手。请指导我对Spring的基本了解。我了解Java和JSF,但我对Struts或其他框架一无所知。我已经搜索了互联网并且能够下载PDF,但我不理解Spring流程,就像我理解JSF流程一样。请为我提供一个简单的方法来了解Spring的流程。

3 个答案:

答案 0 :(得分:9)

  • 转换1 - 用户通过提交表单/发送请求到服务器 点击超链接等。首先请求WEB.XML。
  • 转换2 - WEB.XML通过查看将请求路由到DispatcherServlet 在标签处。
  • Transition 3 - Inside DispatcherServlet, 首先'HandlerMapping'将请求移交给合适的'Controller'。
  • 转换4 - 控制器将请求映射到适当的Model类。所有 BUSINESS LOGIC在Model类中完成。
  • 转换5 - 如果是数据库 需要操作然后Model类将请求路由到合适的 DAO。所有数据库操作都应在DAO中执行。
  • Transition6 - 如果需要,则将属性附加到请求/会话/应用程序中 范围并返回Model。
  • 转换7 - 如果需要,请附加 属性到请求/会话/应用程序范围并返回 控制器。
  • 转换8 - 控制器只是将其返回到任何视图 (JSP / HTML等)。
  • 转换9 - 将JSP / Html视为用户。

Spring MVC Application Flow:

答案 1 :(得分:3)

我也是Spring Framework的新手。 到目前为止,以下文档是最基本的文档。我也正在读它,希望它可以帮到你。

Introduction to Spring Framework

答案 2 :(得分:2)

我也是Spring的新手,不久之前有类似的问题。首先,我想向你推荐Craig Walls的“Spring in Action”一书,我发现它非常有用且易于理解, http://www.tutorialspoint.com/spring/帮助我解决了很多问题。如果我理解你的问题,那么我们可以将“Spring的流程”划分为Spring IoC容器和Spring bean的生命周期。这里是关于Spring bean生命周期的exapmle的非常小的概述。一个bean在Spring中创建和销毁之间经历了几个步骤 容器。这些步骤是:

  1. 实例化
  2. 填充属性
  3. BeanNameAware的setBeanName()
  4. BeanFactoryAware的setBeanFactory
  5. ApplicationContextAware的setApplicationContext()
  6. 预初始化BeanPostProcessors
  7. InitializingBean的afterPropertiesSet()
  8. 调用自定义init-method
  9. 初始化后的BeanPostProcessors
  10. DisponsableBean`s destroy
  11. 调用自定义销毁方法
  12. 每个步骤都为自定义提供了自己的机会。这里有一些代码只是“跟踪”bean的生活:

    对于bean ClassA:

    public class ClassA implements InitializingBean, DisposableBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware{
    
        private String messageA;
    
        public ClassA() {
            System.out.println("ClassA: default constructor called.");
        }
    
        public void customInitMethod(){
            System.out.println("ClassA: customInitMethod() method called.");
        }
    
        public void customDestroyMethod(){
            System.out.println("ClassA: customDestroyMethod() method called.");
    
        }
    
        public String getMessageA() {
            System.out.println("ClassA: message get method called.");
            return messageA;
        }
    
        public void setMessageA(String message) {
            System.out.println("ClassA: message set method called.");
            this.messageA = message;
        }
    
        public void afterPropertiesSet() throws Exception {
            System.out.println("ClassA: afterPropertiesSet() called because InitializingBean interface.");
        }
    
        public void destroy() throws Exception {
            System.out.println("ClassA: destroy() called because DisposableBean interface.");
        }
    
        public void setApplicationContext(ApplicationContext arg0)
                throws BeansException {
            System.out.println("ClassA: application context set: " + arg0.getApplicationName());
        }
    
        public void setBeanFactory(BeanFactory arg0) throws BeansException {
            System.out.println("ClassA: beanFacrory set.");
        }
    
        public void setBeanName(String arg0) {
            System.out.println("ClassA: bean name set: " + arg0);
        }
    
    }public class ClassA implements InitializingBean, DisposableBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware{
    
        private String messageA;
    
        public ClassA() {
            System.out.println("ClassA: default constructor called.");
        }
    
        public void customInitMethod(){
            System.out.println("ClassA: customInitMethod() method called.");
        }
    
        public void customDestroyMethod(){
            System.out.println("ClassA: customDestroyMethod() method called.");
    
        }
    
        public String getMessageA() {
            System.out.println("ClassA: message get method called.");
            return messageA;
        }
    
        public void setMessageA(String message) {
            System.out.println("ClassA: message set method called.");
            this.messageA = message;
        }
    
        public void afterPropertiesSet() throws Exception {
            System.out.println("ClassA: afterPropertiesSet() called because InitializingBean interface.");
        }
    
        public void destroy() throws Exception {
            System.out.println("ClassA: destroy() called because DisposableBean interface.");
        }
    
        public void setApplicationContext(ApplicationContext arg0)
                throws BeansException {
            System.out.println("ClassA: application context set: " + arg0.getApplicationName());
        }
    
        public void setBeanFactory(BeanFactory arg0) throws BeansException {
            System.out.println("ClassA: beanFacrory set.");
        }
    
        public void setBeanName(String arg0) {
            System.out.println("ClassA: bean name set: " + arg0);
        }
    
    }
    

    对于CustomPostProcessor:

    public class CustomPostProcessor implements BeanPostProcessor {
    
        public Object postProcessBeforeInitialization(Object bean, String beanName)
                throws BeansException {
            System.out.println("CustomPostProcessor: beforeInitialization on: "
                    + beanName);
            return bean;
        }
    
        public Object postProcessAfterInitialization(Object bean, String beanName)
                throws BeansException {
            System.out.println("CustomPostProcessor: afterInitialization on: "
                    + beanName);
            return bean;
        }
    
    }
    

    在主类中我们创建ApplicationContext,获取bean并打印消息:

    public static void main(String[] args) {
            AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                    "META_INF/spring/app-context.xml");
    
            ClassA objA = (ClassA) context.getBean("classA");
    
            System.out.println(objA.getMessageA());
    
            context.registerShutdownHook();
        }
    

    在app-context.xml中我们有:

    <bean id="classA" class="ClassA" init-method="customInitMethod"
            destroy-method="customDestroyMethod">
        <property name="messageA" value="messagA: Hello Spring!" />
    </bean>
    
    <bean class="CustomPostProcessor" />
    

    据我所知,输出行以这种方式对应于生命周期阶段:

    • 1.Instantiate

    ClassA:默认构造函数。

    • 2.Populate properties

    ClassA:名为的消息集方法。

    • 3.BeanNameAware`ssetBeanName()

    ClassA:bean name set:classA

    • 4.BeanFactoryAware的setBeanFactory

    ClassA:beanFacrory set。

    • 5.ApplicationContextAware的setApplicationContext()

    ClassA:应用程序上下文集:

    • 6.Pre-initialization BeanPostProcessors

    CustomPostProcessor:beforeInitialization on:classA

    • 7.InitializingBean`safterPropertiesSet()

    ClassA:调用afterPropertiesSet()因为InitializingBean接口。

    • 8.Call custom init-method

    ClassA:调用customInitMethod()方法。

    • 9.Post-initialization BeanPostProcessors

    CustomPostProcessor:afterInitialization on:classA

    • 程序打印消息

    ClassA:调用消息get方法。 messagA:你好春天!

    • 10.DisponsableBean`s destroy

    ClassA:destroy()因为DisposableBean接口而调用。

    • 11.Call custom destroy-method

    ClassA:调用customDestroyMethod()方法。