spring IOC(DI)和AOP
软件152谭智馗
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
运行结果如下:

spring IOC(DI)和AOP的更多相关文章
- Spring IOC/DI和AOP原理
一 IOC/DI 1. 概念机原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...
- Spring IOC/DI和AOP原理(转发:https://www.cnblogs.com/techroad4ca/p/5770073.html)
一 IOC/DI 1. 概念及原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...
- Spring基础[IOC/DI、AOP]
一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...
- spring+IOC+DI+AOP优点分析(一)
Spring是什么: Spring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于sprin ...
- Spring+IOC(DI)+AOP概念及优缺点
Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...
- 黑马-Spring(IOC&DI) AOP
IOC(控制翻转) 概念 把对象的创建.初始化.销毁等工作交给spring容器来做 案例 环境 步骤 1. 写一个HelloWorld类 2. 写一个配置文件 把hello类放到spring容 ...
- spring IOC DI AOP MVC 事务, mybatis 源码解读
demo https://gitee.com/easybao/aop.git spring DI运行时序 AbstractApplicationContext类的 refresh()方法 1: pre ...
- 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)
一. mybatis的高级映射 1 单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...
- spring ioc DI 理解
下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversi ...
随机推荐
- windows控制台(console)乱码
在cmd中输入 CHCP 65001,实操有效.记录一下 永久设置,代码如下: Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Cons ...
- Perl PPM安装模块
介绍一下如何使用PPM(Perl Package Manager)安装模块(必须安装了ActivePerl).打开PPM,我们看到的界面是这样的: 我们看到第二行是工具栏,从左到右,第一个是查看仓 ...
- 51nod1085 背包问题【动态规划】
在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数 ...
- CSS 利用transform达到居中效果
<body> <div class="center"> .... </div> </body> 让left和top都是50%,这在水 ...
- SSH(远程登录)
在linux中SSH服务对应两个配置文件: ssh特点:在传输数据的时候,对文件加密后传输. ssh作用:为远程登录会话和其他网络服务提供安全性协议. ssh小结: 1.SSH是安全的加密协议,用于远 ...
- Drop a database in MongoDB
http://www.linuxask.com/questions/drop-a-database-in-mongodb Drop a database in MongoDB Answer: Assu ...
- 0209利用innobackupex进行简单数据库的备份
利用innobackupex进行简单数据库的备份yum install perl-DBIyum install perl-DBD-MySQLyum install perl-Time-HiResyum ...
- asp.net--webconfg指南
原文链接 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. ...
- [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp
最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...
- spring 获取对象方式
1 通过配置文件注入 1.配置文件里配置注入信息 2.class中加入注解的接口(set get. 构造函数等) 2.通过注解方式获得 1. 在class中对方法加入注解信息 (类标示 :@Servi ...