我们都知道spring的配置文件中可以进行声明式事务管理,其基于的原理是spring aop 切片编程,aop是基于动态代理的,动态代理可以从jvm加载类时通过反射对方法进行额外的处理。
1,先定义一个接口,把我们要做的事情写成接口方法
public interface IOstocy{ void sayHello(String name); void sayGoodBye(String name); }
2,我们给与IOstocy一个实现类
public class Ostocy implements IOstocy{ public void sayHello(String name){ System.out.println("hello"+name); } public void sayGoodBye(String name){ System.out.println(name+"goodsBye!"); } }
3,定义一个接口,用来保存你需要对IOstocy逻辑进行额外处理的方法,例如记录sayHello的对象是谁
public interface IOperation{ void start(Method method); void end(Method method); }
定义了一个开始和结束接口方法,接下来需要给一个实现类
4,定义个实现类,去实现IOperation接口
public class LoggerOperation implements IOperation { public void end(Method method) { Logger.logging(Level.DEBUGE, method.getName() + " Method end ."); } public void start(Method method) { Logger.logging(Level.INFO, method.getName() + " Method Start!"); } }
5,要写一个代理类了,这个代理类,会把IOstocy和IOperation分开处理,IOstocy中的方法是很被动的,就呆着那里,等IOperation在他随便哪个位置进来。到底从前还是后进来,就要看你自己怎么处理了,这涉及到@after @before的实现原理了。
public class DynaProxyHello implements InvocationHandler { /** * 操作者 */ private Object proxy; /** * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello) */ private Object delegate; /** * 动态生成方法被处理过后的对象 (写法固定) * * @param delegate * @param proxy * @return */ public Object bind(Object delegate,Object proxy) { this.proxy = proxy; this.delegate = delegate; return Proxy.newProxyInstance( this.delegate.getClass().getClassLoader(), this.delegate .getClass().getInterfaces(), this); } /** * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用 * 此方法是动态的,不是手动调用的 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { //反射得到操作者的实例 Class clazz = this.proxy.getClass(); //反射得到操作者的Start方法 Method start = clazz.getDeclaredMethod("start", new Class[] { Method.class }); //反射执行start方法 start.invoke(this.proxy, new Object[] { method }); //执行要处理对象的原本方法 result = method.invoke(this.delegate, args); // 反射得到操作者的end方法 Method end = clazz.getDeclaredMethod("end", new Class[] { Method.class }); // 反射执行end方法 end.invoke(this.proxy, new Object[] { method }); } catch (Exception e) { e.printStackTrace(); } return result; } }
6,测试下
public class Test { public static void main(String[] args) { IOstocy ostocy= (IOstocy)new DynaProxyHello().bind(new Ostocy(),new LoggerOperation()); ostocy.sayGoogBye("Double J"); ostocy.sayHello("Double J"); } }
我的想法是在代理对象的public Object invoke(Object proxy, Method method, Object[] args)方法里面加上个if(),对传进来的method的名字进行判断,判断的条件存在XML里面.这样我们就可以配置文件时行解藕了.如果有兴趣的朋友可以把操作者,被代理者,都通过配置文件进行配置 ,那么就可以写一个简单的SpringAOP框架了.
谢谢 http://www.blogjava.net/DoubleJ/archive/2008/03/04/183796.html
相关推荐
这可以通过单例模式、原型模式或其他策略实现。Spring默认使用CGLIB或Java反射进行实例化。 3. **依赖注入**:这是Spring的核心功能之一。`BeanFactory`解析bean定义中的依赖,并将它们注入到相应的bean属性中。...
Spring AOP是基于AspectJ实现的,它使得在Spring应用中实现横切关注点如日志、事务管理等变得简单。 以上这些库在Spring 3中扮演着不同的角色,共同构建了一个强大而全面的开发环境。通过理解和掌握这些依赖,...
- **动态代理**:Spring AOP通过动态代理技术实现切面,包括JDK动态代理和CGLIB代理。 **AOP配置** - **注解方式**:使用@Aspect,@Before,@After等注解定义切面、通知和切入点表达式。 - **XML方式**:在配置...
此外,Spring还支持原型和单例两种bean的作用域,以及接口和实现类的自动装配。 2. **AOP(面向切面编程)**:Spring的AOP模块允许开发者实现关注点分离,通过切面定义跨越多个对象的行为。它可以用于日志记录、...
最后,模拟Spring的实现将帮助我们理解Spring的内部工作原理,比如如何通过反射创建bean,如何解析和加载bean的配置信息,以及如何实现AOP的动态代理等。这种实践过程不仅加深了对Spring的理解,也为日常开发中的...
9. **Spring Aspects**:Spring AOP模块实现了完整的AOP联盟规范,支持自定义切面和通知类型,如前置通知、后置通知、环绕通知等。 10. **Spring Test**:提供了对单元测试和集成测试的支持,包括模拟对象、测试上...
5. **面向切面编程(AOP)**:理解AOP的概念和解决的问题,实现和部署Advices,使用AOP切入点表达式,识别不同类型的Advice并了解其应用场景。 **数据管理部分**: 1. **Spring JDBC**:会配置和使用Spring的...
5. **AOP**:Spring的面向切面编程,用于实现关注点分离,如日志记录、事务管理等,可以作为核心业务逻辑之外的补充。 6. **数据访问**:Spring对JDBC、ORM(对象关系映射)框架如Hibernate和MyBatis的支持,以及...
- AOP是Spring提供的另一重要特性,用于处理系统中的横切关注点,如日志、事务管理等。 - 切面(Aspect)和通知(Advice)是AOP的基本概念,通过定义切入点(Pointcut)和通知类型实现代码的模块化。 4. **Bean的...
2. **AOP**:Spring的AOP模块允许开发者定义“切面”,这些切面可以插入到应用程序的多个点上,以实现例如日志、事务管理等横切关注点。在SpringProject3中,我们可能找到使用@Aspect注解的类,以及@Before、@After...
这个练习通常涉及创建一个简单的容器,实现对象的创建、管理和依赖注入,以模拟Spring.NET的基本功能。 4. **对象的创建**:Spring.NET提供了一种声明式的方式来创建和管理对象,包括单例、原型等不同生命周期的...
5. **AOP支持**:虽然不是必须的,但为了模拟Spring的AOP功能,我们可以创建一个切面类和通知(advice),用于拦截和增强特定的Bean方法。这需要实现一个代理模式,如JDK动态代理或CGLIB代理。 6. **Scope管理**:...
2. **AOP(面向切面编程)**:Spring 提供了基于代理的 AOP 实现,使得开发者可以创建横切关注点,如日志、事务管理和安全性,而不污染业务逻辑代码。 3. **Spring MVC**:这是一个用于构建 Web 应用的模型-视图-...
在模拟实现中,可以考虑简单实现AOP的概念,例如拦截器模式。 7. **Bean的初始化与销毁**:Spring允许开发者指定Bean的初始化方法和销毁方法。模拟时,需提供调用这些方法的机制。 8. **Bean的自动装配**:Spring...
- **自动代理**:Spring可以创建JDK动态代理或CGLIB代理来实现AOP。 6. **Spring Boot** - **快速启动**:简化Spring应用程序的初始设置,自动配置。 - **Actuator**:提供监控和健康检查功能。 - **Spring ...
模拟Spring功能是为了理解Spring的核心机制,如控制反转(IOC)和依赖注入(DI)。在搭建Spring的运行环境中,我们需要创建一个新的项目,建立Spring的配置文件,引入必要的Spring库,并编写测试代码来验证配置是否...
- **AOP代理**:Spring提供两种类型的代理,即JDK动态代理和CGLIB代理,实现面向切面的增强。 2. Spring下载和安装 要使用Spring,首先需要将其引入到项目中。这可以通过两种方式完成: 2.1. 离线下载包导入 可以...
Spring框架是Java开发中广泛应用的一个开源框架,以其依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)为核心,极大地简化了企业级应用的开发。下面将详细阐述文档...