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 ...
随机推荐
- 【剑指Offer】20、包含min函数的栈
题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 解题思路: 使用两个stack,一个为数据栈,另一个为辅助栈.数据栈 ...
- [Ynoi2016]掉进兔子洞 题解
题面传送门:https://www.luogu.org/problemnew/show/P4688 (温馨提示,请直接翻至题目描述部分) 1e5的数据范围,以及对区间每个权值出现次数取min此类主席树 ...
- swift-导航栏添加自定义返回按钮
//1.添加返回按钮 func addBackBtn(){ let leftBtn:UIBarButtonItem=UIBarButtonItem(title: "返回", sty ...
- webstorm中vue项目--运行配制
## npm搭建的项目,需要运行npm run dev来启动 webstorm作为一款优秀的编辑器,通过配置运行设置,达到一键运行 1.添加node.js配置 2.configuration-> ...
- pause、jobs、setitimer(2)、system v ipc(day12)
一.pause()的使用 #include <unistd.h> int pause(void); 功能:等待信号的到来 返回值: - 错误 errno被设置 只有在信号处理函数执行完毕的 ...
- UVA1339 - Ancient Cipher 【字符串+排序】【紫书例题4.1】
题意:给定两个字符串,你可以替换或者置换,替换是指可以将相同的字母替换为任意一个字母,而置换是指将字母替换为下一个,如A替换B,B替换为C,,,Z替换为A.你需要判断是否可以通过一系列操作使两个字符串 ...
- [luogu4159 SCOI2009] 迷路(矩阵乘法)
传送门 Solution 矩阵乘法新姿势qwq 我们知道当边权为1是我们可以利用矩阵快速幂来方便的求出路径数 那么对于边权很小的时候,我们可以将每个点都拆成若干个点 然后就将边权不为1转化为边权为1了 ...
- centos最小化系统安装VMware tool
1.先执行命令创建环境 yum -y install update yum -y install gcc kernel-headers kernel-devel 2.然后重启reboot 3.挂载,解 ...
- Spring Boot上传文件
我们使用Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0. <parent> <groupId>org.springframework.boot& ...
- 一见钟情Sublime
打开 preferences -> Setting-User,加入下面代码 { "font_size": 14, "ignored_packages": ...