我认为spring 就是一个框架的集成器,通常使用spring 来管理action 层和DAO 层。Spring本身有很多的组件,比如:MVC、IOC、AOP、DaoSupport等等。IOC 本身也就是一个容器,它管理了所有的bean 和bean 之间的依赖关系。
IOC 也叫作控制反转,核心是BeanFactory。也就意味着IOC 是基于工厂模式设计的,同时这个工厂生产的bean 默认是单例的。如果想修改单例变成多实例,则需要修改bean 的scope属性,值是prototype。在没有使用IOC 以前,程序员需要自己在对应的类中new 相关依赖的对象。
比如UserAction依赖于UserService完成业务操作,而UserService又依赖于UserDAO完成数据库操作。所以需要在action 中new servcie,在service 中new DAO。这样的方式,是由程序员来管理了对象的生命周期和他们之间的依赖关系,耦合度很高,不利于程序的拓展。所以通过IOC 来管理bean 和依赖关系,可以解耦合。
我们将所有的action、service 和dao等类定义成IOC 的一个bean 组件,此时类的实例化就交给了IOC 的beanFactory,由工厂来负责实例化bean 的对象。IOC 有三种注入方式,属性注入、构造器注入和接口注入。接口注入只是spring 提出的设计,并没有具体的实现,所以常用的注入方式是属性注入。
属性注入就是在bean 的标签中,配置property 标签设定注入其他的bean。要求注入的bean在被注入的bean 中要存在一个全局的私有变量,并提供set 方法。这样就可以实现了依赖关系的注入。如果需要很多的bean,则直接注入就可以。如此操作会导致bean 标签的配置比较冗余复杂,所以spring 提供了autowried的自动装配方式,可以byName也可以byType。后续的版本中,spring 还提供了annotation 的方式,不需要再去定义多余的bean 标签,而是直接在对应的类上面声明注解就可以了。
常用的注解有:@controller、@Service、@Repository、@Component、@AutoWried、@Resource 等。除了IOC 以外,项目中通常通过AOP 来实现事务控制。AOP 就是面向切面编程,一般事务我们会控制在service 层,因为一个service 有可能会调用到多个DAO 层的方法,所以只有当一个service 方法执行成功后,再提交或者回滚事务。具体的配置方式是:在applicationContext.xml 中,配置aop:config标签,指定事务控制在service 层。除此还需要配置事务的管理类transactionManager,将这个transactionManager指定给事务管理的bean,并且配置事务的传播特性、隔离级别、回滚策略以及只读事务read-only等等。
Spring 默认的传播特性是如果当前上下文中存在事务则支持当前事务,如果没有事务,则开启一个新的事务。还有另外一个传播特性是在项目中经常用的,REQUIRES_NEW 这个配置,这个属性指的是总是开启一个新的事务,如果当前上下文中存在一个事务,则将当前的事务挂起后开启新的事务。
比如说:在一个本来是只读事务的操作中,想加入写操作的时候,就使用REQUIRES_NEW。关于事务的隔离级别,一般使用默认的配置提交读。也就是说,事务提交以后,才能访问这条数据。
除了事务控制以外,我们通常还可以使用AOP 去完成一些特殊操作,比如日志控制、安全校验等等。这么做的目的就是将功能操作的代码从实际的业务逻辑操作出分离出来。实现的方式是通过代理模式,真正完成操作的不是实际的业务对象而是代理对象。
代理模式有静态代理和动态代理,实现的方案也有两种,一种是基于JDK 的Proxy 代理类,另外一种则通过CGLIB 来实现。实现AOP 的方式,主要是在applicationContext中定义一个AOP 处理类,这就是一个普通的bean,在类中定义要执行的方法。然后去配置一个aop:config标签,在标签中定义aop:aspect切面,在切面中关联刚才定义好的处理类bean。然后在切面标签中配置aop:pointcut切入点,切入点就指的是在哪个类的哪个方法上加入代理事务,然后配置通知模型。
AOP 的通知模型中包含:前置通知、后置通知、最终通知、异常通知、环绕通知。这几个通知模型表示在方法执行以前、执行以后、最终执行、当遇到异常时执行以及前后都执行。在执行的AOP 切面方法中,可以通过JoinPoint连接点来获得当前被代理的对象以及被代理对象要执行的方法和方法的参数。
除了IOC 和AOP,我们经常还会使用到spring 的DaoSupport。主要是spring 提供了对hibernate 和myBatis等持久型框架的接口。比如HibernateDaoSupport,和sqlSessionDaoSupport。如果DAO 继承了HibernateDaoSupport,则需要在对应的bean 中注入sessionFactory。而sessionFactory是通过IOC 加载的。
来源:https://www.cnblogs.com/coder-wf/p/12517511.html