- 浏览: 281668 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
cheetah_ysc:
不错不错,我喜欢!
Java固定时间间隔执行 -
voyage_mh:
阿选百度竟然一下可以吧你百度出来
使用DWR注解Annotation
什么是AOP?
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性
前提:要实现AOP的模拟就要知道动态代理,Spring中使用了两种动态代理方式,一种是基于JDK的动态代理,一种是基于CGlib的动态代理。为什么会有两种,那是因为JDK的动态代理只能是针对接口。
先看下面的代码dao层
package com.lbx.dao;
import com.lbx.model.User;
public interface UserDAO {
public void save(User user);
//public void delete();
}
dao实现层
package com.lbx.dao.impl;
import com.lbx.dao.UserDAO;
import com.lbx.model.User;
public class UserDAOImpl implements UserDAO {
@Override
public void save(User user) {
System.out.println("a user saved!!!");
}
/*public void delete(){
System.out.println("UserDAOImpl.delete()");
}
*/
}
现在我们要在User的save之前和之后做一些处理(拦截器),我们先看一种最简单的方法(在类中加代码)
package com.lbx.dao.impl;
import com.lbx.dao.UserDAO;
import com.lbx.model.User;
public class UserDAOImpl1 implements UserDAO {
@Override
public void save(User user) {
System.out.println("method start....");
System.out.println("a user saved!!!");
System.out.println("method stoped...");
}
}
显然,这是可以的,但是这样明显就不好,第一代码没可重用性,第二这是在知道源码的情况下,现实中我们有很多情况都不知道源码,在这种情况下,明显这方式就不行了。下面就是第二种解决方案:
package com.lbx.dao.impl;
import com.lbx.model.User;
public class UserDAOImpl2 extends UserDAOImpl{
public void save(User user) {
System.out.println("method start....");
super.save(user);
System.out.println("method stoped.....");
}
}
先让一个类实现了那个接口,然后要用的类继承那个实现类,这样也可以达到目的(其实这就是一种“组合模式”),这种方式在一定的程度上是利用的资源,代码的重用性。但是还是不好,当我们要做很多的处理的时候,这样我们就要组合和多的类,明显就不好。下面是第三种:使用动态代理。 先看处理方法(拦截器)
package com.lbx.interceptor;
public class UserInterceptor {
//第一个拦截方法
public void method1(){
System.out.println("UserInterceptor.method1()");
}
//第二个拦截方法
public void method2(){
System.out.println("UserInterceptor.method2()");
}
}
产生代理的类,实现InvocationHandler接口
package com.lbx.interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
//创建需要代理的目标对象
private Object targer;
//创建拦截器的实例
UserInterceptor u = new UserInterceptor();
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
//if(method.getName().equals("save")){
u.method1();
result = method.invoke(targer, args);
u.method2();
//}else{
//result = method.invoke(targer, args);
//}
return result;
}
//用于设置传人目标对象的方法
public void setTarger(Object o){
this.targer = o;
}
}
获得代理的实例类
package com.lbx.interceptor;
import java.lang.reflect.Proxy;
import com.lbx.dao.impl.UserDAOImpl;
public class UserProxyFactory {
public static Object getProxy(Object object){
ProxyHandler p = new ProxyHandler();
p.setTarger(object);
return Proxy.newProxyInstance(UserDAOImpl.class.getClassLoader(), object.getClass().getInterfaces(), p);
}
}
服务层使用动态代理
package com.lbx.service;
import com.lbx.dao.UserDAO;
import com.lbx.dao.impl.UserDAOImpl;
import com.lbx.interceptor.UserProxyFactory;
import com.lbx.model.User;
public class UserService {
//private UserDAO userDAO = new UserDAOImpl1(); //第一种就是写死,直接在方法里写
//private UserDAO userDAO = new UserDAOImpl2(); //第二种就是通过继承来实现(方法执行前后加一些业务逻辑)
//private UserDAO userDAO = new UserDAOImpl3(); //第三种是通过组合来完成的
UserDAO userDAO = new UserDAOImpl();
UserDAO u = null;
Object object = UserProxyFactory.getProxy(userDAO);
/*public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}*/
/*public void add(User user){
this.userDAO.save(user);
}*/
public void add(User user){
if(object instanceof UserDAO){
u = (UserDAO)object;
}
u.save(user);
//u.delete();
}
}
发表评论
-
模拟Spring的IoC或DI
2010-12-05 13:18 1211前提:要想模拟实现Spring的IoC,先要掌握的知识点,XM ... -
Spring面试,IoC和AOP的理解
2010-12-03 19:11 1423spring 的优点? 1.降低了组件之间的耦合性 ,实现了 ... -
Spring整合Struts2
2010-11-13 12:48 904将需要的jar包加到lib下 修改web.xm ... -
Spring整合Hibernate获得HIbernateTemplate之HibernateDaoSupport
2010-11-13 12:40 1283通过继承HibernateDaoSupport来获得Hiber ... -
Spring整合Hibernate之HibernateTemplate
2010-11-13 12:36 1373要得到HibernateTemplate就得先获得Sessio ... -
Spring整合Hibernate加事务的处理
2010-11-13 12:30 1255要在Spring中使用事务,先要在beans.xml中,把命名 ... -
Spring整合Hibernate的一个简单实例
2010-11-13 12:20 1100单独使用Hibernate的时候,连接数据库时,Hiberna ... -
Spring JDBC访问数据库(properties)
2010-11-08 12:03 1514bean.xml文件的配置 <?xml version ... -
使用Spring JDBC访问数据库(DataSource)
2010-11-08 12:01 1436bean.xml文件的配置(查文档) <?xml ve ... -
Spring中AOP切面的定义方式
2010-11-08 11:46 1921Spring切面的定义有四种: 一,基于Annotat ... -
使用AspectJ来产生动态代理
2010-11-05 20:21 1691AOP的实现者: AspectJ , Aspec ... -
PostConstruct和PreDestroy
2010-11-05 19:55 2273@PostConstruct和@PreDestroy的功能就相 ... -
Spring自动检测组件
2010-11-05 19:22 1014要想检测这些类并注册相应的bean,需要在xml中包含以下元素 ... -
基于Annotation的配置
2010-11-05 18:18 684要想知道怎样使用Annotation来配置bean就的知道命名 ... -
工厂方法注入(静态和非静态)
2010-11-05 16:10 5800先看非静态的 先写一个简单工厂 package com.l ... -
Spring注入类型
2010-11-05 15:36 1111第一中属性注入也就是setter注入(为属性提供相应的set和 ...
相关推荐
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
模拟AOP源码 博文链接:https://senny.iteye.com/blog/466622
SpringIOC和AOP实现机制模拟,来自与网络。
用Spring AOP模乘坐地铁服务中的安检(对应前置通知)、刷卡进站、乘坐及刷卡出站(对应可以是环绕通知)、运行过程中的异常(异常通知)、记录此次行程(最终通知)全过程
模拟实现spring IOC AOP的例子,如果你是eclipse开发工具,解压直接导入就可以,别忘了,导入dom4j的jar包。
Spring IOC AOP MVC 简单例子
模拟spring aop技术,一个小demo,希望对您理解aop有所帮助.
通过动态代理模拟Spring AOP,通过动态代理模拟Spring AOP
通过模拟SpringAOP,设置四个Advice实现简单的切面编程
这是一个基于spring AOP静态代理模拟的案例,可以更好的理解spring的aop作用
从http://www.cnblogs.com/sunniest/p/4543271.html 这里摘抄的源码,具体教程可以看这个文章
这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好地理解和利用Spring AOP来提高您的应用程序的可维护性和可扩展性。 内容亮点: JDK动态...
模拟spring ioc aop的功能,理解spring ioc 和 aop 的实现原理和机制。
java 动态代理实现,模拟了spring实现aop的原理,对学习面向切面编程的朋友有帮助!
NULL 博文链接:https://zlx19900228.iteye.com/blog/843289
NULL 博文链接:https://johnyi.iteye.com/blog/385443
以注解方式模拟Spring_IoC,AOP,看完后可以加深理解Spring的实现.
spring aop的具体实现与理论.AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构...
这是一个很好的关于模拟spring的aop和ioc的源代码
基于java简单模拟实现spring_ioc