Spring为Java大地带来了一阵春风,它作为一个优秀的轻量级企业应用开发框架,能够大大简化企业应用开发的复杂性。
Spring以反向控制和AOP这两样先进的设计理念为基础,统一了应用对象的查找、配置和生命周期的管理,分离了业务与基础服务中的不同关注
点,开发人员可以基于简单Java对象轻松的实现与EJB同样强大的功能。
AOP经常被定义为一种编程技术,用来在系统中提升业务的分离,系统有很多组件组成,每一组件负责一部分功能。然而,这些组件也经常带有一些除了核心功能之外的附带功能。系统服务如日志、事务管理和安全经常融入到一些其他功能模块中。这些系统服务通常叫做交叉业务,这是因为,它们总是分布在系统的很多组件中,通过将这些业务分布在多个组件中,你给你的代码引入了双重复杂性。
---摘自《Spring in Action》
今天我给大家介绍一下Spring是如何实现AOP技术的,这里需要一些反射和代理的知识,大家可以看我以前的文章,里面有关于反射代理的讲解和代码演示,我们可以通过AOP技术在目标对象不知情的情况之下做一些参数的验证或者一些日志记录,而目标对象并不用操心我们对他作了什么(其实他根本就不知道我们做了什么)因为所有的一切我们是在目标对象的代理类中实现的,下面我给大家讲解一下我所理解的AOP技术。
讲解AOP时,我还是使用我关于代理那篇文章中的例子:
首先需要一个接口
interface Foo
{
public String printMessage(String message);
}
一个实现这个接口的类
public class FooClass implements Foo {
public String printMessage(String message)
{
return "This is Object FooClass~!" + message;
}
}
一个实现了InvocationHandler接口的类(这个类用于实现面向切面)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.BasicConfigurator;
public class MyInvocationHandler implements InvocationHandler {
private Object fooClass;
public MyInvocationHandler(Object fooClass) {
this.fooClass = fooClass;
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)throws Throwable
{
BasicConfigurator.configure();
Log log = LogFactory.getLog(MyInvocationHandler.class);
log.info("This is " + MyInvocationHandler.class.getName() + "You want invoke "+ arg1.getName());
return arg1.invoke(fooClass,arg2);
}
}
一个实现了FactoryBean接口的类(FactoryBean接口在Spring中用于得到一个ProxyObject对象)
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import org.springframework.beans.factory.FactoryBean;
public class MyFactoryBean implements FactoryBean {
private String target = null;
private String interf = null;
public Object getObject() throws Exception //在这个方法中我们通过java的代理技术得到了一个代理类,所有的参数都是通过 //XML文件传递给BeanFactory的所以我们需要一个BeanFactory的对象和一个启动运 //行类
{
Class[] interClass = new Class[]{Class.forName(interf)};
Object objTarget = Class.forName(target).newInstance();
Object objProxy =Proxy.newProxyInstance(Foo.class.getClassLoader(),interClass,new
MyInvocationHandler(objTarget));
return objProxy;
}
public Class getObjectType() {
return null;
}
public boolean isSingleton() {
return false;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public String getInterf() {
return interf;
}
public void setInterf(String interf) {
this.interf = interf;
}
}
一个启动运行类,其中有BeanFactory对象的实例
import java.util.ArrayList;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.BasicConfigurator;//使用了log4j.properties文件,如果不实用这个文件可以使用这个包
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;//如果要使用绝对路径读取*.XML文件可以使用这个包
public class MainClass {
public static void main(String[] args) throws Exception
{
//BasicConfigurator.configure();
Log log = LogFactory.getLog(MainClass.class);//实例一个Log对象
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("/applicationContext.xml"));
//通过XmlBeanFactory来读取applicationContext.xml文件
Foo foo =(Foo)factory.getBean("bean");//此时Spring会自动调用factory.getObject方法,返回一个对象
//此时的factory.getBean("bean")是如何的一个Foo对象的呢?他又是如何知道应该调用MyFactoryBean.getObject()
//的方法呢?我给大家简单讲解一下BeanFactory类的getBean方法的工作原理,首先我们在实例化BeanFactory的对象的时候
//会读取一个XML文件此时XML文件中的所有内容都将存到factory 对象的内部,每当我们调用factory.getBean("xxx")时
//它会在自身内部寻找<bean>标签中id属性为"xxx"的bean将其注入并且实例化。
log.info(foo.printMessage("Hello I'm Tony"));//调用这个对象的方法
}
}
applicationContext.xml文件的全部内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="bean" class="MyFactoryBean">
<property name="target">
<value>FooClass</value>
</property>
<property name="interf">
<value>Foo</value>
</property>
</bean>
</beans>
log4j.properties文件的全部内容
log4j.rootLogger=info,sysout
log4j.appender.sysout=org.apache.log4j.ConsoleAppender
log4j.appender.sysout.layout=org.apache.log4j.SimpleLayout
applicationContext.xml和log4j.properties放在classpath路径下,ClassPathResource和LogFactory会自动找到了
分享到:
相关推荐
在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...
在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理等。AspectJ是Java平台上的一个开源AOP框架,提供了丰富的语法来定义切面。本教程将...
标题提到的"Spring 使用AspectJ 实现 AOP之前置通知小例子",指的是利用AspectJ在Spring中实现AOP的一种特定类型的通知——前置通知(Before advice)。前置通知在目标方法执行之前运行,但不会阻止方法的执行。这种...
在Spring AOP中,代理是实现切面的关键机制,它在目标对象与实际调用之间起到了中介作用,让我们来详细探讨Spring AOP的默认代理方式。 1. **静态代理**:Spring AOP 提供了两种代理方式,一种是静态代理,另一种是...
本教程专为初学者设计,旨在帮助“菜鸟”快速掌握Spring的基本概念和实战技巧。 在Spring入门阶段,首先要理解的是依赖注入(DI)。DI是一种设计模式,它允许我们解耦组件,让它们之间通过接口而非具体的实现进行...
Spring框架是Java开发中广泛应用的一个开源框架,以其依赖注入(DI)和面向切面编程(AOP)为核心,极大地简化了企业级应用的开发。在本文中,我们将深入探讨Spring的源码,尤其是针对"菜鸟"级别的开发者如何逐步...
Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能闻名。这份笔记涵盖了Spring的核心概念和技术,包括IOC(Inverse of Control,控制反转)、DI(Dependency Injection...
### Java程序员成长之路——从菜鸟到笨鸟 #### 一、引言 《Java程序员由菜鸟到笨鸟》是一本由曹胜欢编写的书籍,旨在帮助初学者掌握Java编程的基础知识,并逐步进阶至更高级的应用场景。本书不仅适合初学者作为...
CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)的实现中被广泛使用,包括Spring AOP。在Java中,接口是实现动态代理的主要方式,但并非所有的类都能通过接口实现动态代理,例如那些没有接口的类...
Spring提供了基于注解的AOP实现,使得编写切面变得更加简单。 在Web开发方面,Spring MVC是Spring框架的一部分,它为构建RESTful Web服务提供了强大的支持。通过定义控制器、视图和模型,可以快速构建出高效、可...
本笔记旨在帮助初学者从零基础逐步提升至J2SE(Java Standard Edition)和J2EE(Java Enterprise Edition)的高手水平。J2SE是Java的核心部分,提供了用于桌面应用程序和服务器端开发的基础框架;而J2EE则是Java在...
AspectJ作为一个强大的AOP实现,提供了一套完整的语言和工具集,而AOP Alliance则促进了不同AOP框架间的协作。这两个库的结合使用,为Java开发者提供了一种高效且灵活的方式来处理横切关注点,提升应用程序的结构和...
Spring AOP通过动态代理机制实现了这一功能,它可以为普通Java对象(POJO)添加额外的行为,无需侵入到原有的业务逻辑中。在5.1.5.RELEASE版本中,Spring AOP提供了更丰富的切面定义方式,包括注解和XML配置,使得...
例如,我们可以创建一个`HelloService`接口和它的实现类`HelloServiceImpl`,然后通过Spring配置将`HelloServiceImpl`注入到需要它的类中,如`MainApp`。这样,我们就避免了硬编码依赖,提高了代码的可测试性和可...
"Java26天从菜鸟到大师"这个课程或者资料集合,显然是为了帮助初学者在短时间内快速掌握Java核心技术,从入门到精通。在这个过程中,学习者可以期待涵盖以下几个关键知识点: 1. **Java基础**:这包括了Java的基本...
在Java应用程序中使用Spring,通常需要引入一系列的jar包来实现其核心功能和服务。下面将详细阐述标题"spring所需jar包"所涵盖的知识点。 首先,基础jar包是Spring框架的核心组件,主要包括以下几个关键库: 1. ...
**Spring框架**:Spring是一个全面的Java企业级应用开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)等功能,简化了Java应用的开发。Spring的核心是容器,它可以管理对象的生命周期和对象间的依赖关系。...
总结来说,《基于SpringMvc+Spring图书信息管理系统》是一个全面展示JavaWeb开发技术的实例,涵盖了从后端服务到前端展示的完整流程,涉及SpringMvc的MVC模式、Spring的DI和AOP、数据库操作、安全控制等多个关键知识...
Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、事务管理等功能;而MyBatis则是一个轻量级的持久层框架,它将SQL语句与Java代码分离,使得数据库操作更加灵活和便捷。当我们将这两个框架...