您的位置:首页 > 编程语言 > Java开发

带你走进spring的世界

2015-07-24 11:26 417 查看
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中的方法
切点为目标类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: