Spring中AOP和IOC深入理解

spring框架

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性的角度而言,绝大部分Java应用都可以从Spring中受益。

◆目的:解决企业应用开发的复杂性

◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

◆范围:任何Java应用

Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。

Spring IOC:

控制反转(Inversion of Control,IOC),也被称为依赖注入(Dependency Injection,DI),是面向对象编程中的一种设计理念

依赖注入(spring只有set访问器注入和构造注入):

1.set访问器注入(打印机例子)

01.架构

02.引入的Jar包

03.接口及其实现类代码

package cn.ink;
/*
 * 墨盒接口
 */
public interface Ink {
    public String getColor();
}
package cn.ink;
/*
 * 灰色墨盒类
 */
public class GrayInk implements Ink{

    @Override
    public String getColor() {
        // TODO Auto-generated method stub
        return "灰色墨盒";
    }

}
package cn.ink;
/*
 * 彩色墨盒类
 */
public class ColorInk implements Ink{

    @Override
    public String getColor() {
        // TODO Auto-generated method stub
         return "彩色墨盒";
    }

}
package cn.paper;
/*
 * 纸张接口
 */
public interface Paper {
       public String getContent();

}
package cn.paper;
/*
 * A4纸张
 */
public class A4Paper implements Paper{

    @Override
    public String getContent() {
        // TODO Auto-generated method stub
        return  "一张淡定的A4纸";
    }

}
package cn.paper;
/*
 * B5纸张类
 */
public class B5Paper implements Paper{

    @Override
    public String getContent() {
        // TODO Auto-generated method stub
        return  "一张淡定的B5纸";
    }

}
package cn.printer;
/*
 * 打印机类
 */
import cn.ink.Ink;
import cn.paper.Paper;

public class Print {
        private Ink ink;
        private Paper paper;
         public void print(){
                System.out.println("用"+ink.getColor()+"在"+paper.getContent()+"上打印内容");
            }
        public Ink getInk() {
            return ink;
        }
        public void setInk(Ink ink) {
            this.ink = ink;
        }
        public Paper getPaper() {
            return paper;
        }
        public void setPaper(Paper paper) {
            this.paper = paper;
        }

}

04.Application.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

     <bean id="colorInk" class="cn.ink.ColorInk"/>
   <bean id="grayInk" class="cn.ink.GrayInk"/>
   <!--对Paper的初始化 -->
   <bean id="paper" class="cn.paper.A4Paper"/>
    <!-- 对打印机进行配置-->
    <bean id="printer" class="cn.printer.Print">
       <property name="ink" ref="colorInk"></property>
       <property name="paper" ref="paper"></property>
    </bean>

    </beans>
    

05.测试类

package cn.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.printer.Print;

public class PrintExam {
    @Test
    public void testprint(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Print printer = (Print)context.getBean("printer");
        printer.print();

    }

}

2.接口注入

3.构造注入

IOC定义和优点

IOC(Inverse of Control)控制反转是Spring容器的内核,AOP,声明式事务等功能都是在此基础上开花结果的。所谓IOC,就是通过容器来控制业务对象之间的依赖关系,而非传统实现中,由代码直接控制。这也就是“控制反转”概念所在;控制权由应用代码转到了外部容器,控制权的转移,就是反转。控制权转移带来的好处就是降低了业务对象之间的依赖程度。

二.Spring AOP:

关于为什么要使用AOP,下面这个例子可以很好的解释。首先,按照软件重构思想的理念,如果多个类中出现相同的代码,应该考虑定义一个共同的抽象类,将这些相同的代码提取到抽象类当中去。比如Horse、Pig、Camel这些对象都有run()、eat()方法,通过引入一个包含这两个方法抽象的Animal父类,Horse、Pig、Camel就可以通过集成Animal复用到run()和eat()方法。通过引入父类消除多个类中的重复代码的方式在大多数情况下是可行的,但世界并非永远这么简单,比如下面所示的景区管理业务类。

作者:郭无心
链接:http://www.zhihu.com/question/19993030/answer/77125144
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

import com.smart.dao.ViewPointDao;
import com.smart.dao.ViewSpaceDao;
import com.smart.domain.ViewSpace;

/**
 * 景区管理的服务类
 */
public class ViewSpaceService {

    private TransactionManager transManager;
    private PerformanceMonitor pmonitor;
    private ViewSpaceDao viewSpaceDao;
    private ViewPointDao viewPointDao;

    /**
     * 新增一个旅游景区
     *
     * @param viewSpace
     */
    public void addViewSpace(ViewSpace viewSpace) {
        pmonitor.start();
        transManager.beginTransaction();
        viewSpaceDao.addViewSpace(viewSpace);
        transManager.endTransaction();
        pmonitor.end();
    }

    /**
     * 删除某个景点
     *
     * @param pointId
     */
    public void deleteViewPoint(int pointId) {
        pmonitor.start();
        transManager.beginTransaction();
        viewPointDao.deleteViewPoint(pointId);
        transManager.endTransaction();
        pmonitor.end();
    }

}

其中pmonitor是方法性能监视代码,它在方法调用前启动,在方法调用返回前结束,并在内部记录性能监视的结果信息。其中transManager的代码是事务开始和事务提交的代码,我们发现我们的业务代码淹没在重复化非业务性的代码之中,性能监视和事务管理这些非业务性代码葛藤缠树搬包围着业务性代码。此时我们就不能通过抽象父类的方式消除以上的重复性代码,因为这些逻辑依附在业务类方法的流程中,它们不能够转移到其他地方去。于是产生了AOP这种思想.

优点:AOP主要是提供另外一种编程思路,可以把类似的行为抽离出来统一处理。

总结补充:

   IOC是解耦,提供一种构造对象的方式,使得一种功能能有多种实现,且不构成依赖。spring 的IOC的缺点:占用内存多、构造对象慢、启动慢。springAOP是提供一种基于spring框架的切面编程企业级解决方案,虽然这个已经很强大,但是依然还是没有aspectj强大,比如:目前还不支持流程切面。织入慢执行效率低、不支持new关键字创建的对象的切入,必须使用bean factory织入。

时间: 2024-12-25 20:06:26

Spring中AOP和IOC深入理解的相关文章

Spring中AOP和IOC

什么是DI机制? 依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色 需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在spring中 创建被调用者的工作不再由调用者来完成,因此称为控制反转.创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖注入. spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入. 设置注入的优点:直观

Spring中AOP主要用来做什么。Spring注入bean的方式。什么是IOC,什么是依赖注入

Spring中主要用到的设计模式有工厂模式和代理模式. IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例:IOC就是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是通过容器生成,同时,要是产生的是单例的bean,他还可以给管理bean的生命周期:通过注解配置或者进行xml配置实现,如@Controller,@Service,@Repository等注解配置 AOP:提供了事务管理的能力.AOP面向切

Spring中AOP简介与使用

Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操做.即通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. 为什么要用AOP? 日志记录,性能统计,安全控制,事务处理,异常处理等等.例如日志记录,在程序运行的某些节点上添加记录执行操作状态的一些代码,获取执行情况.而通过切面编程,我们将这些插入的内容分离出来,将它们独立

Spring中AOP原理,使用笔记

AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级服务. 系统级服务指的是:事务处理,日志记录,性能统计,安全控制,异常处理等,因为这些功能分散在程序的各个模块中,又是通用的,所以可以将它从业务逻辑中分离出来. 连接点(joinpoint):在连接点可以拦截方法的执行,在连接点前后织入上述的这些系统级服务(织入的就是通知). 切入点(pointcut)

Spring中AOP实例详解

Spring中AOP实例详解 需要增强的服务 假如有以下service,他的功能很简单,打印输入的参数并返回参数. @Service public class SimpleService { public String getName(String name) { System.out.println(get name is: + name); return name; } } 定义切面和切点 @Component @Aspect public class L ogAspect { // 定义切

理解Spring的AOP和Ioc/DI就这么简单

一.什么叫Ioc.DIIoc:Inversion of Control -- 控制反转 DI:Dependency Injection -- 依赖注入 其实这两个概念本质上是没有区别的,那我们先来看看什么叫做Ioc? 假设这么一个场景: 在A类中调用B类的方法,那么我们就称 A依赖B,B为被依赖(对象),相信这点大家能够理解. 传统做法: (1)直接在A(方法)中new出B类对象,然后调用B类方法 -- 硬编码耦合: (2)通过简单工厂获取B类对象,然后调用B类的方法 -- 摆脱了与B的耦合,却

Spring之Aop与Ioc

用Spring用了这么久,也该找个时间总结总结,这里我并没有把Aop和Ioc分开讲. 首先概述一下Spring,Spring是一款设计非常好的解耦框架,无侵入性,可以整合其它很多框架,比如常用的Struts,Hibernate,Mybatis或者Ibatis等,由此可以解决企业开发的复杂性,其核心的两个东西,就是AOP和IOC. Spring包含了7个模块,每个模块可以独立存在 每个模块的作用如下(这里参考的其它博客.原文地址:http://www.ibm.com/developerworks/

spring、AOP、IOC

对spring的理解是什么? spring: 1.开源框架: 2.IOC(控制反转),将类的创建和依赖关系写在配置文件里,由配置文件注入,实现了松耦合: 3.AOP将安全.事务等于程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,实现了按照方面编程,提高了复用性. spring是一个轻型容器,其核心是bean工厂,用以构造我们所需要的Model.在此基础之上,spring提供了aop的实现,用他来提供非管理环境下申明方式的事务.安全等服务:对bean工厂的扩张appli

《Java从入门到放弃》入门篇:spring中AOP的配置方式

spring中最核心的两个东东,一个IOC,一个AOP. AOP(Aspect-OrientedProgramming)面向方面编程,也可以叫面向切面编程. 从一个新人的角度可以这样来理解:一般软件中的功能,我们可以分为两大类,一类是业务功能,一类是系统功能. 业务功能是指这个软件必须要用到的,没有的话客户就不给钱的.比如淘宝APP,如果你只能在上面浏览商品而不能购物,那就说明业务功能太监了···. 系统功能主要是指与业务无关,没有这块内容也不影响软件使用的.比如日志管理.权限处理等. AOP主