zoukankan      html  css  js  c++  java
  • Ioc和Aop底层原理

    Spring中主要用到的设计模式有工厂模式和代理模式。

    IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例;IOC就是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是通过容器生成,同时,要是产生的是单例的bean,他还可以给管理bean的生命周期;通过注解配置或者进行xml配置实现,如@Controller,@Service,@Repository等注解配置

    AOP:面向切面编程,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统,从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑,比如安全,日志,事务功能;也可以通过注解配置或者进行xml配置实现,如@Aspect ,@Before,@After等或<aop config/>注解配置;主要是JDK动态代理和cglib动态代理

    Spring的AOP和IOC都是为了解决系统代码耦合度过高的问题,使代码重用度高,易于维护。

    一、Ioc :通过Spring配置来创建对象,而不是new的方式

    两种方法:配置文件,注解

    1.Ioc底层原理

    (1)xml配置文件

    (2)dom4j解析

    (3)工厂设计模式

    (4)反射

    步骤:

    第一步:创建类的.xml文件

    <bean id="userService" class="....."/>

    第二步:创建一个工厂类:使用dom4j解析配置文件+反射

    public class UserFactory{
        public static UserService getUserService(){
    
            //使用dom4j解析配置文件
            //根据id值userService,得到id值对应class的属性值
            String classValue="userService"//使用反射来创建class对象
            Class class=Class.forName(classValue);
            UserService service=class.newInstatnce();
            return service;
        }
    } 

    通过IOC,我们如果改掉UserService类,只需更改bean里面的配置属性就行了,降低了类之间的耦合度

    2.Ioc和DI的区别:

    (1)Ioc:控制反转,把创建对象交给Spring进行配置

    (2)DI:依赖注入,向类里面的属性中设置值

    (3)二者关系:DI不能单独存在,要在Ioc基础之上来完成操作,即要先创建对象才能注入属性值。

    3.Spring整合web项目原理

    (1)加载Spring核心配置文件

      ApplicationContext context=new ClassPathXmlApplicationContext(“bean1.xml”);

      加载文件要new一个对象,每次访问都要new对象加载配置,效率低

    (2)实现思想:吧加载配置文件和创建对象过程,在服务器启动时候完成

    (3)实现原理:

      a) ServletContext对象

      b) 监听器(ServletContextListener接口)

      c) 具体使用:

        i. 服务器启动时,为每个项目创建一个ServletContext对象

        ii. 使用监听器可以监听到ServletContext在何时创建

        iii. 在监听器的,ServletContextListener接口的contextInitialized()方法方法中加载Spring配置文件(括号1中代码),创建对象。

        iv. 把创建出来的对象放到ServletContext域对象里面(setAttribute方法)

        v. 获取对象时,从ServletContext域对象中得到(getAttribute方法)

    二、Aop:面向切面,扩展功能时不通过源代码,横向抽取机制。

    底层使用动态代理方式---增强方法

    具体分两种情况:

    (1)有接口的情况:创建接口的实现类的代理对象,jdk动态代理(由java的反射机制实现,对实现了接口的类产生代理,需要实现 InvocationHandler 接口,并实现 invoke() 方法)

    (2)没有接口的情况:创建User类的子类的代理对象,cglib动态代理(借助 asm 来实现的,对没有实现接口的类产生代理,生产子类对象,需要实现 MethodInterceptor 接口,实现 intercepter 方法)。子类可以通过super调用父类方法

    增强:before,after,(前置,后置,异常,最终,环绕增强)

  • 相关阅读:
    ISEX安全期计算 V4.0 多国语言版女性安全期避孕计算实用工具软件
    FireARP防火墙 V3.1防局域网ARP攻击的软件
    asp.net页面字段绑定概述
    C# 删除、遍历指定目录下的所有指定文件、文件夹
    加入收藏、设为首页常用脚本
    分页加载数据Demo
    学习fragment的生命周期
    widget控件
    Menu菜单的代码和xml的创建
    WebView控件
  • 原文地址:https://www.cnblogs.com/liuqing576598117/p/11206251.html
Copyright © 2011-2022 走看看