初学spring 关于IOC与AOP 使用的设计模式
2013-10-29 19:22
661 查看
www.springsource.org
Rod Johnson提出
interface21
改名为spring
IOC(Inverse of Control) 控制反转
以前程序中需要使用对象时,需要自己new一个,造成程序与对象的强耦合。
IOC 对象的生成交给spring容器完成
DI(Dependency Injection),依赖注入
IOC与DI一个意思,等价
AOP(Aspect-oriented Programming)面向切面编程
----------------------------------------------------------------------------------------------------------------------------------------------------------
Spring IOC使用了工厂模式
抽象产品:
Product.java
具体产品:
ConcreteProductA.java
ConcreteProductB.java
工厂类
Creator.java
具体应用
Client.java
----------------------------------------------------------------------
Spring AOP使用了代理模式
静态代理
抽象角色
Subject.java
代理角色 中介
ProxySubject.java
真实角色 房东
RealSubject.java
客户端调用 租客
Client.java
-----------------------------------------------------------------------------------------------------
动态代理:真实对象很多,不知道代理那个真实对象,动态代理代理的是接口
抽象角色
Subject.java
代理角色 中介
DynamicSubject.java
真实角色 房东
RealSubject.java
客户端调用 租客
Client.java
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
AOP核心本质:
/article/9392924.html
Rod Johnson提出
interface21
改名为spring
IOC(Inverse of Control) 控制反转
以前程序中需要使用对象时,需要自己new一个,造成程序与对象的强耦合。
IOC 对象的生成交给spring容器完成
DI(Dependency Injection),依赖注入
IOC与DI一个意思,等价
AOP(Aspect-oriented Programming)面向切面编程
----------------------------------------------------------------------------------------------------------------------------------------------------------
Spring IOC使用了工厂模式
抽象产品:
Product.java
package com.test.simplefactory; public abstract class Product { }
具体产品:
ConcreteProductA.java
package com.test.simplefactory; public class ConcreteProductA extends Product { }
ConcreteProductB.java
package com.test.simplefactory; public class ConcreteProductB extends Product { }
工厂类
Creator.java
package com.test.simplefactory; public class Creator { public static Product createProduct(String str) { if("A".equals(str)) { return new ConcreteProductA(); } else if("B".equals(str)) { return new ConcreteProductB(); } else { return null; } } }
具体应用
Client.java
package com.test.simplefactory; public class Client { public static void main(String[] args) { Product productA = Creator.createProduct("A"); System.out.println(productA.getClass().getName()); Product productB = Creator.createProduct("B"); System.out.println(productB.getClass().getName()); } }
----------------------------------------------------------------------
Spring AOP使用了代理模式
静态代理
抽象角色
Subject.java
package com.test.proxy; // 抽象角色 public abstract class Subject { abstract public void request(); }
代理角色 中介
ProxySubject.java
package com.test.proxy; //代理角色 public class ProxySubject extends Subject { private RealSubject realSubject; // 以真实角色作为代理角色的属性 public ProxySubject() { } public void request() // 该方法封装了真实对象的request方法 { preRequest(); if (realSubject == null) { realSubject = new RealSubject(); } realSubject.request(); // 此处执行真实对象的request方法 postRequest(); } private void preRequest() { // something you want to do before requesting } private void postRequest() { // something you want to do after requesting } }
真实角色 房东
RealSubject.java
package com.test.proxy; //真实角色:实现了Subject的request()方法 public class RealSubject extends Subject { public RealSubject() { } public void request() { System.out.println("From real subject."); } }
客户端调用 租客
Client.java
package com.test.proxy; //客户端调用 public class Client { public static void main(String[] args) { Subject sub = new ProxySubject(); sub.request(); } }
-----------------------------------------------------------------------------------------------------
动态代理:真实对象很多,不知道代理那个真实对象,动态代理代理的是接口
抽象角色
Subject.java
package com.test.dynamicproxy; //抽象角色(之前是抽象类,此处应改为接口): public interface Subject { public void request(); }
代理角色 中介
DynamicSubject.java
package com.test.dynamicproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //代理处理器 /** * 该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值; * 此外,在该类还实现了invoke方法,该方法中的 method.invoke(sub,args); * 其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象, args为执行被代理对象相应操作所需的参数。 * 通过动态代理类,我们可以在调用之前或之后执行一些相关操作 */ public class DynamicSubject implements InvocationHandler { private Object sub; public DynamicSubject() { } public DynamicSubject(Object obj) { sub = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before calling " + method); method.invoke(sub, args); System.out.println("after calling " + method); return null; } }
真实角色 房东
RealSubject.java
package com.test.dynamicproxy; //具体角色 public class RealSubject implements Subject { public RealSubject() { } public void request() { System.out.println("From real subject."); } }
客户端调用 租客
Client.java
package com.test.dynamicproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; //客户端 public class Client { public static void main(String[] args) throws Throwable { RealSubject rs = new RealSubject(); // 在这里指定被代理类 InvocationHandler ds = new DynamicSubject(rs); Class<?> cls = rs.getClass(); // 以下是一次性生成代理 Subject subject = (Subject) Proxy.newProxyInstance( cls.getClassLoader(), cls.getInterfaces(), ds); subject.request(); } }
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
AOP核心本质:
/article/9392924.html
相关文章推荐
- 初学spring 关于IOC与AOP 使用的设计模式
- 初学spring 关于IOC与AOP 使用的设计模式
- 死磕Spring AOP系列5:设计模式在AOP中的使用
- 使用XML,Spring,和struts以MVC为设计模式的分布式应用程序框架
- spring中aop.ioc的使用
- Spring中使用到的设计模式 - 策略模式
- Spring中使用到的九种设计模式
- 关于AOP和IOC的资料(Castle & Spring)
- spring ,ioc ,dependency injection 的设计模式
- Spring特点中关于DI,IOC及AOP的个人理解
- Spring中使用到的设计模式
- Spring面试,IoC和AOP的理解, @Transactional原理及使用
- 关于EJB使用中的一些设计模式的说明
- C/C++ 设计模式:关于使用typeid时要注意的问题
- 设计模式--spring源码中使用策略模式(Strategy Pattern)
- Spring--IoC--Bean的装配--工厂方法设计模式
- 关于使用Spring AOP 环绕性增强出现异常影响业务流程的问题
- 笔记——spring基本使用(控制反转IOC、面向切面编程AOP、声明式事务)
- 关于spring3使用AOP编程时需要引入哪些jar包的问题
- 关于spring的AOP使用