控制反转(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 Spring代理模式AOP-IOC分析 一、代理模式概述 在软件设计中,代理模式是一种常用的设计模式。它可以在不修改原始代码的情况下,扩展或修改原始对象的行为。代理模式可以分为静态代理和动态代理两种。静态代理...
Java的反射机制是Java编程语言的核心特性之一,它...总的来说,理解Java的反射和动态代理机制对于深入学习Spring框架,尤其是其IOC和AOP机制至关重要。通过掌握这些技术,开发者可以构建出更加灵活、可扩展的Java应用。
Spring AOP通过代理模式实现,反射在这里也起到了关键作用。 5. **反射API的使用**:在Java中,`java.lang.reflect`包提供了Class、Constructor、Method和Field等类,用于反射操作。例如,`Class.forName()`用于...
Java Spring 代理模式 AOP-IOC 结合 从给定的文件信息中,我们可以总结出以下知识点: 一、为什么需要代理模式 在软件开发中,我们经常会遇到一些非功能性需求,如日志记录、身份验证、性能监控等,这些需求会...
IOC(Inversion of Control,控制反转)框架是软件设计模式中的一个重要概念,它将对象的创建和管理职责从应用程序代码中分离出来,交由框架来处理。这样做的好处是提高了代码的可重用性,降低了模块间的耦合度,...
Java反射和Spring IOC是Java开发中的两个重要概念,它们在构建灵活、可扩展的应用程序时起着关键作用。本文将深入探讨这两个主题,并提供相关的学习资源。 首先,让我们了解一下Java反射。Java反射机制是Java语言的...
不过,需要注意的是,Spring框架提供了更高级的功能,如自动扫描、AOP代理、事务管理等,这些都是纯Java模拟可能难以完全复现的。因此,尽管模拟有助于学习,但在实际项目中,直接使用Spring框架会更加高效和便捷。
Java AOP通常使用代理模式实现,Spring框架提供了两种主要的代理方式:JDK动态代理和CGLIB代理。JDK代理适用于接口实现类,而CGLIB代理则针对没有实现接口的类。 IOC,即控制反转,是对象依赖关系的反转。在传统的...
例如,Spring框架大量使用了依赖注入(DI)和控制反转(IoC)的概念,这实际上是对工厂模式和代理模式的高级应用。 学习《Java与模式》可以帮助开发者: - 理解面向对象设计的基本原则,如单一职责原则、开闭原则...
总结来说,模拟Spring的IoC和AOP主要是通过注解来管理和控制对象的生命周期及行为。虽然这种模拟简化了Spring的复杂性,但其核心思想是一致的:降低耦合,提高可维护性和可扩展性。理解并实践这些概念,对于掌握...
在 Java EE 中,也有很多设计模式的应用,例如在 Hibernate 中使用了代理模式和装饰模式。 设计模式是一种解决软件设计问题的方法,可以帮助开发者更好地设计和实现软件系统。在 Java 中,设计模式的应用非常广泛,...
静态代理是传统的代理模式实现,需要为每个目标类创建一个代理类,代理类和目标类实现相同的接口。静态代理的优点是代码清晰,但缺点是当需要代理的类增多时,代理类的数量也会同步增加,代码维护成本较高。 **6. ...
在《Java设计模式(疯狂Java联盟版).chm》中,你将了解到23种经典的GOF设计模式,包括创建型模式(如单例模式、工厂模式、抽象工厂模式)、结构型模式(如代理模式、适配器模式、装饰器模式)、行为型模式(如观察...
内容包括创建者模式、结构型模式、行为型模式、代理模式、策略模式、单例模式、责任链模式、模板方法模式、迭代器模式、适配器模式、观察者模式、装饰者模式、工厂方法模式、原型模式、抽象工厂模式、命令模式等。...
- **代理模式**:为其他对象提供一种代理以控制对这个对象的访问,常用于权限控制或性能优化。 - **建造者模式**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 2. **IOC(Inversion ...
5. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 6. 装饰模式:动态地给对象添加一些额外的职责,增加功能而不改变其结构。 四、行为型模式 1. 责任链模式:将请求封装为一个对象,沿着链传递,直到...
**AOP的实现方式**主要有两种:代理模式和字节码增强。在Java中,Spring提供了基于接口的JDK动态代理和基于类的CGLIB代理。JDK动态代理适用于实现了接口的目标对象,它会生成一个代理类,这个代理类同时实现了目标...