控制反转(Inversion of Control)大大降低了代码的耦合性。实例是由容器注入到对象中,而不是主动创建的。
IoC将对象生成放置在配置文件中,只需要修改配置文件就可以更换实现类。
实现简单的IOC
public interface Action { public String execute(String str); } public class UpperAction implements Action { private String message; public String getMessage() { return message; } public void setMessage(String string) { message = string; } public String execute(String str) { return (getMessage() + str).toUpperCase(); } } public class LowerAction implements Action { private String message; public String getMessage() { return message; } public void setMessage(String string) { message = string; } public String execute(String str) { return (getMessage() + str).toLowerCase(); } }
public class ActionFactory { public static Action getAction(String actionName) { Properties prop = new Properties(); try { ClassLoader loader = ActionFactory.class.getClassLoader(); prop.load(loader.getResourceAsStream("config.properties")); String actionImplName = (String) prop.get(actionName); String actionMessage = (String) prop.get(actionName + "_msg"); Class cl = Class.forName(actionImplName); Object obj = cl.newInstance(); // 反射机制获取域参数并为域参数值注入值 Field[] fields = cl.getDeclaredFields(); Field field = fields[0]; String fieldName = field.getName(); String firstLetter = fieldName.substring(0, 1).toUpperCase(); String setMethodName = "set" + firstLetter + fieldName.substring(1); Method setMethod = cl.getMethod(setMethodName, new Class[] { field.getType() }); setMethod.invoke(obj, new Object[] { actionMessage }); return (Action) obj; } catch (Exception e) { e.printStackTrace(); } return null; } }
config.properties配置文件:
TheAction=test.UpperAction
TheAction_msg=Hello
public class TestAction { public static void main(String[] args) { Action action = ActionFactory.getAction("TheAction"); System.out.println(action.execute(“ World ")); } }
输出结果:
HELLO WORLD
设计模式—代理模式
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户端不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理的常见应用就是对遗留系统的封装。
代理模式一般涉及到的角色有
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理对象角色一般内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
真实角色:代理角色所代表的真实对象,是最终要引用的对象
代理模式-原理图
代理类和被代理类均派生自同一个接口,被代理类对象作为代理类构造函数参数的方式将代理权交出,代理类有接口中定义的方法,还有其他事务处理方法。
代理模式-时序图
代理模式-例子
public interface UserDAO { public void saveUser(User user); }
public class UserDAOImpl implements UserDAO { @Override public void saveUser(User user) { System.out.println("save a user," + "Id:" + user.getId() + ",Name:" + user.getName()); } }
public class UserDAOProxy implements UserDAO { private UserDAO userDAO; public UserDAOProxy(UserDAO userDAO) { this.userDAO = userDAO; } @Override public void saveUser(User user) { startTransaction(); userDAO.saveUser(user); endTransaction(); } private void startTransaction() { System.out.println("start transaction."); } private void endTransaction() { System.out.println("end transaction."); } }
public class User { private Integer id; private String name; public User(Integer id, String name) { super(); this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Test { public static void main(String[] args) { UserDAO userDAO = new UserDAOProxy(new UserDAOImpl()); userDAO.saveUser(new User(1, "Peter")); } }
输出:
start transaction.
save a user,Id:1,Name:Peter
end transaction.
由以上代码可以看出,客户实际需要调用的是UserDAOImpl类的saveUser()方法,现在用UserDAOProxy来代理UserDAOImp类,同样达到目的,同时还进行了事务的处理,当然还可以处理一些其他问题,如安全、日志等。
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。(待续)
相关推荐
利用Java的反射与代理实现IOC模式 在Java中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的...
Java的反射与代理实现IOC模式,供大家一起参考学习。
Java Spring代理模式AOP-IOC分析
java Spring代理模式AOP-IOC结合
利用java中的反射机制和代理机制,实现IOC模式,有详细的代码和实例
答:CORBA标准是公共对象请求代理结构,用途为:用不同的程序设计语言书写,在不同的进程中运行,为不同的操作系统开发。 xml解析技术? 答:常用的DOM、SAX等 DOM:处理大型文件时性能下降的非常厉害,适合对xml...
代理模式剖析 什么是策略模式 Java8系列 Java8简明教程 Java8 Foreach Hexo搭建博客 分分钟部署一个Hexo环境 各种配置详解 开始写作吧 开发者指南 git - 简明指南 Jersey-2.x用户指南 REST 实战 Java Servlet...
观察者模式 Observer:Swing中的事件模型 工厂模式 Factory:在JDK中遍地都是,比如JDBC、JNDI等,是...Strategy:java.util.Comparator就用到了它 代理模式 Proxy:学习Spring IoC容器必须掌握的模式 <br>
目录 一、 JavaSE 部分 1、 Java 基础 ①Java 基础部分(基本语法...①代理模式 ②装饰模式 ③适配器模式 2、 创建型模式 ①单例模式 3、 行为型模式 ①策略模式 ②观察者模式 4、 所有模式汇总 十、 场景题 十一、 UML
├─11.08 开班典礼+分析mybatis框架原理并手写实现 .mp4 ├─11.11 手写mybatis.mp4 ├─11.13 手写mybatis框架+源码阅读-2.mp4 ├─11.13 手写mybatis框架+源码阅读-3....├─11.27 手写Spring ioc和动态代理模式及AO
②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来...
代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板...
代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量
Java面试题主要涉及Java语言本身、常用的Java框架和技术、面向对象编程、多线程编程、...设计模式:单例模式、工厂模式、代理模式等常见的设计模式。 算法和数据结构:二叉树、排序算法、查找算法等基础知识。 在面试
纯手写实现SpringIOC实现过程 JEE企业级开发(企业级项目开发权威指南) 网络爬虫之JAVA正则表达式 手写springMVC框架 老司机带你透析springMVC内部实现方式 打造高效代码结构(java性能优化) 新版本通俗易懂_观察者...
内容概要:当在Linux系统上安装Java和Maven时,首先需要确保您的系统已经安装了适当...②通过maven自主学习,还可以知道一些知识点都是怎么在Spring中体现的比如IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。
代理模式 Java动态代理 简单的Aop实现 “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。 尽管在这样...
手写简单实现ioc、aop事务demo,实现事务回滚,使用到了,工厂模式,动态代理
②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来...