zoukankan      html  css  js  c++  java
  • 带你走进spring的世界

    spring有两大特性,其一为ioc,其二为aop

    1.ioc的理解

    ioc为依赖注入,他的好处就是把创建对象的权利交给spring去管理,这样的好处是 将应用程序中的对象解耦,传统的方式程序中的对象与对象引用的对象相互依赖,这样就使得依赖性增高,增加耦合性。

    di为控制反转,以前创建对象的权利由应用程序,现在交给spring来管理 从应用层到ioc这就为控制反转。

    ioc提供了两种容器:

    1)bean工厂(BeanFactory),采用工厂模式,负责创建和分发bean对象,bean工厂还参与到bean的生命周期中,调用用户定义的初始化方法和销毁方法。

      bean工厂延迟加载所有bean,知道getBean方法被调用时才创建bean

    2)应用上下文(ApplicationContext)建立在bean工厂之上,提供了系统架构服务。

      ApplicationContext提供了更多功能:
      文本信息解析工具,包括对国际化的支持
      载入文件资源的通用方法,如载入图片
      向注册为监听器的Bean发送事件
      是BeanFactory的完全超集
      ApplicationContext的三种常用实现:
      ClassPathXmlApplicationContext
      FileSystemXmlApplicationContext
      XmlWebApplicationContext
      如:ApplicationContext context=new ClassPathXmlApplicationContext(“xxx.xml”);
      可以通过ApplicationContext获得BeanFactory:

      BeanFactory factory=(BeanFactory)context;

    下边重点说一些bean的生命周期

      容器寻找Bean的定义信息并将其实例化
      使用依赖注入
      如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法
      如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法
      如果有BeanPostProcessor和Bean关联,那么它们的postProcessBeforeInitialzation()方法被调用
      如果Bean实现了InitializbaleBean接口,那么调用他的afterPropertiesSet方法
      如果Bean指定了init-method方法,他将被调用
      如果有BeanPostProcessor和Bean关联,那么它们的postProcessorAfterInitialization()方法被调用
      Bean已经实例化出来了,可以被应用使用了
      如果Bean实现了DisposableBean接口,destroy()方法被调用
      如果指定了定制的销毁方法,就调用这个方法
    首先BeanPostProcessor接口的作用是在处理bean的时候增加一些业务逻辑,InitializebaleBean接口和bean标签中的init-method是用于初始化bean,
    <bean id="" class="" init-method="init"/>

     

    关于bean的一些内容

      单例:通过getBean方法返回的对象总是一个对象
      多例:返回不同的对象
      <bean>的scope属性设置为singleton为单例,prototype为原型(多例)
       scope =singleton(单例,默认值) lazy-init才有效
      lazy-init=true 第一次getBean方法执行时创建bean
      vazy-init=false(默认值) 创建beanFactory时创建bean
      scope=prototype(多例) lazy-init无效 ,每次调getBean时都会创建bean
    在ioc容器中配置bean的方式
     1)直接配置bean
      <bean id="target" class="target"></bean>
     2)通过静态工厂
      <bean id="target" class="factory" factory-method=""></bean>
     3)通过实例工厂
      <bean id="target" factory-class="factoryId" factory-method=""></bean>
      <bean id="factoryId" class="factory"></bean>
    在bean中注入对象的方式
      1)利用set/get方法注入 
      <bean id="" class="">
        <property name="" ref=""></property>
      </bean>
     2).通过构造器注入
      <bean id="" class="">
        《constructor-arg index="" ref=""></constructor-arg>
      </bean>
     3).通过注解注入
    谈一下ioc中用到的一些设计模式和方式
    beanFactory采用的工厂模式,
    如果配置bean  scope =singleton,则bean采用的是单例模式
    在获取bean对象时采用的反射方式,通过反射类的class路径进行实例化,在该实例化过程中通过判断lazy-init来判断是生成目标对象还是代理对象,其中代理对象采用的是jdk代理。(hibernate中的懒加载采用的是cglib代理)
    简单说一下两者的区别:
    jdk代理为jdk自带的代理方式,通过实现InvocationHandler接口重写invoke方法,该代理类和目标类实现了同一接口。代理类生成方式是通过反射生成的。
    cglib代理通过显示MethodInteceptor接口重写inteceptor方法,该代理类为目标类的子类。
    随着jdk版本的不断升级,jdk代理的源码一部分被修改,jdk1.8中的效率已经远远大于cglib
    具体代码请看文档
     
     
    2.spring中的aop
    aop就是面向切面编程的意思,采用的是动态代理模式,进行对方法的拦截,可以动态的添加方法,实现了功能上的解耦,一般用于管理事务和日志记录。
    其中切面指的是一些你需要执行的公共方法,比如事务,日志
    连接点为目标类的集合,比如service中的方法
    切点为目标类
     
     
     
     
  • 相关阅读:
    git添加本地项目到git
    GitLab项目迁移到Gerrit
    flask一些资料
    openldap sshkey & 用户自定义属性
    openldap复制
    openldap主机访问控制(基于用户组)
    openldap主机访问控制(基于ip)
    openldap自定义schema
    openldap主机访问控制(基于hostname)
    openldap权限sudo
  • 原文地址:https://www.cnblogs.com/qingtianyu/p/4671454.html
Copyright © 2011-2022 走看看