spring AOP原理
spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。
以下是JDK动态代理和CGLIB代理简单介绍
JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的Java字节码编辑类库)操作字节码实现的,性能比JDK强。
1)定义接口:
view plaincopy to clipboardprint?
package com.beckham.dao;
import com.beckham.model.Person;
public interface PersonDAO {
public void add(Person person) ;
}
package com.beckham.dao;
import com.beckham.model.Person;
public interface PersonDAO {
public void add(Person person) ;
}
2)实现接口:
view plaincopy to clipboardprint?
package com.beckham.daoimp;
import com.beckham.dao.PersonDAO;
import com.beckham.model.Person;
public class PersonDAOImp implements PersonDAO {
public void add(Person person) {
System.out.println(person.getName());
}
}
package com.beckham.daoimp;
import com.beckham.dao.PersonDAO;
import com.beckham.model.Person;
public class PersonDAOImp implements PersonDAO {
public void add(Person person) {
System.out.println(person.getName());
}
}
3)服务层:
view plaincopy to clipboardprint?
package com.beckham.service;
import com.beckham.dao.PersonDAO;
import com.beckham.model.Person;
public class PersonService {
//注入personDAO
private PersonDAO personDAO ;
public PersonDAO getPersonDAO() {
return personDAO;
}
public void setPersonDAO(PersonDAO personDAO) {
this.personDAO = personDAO;
}
//调用personDAOImp里面的方法
public void add(Person person) {
personDAO.add(person) ;
}
}
package com.beckham.service;
import com.beckham.dao.PersonDAO;
import com.beckham.model.Person;
public class PersonService {
//注入personDAO
private PersonDAO personDAO ;
public PersonDAO getPersonDAO() {
return personDAO;
}
public void setPersonDAO(PersonDAO personDAO) {
this.personDAO = personDAO;
}
//调用personDAOImp里面的方法
public void add(Person person) {
personDAO.add(person) ;
}
}
4)切面类:
view plaincopy to clipboardprint?
package com.beckham.aop;
public class LogHandler {
public void before(){
System.out.println("方法开始.......");
}
public void after(){
System.out.println("方法结束.......");
}
}
package com.beckham.aop;
public class LogHandler {
public void before(){
System.out.println("方法开始.......");
}
public void after(){
System.out.println("方法结束.......");
}
}
5)XML配置切面
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8"?>
<!--
Application context definition for PetClinic on JPA.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="person" class="com.beckham.model.Person"
scope="prototype" />
<bean id="personDAO" class="com.beckham.daoimp.PersonDAOImp" />
<bean id="personService"
class="com.beckham.service.PersonService">
<property name="personDAO" ref="personDAO"></property>
</bean>
<bean id="user" class="com.beckham.model.User" />
<bean id="userDAO" class="com.beckham.daoimp.UserDAOImp" />
<bean id="userServiceInterfaceImpl"
class="com.beckham.service.UserServiceInterfaceImpl">
<property name="userDAO" ref="userDAO"></property>
</bean>
<!-- AOP配置 -->
<bean id="loghandler" class="com.beckham.aop.LogHandler" />
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="logCut"
expression="execution(* com.beckham.daoimp.PersonDAOImp.*(..))" />
<!-- 引用该切面类 -->
<aop:aspect id="aspect" ref="loghandler">
<aop:before method="before" pointcut-ref="logCut" />
<aop:after method="after" pointcut-ref="logCut" />
</aop:aspect>
</aop:config>
<!-- AOP配置 -->
<bean id="timehandler" class="com.beckham.aop.TimeHandler" />
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="timeCut"
expression="execution(* com.beckham.daoimp..*(..))" />
<!-- 引用该切面类 -->
<aop:aspect id="timAspect" ref="timehandler">
<aop:before method="before" pointcut-ref="timeCut" />
<aop:after method="after" pointcut-ref="timeCut" />
</aop:aspect>
</aop:config>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Application context definition for PetClinic on JPA.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="person" class="com.beckham.model.Person"
scope="prototype" />
<bean id="personDAO" class="com.beckham.daoimp.PersonDAOImp" />
<bean id="personService"
class="com.beckham.service.PersonService">
<property name="personDAO" ref="personDAO"></property>
</bean>
<bean id="user" class="com.beckham.model.User" />
<bean id="userDAO" class="com.beckham.daoimp.UserDAOImp" />
<bean id="userServiceInterfaceImpl"
class="com.beckham.service.UserServiceInterfaceImpl">
<property name="userDAO" ref="userDAO"></property>
</bean>
<!-- AOP配置 -->
<bean id="loghandler" class="com.beckham.aop.LogHandler" />
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="logCut"
expression="execution(* com.beckham.daoimp.PersonDAOImp.*(..))" />
<!-- 引用该切面类 -->
<aop:aspect id="aspect" ref="loghandler">
<aop:before method="before" pointcut-ref="logCut" />
<aop:after method="after" pointcut-ref="logCut" />
</aop:aspect>
</aop:config>
<!-- AOP配置 -->
<bean id="timehandler" class="com.beckham.aop.TimeHandler" />
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="timeCut"
expression="execution(* com.beckham.daoimp..*(..))" />
<!-- 引用该切面类 -->
<aop:aspect id="timAspect" ref="timehandler">
<aop:before method="before" pointcut-ref="timeCut" />
<aop:after method="after" pointcut-ref="timeCut" />
</aop:aspect>
</aop:config>
</beans>
6)测试:
view plaincopy to clipboardprint?
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.beckham.model.Person;
import com.beckham.model.User;
import com.beckham.service.PersonService;
import com.beckham.service.UserServiceInterface;
public class SpringTest {
/**
* beckham Dec 28, 2009 1:21:09 PM
*/
public static void main(String[] args) {
personManager();
}
public static void personManager() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Person p = (Person) ctx.getBean("person");
p.setName("张三");
PersonService ps = (PersonService) ctx.getBean("personService");
ps.add(p);
}
public static void userManager() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User u = (User) ctx.getBean("user");
u.setName("张三");
UserServiceInterface ps = (UserServiceInterface) ctx.getBean("userServiceInterfaceImpl");
ps.sayHello(u.getName());
}
}
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.beckham.model.Person;
import com.beckham.model.User;
import com.beckham.service.PersonService;
import com.beckham.service.UserServiceInterface;
public class SpringTest {
/**
* beckham Dec 28, 2009 1:21:09 PM
*/
public static void main(String[] args) {
personManager();
}
public static void personManager() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Person p = (Person) ctx.getBean("person");
p.setName("张三");
PersonService ps = (PersonService) ctx.getBean("personService");
ps.add(p);
}
public static void userManager() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User u = (User) ctx.getBean("user");
u.setName("张三");
UserServiceInterface ps = (UserServiceInterface) ctx.getBean("userServiceInterfaceImpl");
ps.sayHello(u.getName());
}
}
测试结果:
方法开始.......
1262678458703
张三
1262678458703
方法结束.......
spring AOP原理的更多相关文章
- 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)
Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...
- spring ioc 原理 spring aop原理
大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单.我们先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对 ...
- spring aop原理分析
持续更新... aop跟java代理模式有关. java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 工厂模式用到java反射. ao ...
- Spring AOP原理(续)
十二.AOP 1. 说出Spring的通知类型有哪些? spring共提供了五种类型的通知: 通知类型 接口 描述 Around 环绕通知 org.aopalliance.intercept.Meth ...
- spring aop 原理学习
@EnableAspectJAutoProxy: @Import(AspectJAutoProxyRegistrar.class) 实际是创建了一个以org.springframework.aop.c ...
- Spring Boot -- Spring AOP原理及简单实现
一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...
- spring aop原理和实现
一.aop是什么 1.AOP面向方面编程基于IoC,是对OOP的有益补充: 2.AOP利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可 ...
- 【spring 注解驱动开发】Spring AOP原理
尚学堂spring 注解驱动开发学习笔记之 - AOP原理 AOP原理: 1.AOP原理-AOP功能实现 2.AOP原理-@EnableAspectJAutoProxy 3.AOP原理-Annotat ...
- Spring AOP 原理的理解
>AOP基本概念 1)通知(Advice):织入到目标类连接点上的一段程序代码.通知分为五种类型: - Before:在方法被调用之前调用 - After:在方法完成后调用通知,无论方法是否执行 ...
- Spring AOP原理及拦截器
原理 AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core bu ...
随机推荐
- 用 Hexo + Github 搭建自己的博客
扯在前面 在很久很久以前,一直就想搭建属于自己的一个博客,但由于各种原因,最终都不了了之,恰好最近突然有了兴趣,于是就自己参照网上的教程,搭建了属于自己的博客. 至于为什么要搭建自己的博客了?哈哈,大 ...
- 浅谈this那些事
一直以来,对this的讨论都是热门话题.有人说掌握了this就掌握了JavaScript的80%,说法有点夸张,但可见this的重要性.本人至今也是记录了很多关于this的零碎笔记,今天就来个小结. ...
- Perl正则表达式例子
Perl正则表达式 一.介绍 正则表达式各语言都有自己的规范,但是基本都差不多,都是由元字符的组合来进行匹配:由于Nmap内嵌的服务与版本探测是使用的Perl正则规范,因此此篇博客记录一下Perl正则 ...
- Adapter模式进行代码重构
Adapter(适配器)模式主要是将一个类的某个接口转换成一个兼容的接口. 下面是实现一个商品检索的示例 [Bad Code] public class Product { } public clas ...
- iOS获取WIFI的IP、子网掩码,以及域名转IP
获取WIFI需要的头文件: #import "GetCurrentIP.h" #import <ifaddrs.h> #import <arpa/inet.h&g ...
- linux 升级yum对应的python
这里记录一下linux 系统升级python对yum带来影响的解决办法 很多人在使用linux系统执行python任务的时候需要升级linux系统自带的python到高级版本.具体如何升级python ...
- Chapter 4. The MPEG-4 and H.264 Standards
本章节介绍一些关于MPEG-4标准与H.264标准的基本知识 比较重要的是第95页关于两种标准的对比表格.其他部分没有什么特别重要的细节.
- RedHat安装中文支持和字体
操作系统: Red Hat Enterprise Linux 6.3 x86 安装中文语言支持: yum install "@chinese support" 安装完中文支持后,可 ...
- 关于STM32单片机的IAP实现
基于STM32F103单片机的IAP实现(虽然该篇文章不会详细写出实现细节,但是会从一个全局的角度讲述,实际的实现细节只需根据datasheet即可完成). 一.基础概念 什么是IAP?IAP即在应用 ...
- PKM你的知识需要管理
有一段时间没有更新技术博客了~,大脑中总感觉有点东西要写,却不知道从哪里开始写~至少写点东西,也算是一个阶段的成长 学习(充电过程).工作(知识变现过程)不是简单重复,永远都是最值得去反思.玩味的事儿 ...