springioc(di)和aop

     2022-03-18     281

关键词:

IOC(Inversion of Control,控制倒转)Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。

依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

AOP: Aspect-OrientedProgramming(面向切面编程)。AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录。AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。

 

IOC例子:

 

技术分享
package cqvie.com;
interface USB //USB接口
{
  public void insert();
  public String read();
  public void write(String s);
  public void pop();
}
USB.java
技术分享
package cqvie.com;
import org.springframework.stereotype.Component;
@Component
public class UDisk implements USB
{
  public void insert() {
      System.out.println("读入U盘");
      }
  public String read(){
      System.out.println("读取数据:"); 
      return "data";
  }
  public void write(String s){
      System.out.println("写入数据");
  }
  public void pop(){
      System.out.println("弹出U盘");
  }
}
UDisk.java
技术分享
package cqvie.com;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("theComputer")
public class Computer
{
  @Autowired
  //@Qualifier("UDisk")
  private USB usbDevice;
  public Computer(){ }  //这里不能构造USB设备
  public void saveData(String data) //实现智能设备的方法
  { //insert,write,pop
      usbDevice.insert();
      usbDevice.write(data);
      usbDevice.pop();
  }
  public void setUsbDevice(USB u){  usbDevice=u;  }   
}
Computer.java
技术分享
package cqvie.com;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
    public static void main(String[] args) {
          //Computer c=new Computer();
          //USB u=new UDisk();
          //c.setUsbDevice(u);
         ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
             Computer c=(Computer) ctx.getBean("theComputer");
             c.saveData("个人简历"); 
             
           Computer1 c1=new Computer1();
              HDD mp=new movHDD();
              c1.setMpDevice(mp);
              c1.saveData("移动硬盘");             
    }
}
test.java
技术分享
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="u1" class="cqvie.com.UDisk"></bean>
    <bean id="theComputer" class="cqvie.com.Computer">
        <property name="usbDevice" ref="u1"></property>
    </bean>
</beans>
applicationContext.xml

运行结果如下:

技术分享

 

AOP例子:

package org.proxy.interfaces;
//老板接口
public interface ILaoBan {
    public void kaiHui();
}
技术分享
package org.proxy.interfaces.impl;

import org.proxy.interfaces.ILaoBan;

//接口实现类
public class LaoBan implements ILaoBan{

    @Override
    public void kaiHui() {
       System.out.println("--->老板要开会");
    }
}
LaoBan
技术分享
package org.proxy.proxyClass;
import org.proxy.interfaces.ILaoBan;

public class MiShu implements ILaoBan{

    private ILaoBan laoban;
    public MiShu(ILaoBan laoban){
        this.laoban = laoban;
    }

    private void before() {    
        System.out.println("订机票");
        System.out.println("订酒店");
        System.out.println("送老板");
    }
    
    private void after() {
        System.out.println("订机票");
        System.out.println("退酒店");
        System.out.println("接老板");
    }
    
    @Override
    public void kaiHui() {
         before();
         laoban.kaiHui();
         after();
    }
    
}
MiShu
package test;

import org.proxy.interfaces.ILaoBan;
import org.proxy.interfaces.impl.LaoBan;
import org.proxy.proxyClass.MiShu;

public class Test {
    public static void main(String args[]){
        ILaoBan proxy_laoban = new MiShu(new LaoBan());
        proxy_laoban.kaiHui();
    }
}

运行结果如下:

技术分享

 

--------动态代理

技术分享
package org.proxy.interfaces;
//老板接口
public interface IBoss {
    public void kaiHui();  //老板要开会
}
IBoss.java
技术分享
package org.proxy.interfaces.impl;

import org.proxy.interfaces.IBoss;

//接口实现类
public class Boss implements IBoss{

    public void kaiHui()
    {
      System.out.println("老板要开会");
    }
}
Boss.java
技术分享
package org.proxy.proxyClass;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//动态代理类
public class DynamicProxy implements InvocationHandler{
    private Object obj;
    public Object bind(Object obj){
        this.obj=obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), 
                obj.getClass().getInterfaces(), this);
    }
    public Object invoke(Object proxy, Method method, Object[] objs)
            throws Throwable {
        Object result=null;
        try{
            before();
            result=method.invoke(obj, objs);
            after();
        }catch(Exception e){
            e.printStackTrace();
        }
        return result;
    }
    public void before(){
        System.out.println("订机票,订酒店,送老板");
        }
    
    public void after(){
        System.out.println("订机票,退酒店,接老板");
    }
}
DynamicProxy.java
技术分享
package test;
import org.proxy.interfaces.IBoss;
import org.proxy.interfaces.impl.Boss;
import org.proxy.proxyClass.DynamicProxy;


public class Test {
    public static void main(String args[]){
        DynamicProxy proxy=new DynamicProxy();
        IBoss boss=(IBoss) proxy.bind(new Boss());
        boss.kaiHui();
    }
}
Test.java

运行结果如下:

技术分享

 

springioc和di

 (1)什么是IOC(InversionOfControl控制反转)?对象之间的依赖关系应该由容器来建立。 (2)什么是DI(DependencyInjection依赖注入)?容器可以通过调用set方法或者构造器来建立对象之间的依赖关系。 注:IOC是目标,DI是手段。 (3)... 查看详情

spring学习---springioc容器的核心原理

【原文】Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国。IoC和DI的基本概念IoC(控制反转,英文含义:InverseofControl)是Spring容器的内核,AOP、事务等功能都是建立在此基础上的。从字面意思上可以把IoC... 查看详情

springioc原理(看完后大家可以自己写一个spring)

控制反转/依赖注入 最近,买了本Spring入门书:springInAction。大致浏览了下感觉还不错。就是入门了点。Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专注于Manning,但怀着崇敬的心情和激情通览了一遍。又一次... 查看详情

springioc和aop理解

springIOC1.目的:就是解决程序间的依赖关系2.原理:通过反射原理将我们控制层中的dao层、service层类以工厂模式在static代码块中实现加载后存放入map中,并实现单列。    查看详情

springioc和aop使用扩展

  Spring提供了设值注入,构造注入等依赖注入方式。  使用p命令空间可以简化属性注入的配置。  Spring提供的增强处理类型包括前置增强,异常抛出增强,环绕增强,最终增强等。  通过Schema形式将POJO的方法配置成切... 查看详情

springioc和aop啥设计模式

还是需要去了解,多看看书!IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。... 查看详情

springioc/di

IOC:反转控制(资源获取),之前开发是要什么就new什么,现在只需创建IOC容器,你要什么IOC都会给你,你只管接收。反转控制的对象是Bean,也就是对象DI:依赖注入,依赖容器把资源进行注入。依赖容器注入BeanIOC和DI其实是一... 查看详情

springioc/di

前言假设项目层次划分包括logic层和dao层,logic层调用dao层完成业务逻辑,dao层一般与数据库交互。定义两个组件,TestLogic和TestDao,分别操作接口ILogic和IDao,这样程序开发时需要考虑怎样管理这两个组件。传统方式这种方式中,... 查看详情

springioc(di)

 软件152刘昊翰一、IOC(DI) 概念IOC(InversionofControl,控制倒转)Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 DI—DependencyInjection,即“依赖注入”:组件之间依赖关系由容器在... 查看详情

springioc(di)

1什么是IOCIOC—InversionofControl,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。2IOC和DIDI—DependencyInjection,即&ld... 查看详情

springioc和aop

一.  IOC  1. 概念及原理  IOC:InversionofControl(控制反转)是一种设计思想,就是容器控制应用程序所需要的外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对象的创建及维护都不需要在应用程序中实现,将其交... 查看详情

springioc容器和aop

一、IOC(InversionofControl)容器:就是具有依赖注入(DependncyInjection)功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控... 查看详情

面试常问springioc,不得不会。

广义的IOCIoC(InversionofControl)控制反转,即“不用打电话过来,我们会打给你”。两种实现:依赖查找(DL)和依赖注入(DI)。IOC和DI、DL的关系(这个DL,Avalon和EJB就是使用的这种方式实现的IoC):DL已经被抛弃,因为他需要用户... 查看详情

springioc原理(看完后大家可以自己写一个spring)(代码片段)

控制反转/依赖注入 最近,买了本Spring入门书:springInAction。大致浏览了下感觉还不错。就是入门了点。Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专注于Manning,但怀着崇敬的心情和激情通览了一遍。... 查看详情

springioc和aop啥设计模式

参考技术A还是需要去了解,多看看书!IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的... 查看详情

一文解析springioc面试中常问的那些核心题!

广义的IOCIoC(InversionofControl)控制反转,即“不用打电话过来,我们会打给你”。两种实现:依赖查找(DL)和依赖注入(DI)。IOC和DI、DL的关系(这个DL,Avalon和EJB就是使用的这种方式实现的IoC):DL已经被抛弃,因为他需要用户... 查看详情

springsecurity

...了一组可以在Spring应用上下文中配置的Bean,充分利用了SpringIoC,DI(控制反转InversionofControl,DI:DependencyInjection依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安 查看详情

springioc(di)实验

软件151 张鑫栋一、IOC的意思是控件反转也就是由容器控制程序之间的关系,把控件权交给了外部容器,之前的写法,由程序代码直接操控,而现在控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。DI(Dependency... 查看详情