原文地址:
http://blog.csdn.net/zhao_hongsheng/article/details/7309054
AOP似乎只属于JAVA。
RUBY能否实现AOP呢?
可以
在rails里
someController
before_filter :login_required
anotherController
before_filter :login_required, :only=>[:update, :edit, :destroy]
andAnotherController
before_filter :login_required, :only=>[:new, :create]
adminController
before_filter :admin_login_required
离开rails要怎么实现呢?
我要用到rails的active_support作为辅助,
所以你的机器上需要安装了RAILS的active_support。
第一种方法,用method_missing实现
require 'rubygems'
require 'active_support'
module MyBase
def self.included(base)
base.class_eval do
include ActiveSupport::Callbacks
define_callbacks :before
define_callbacks :after
end
end
def method_missing(symb, *args)
method_name = symb.to_s.gsub(/_aop/,'').to_sym
if respond_to? method_name
run_callbacks(:before)
send(method_name)
run_callbacks(:after)
else
super
end
end
end
class MyClass
include MyBase
before :m_bf
after :m_af
def m_1
puts '- method_1'
end
def m_2
puts '- m_2'
end
protected
def m_bf
puts 'before ..'
end
def m_af
puts 'after ...'
end
end
执行
c = MyClass.new
c.m_2_aop
结果
before ..
- m_2
after ...
看下面
----------------
用active_support的callback
结合alias_method_chain来实现
require 'rubygems'
require 'active_support'
module MyCallBackBase
def self.included(base)
base.class_eval do
include ActiveSupport::Callbacks
define_callbacks :before
define_callbacks :after
end
end
end
module EmbedCallback
def self.included(base)
base.class_eval do
methods = public_instance_methods(false)
methods.each do |m|
class_eval <<-"end_eval"
def #{m.to_s}_with_callback
run_callbacks(:before)
#{m}_without_callback
run_callbacks(:after)
end
end_eval
alias_method_chain m, :callback
end
end
end
end
class MyClass
include MyCallBackBase
before :m_bf, :m_bf2
after :m_af
def m_1
puts '- method_1'
end
def m_2
puts '- method_2'
end
protected
def m_bf
puts 'before the method ..'
end
def m_af
puts 'after the method ...'
end
def m_bf2
puts 'before the method 2222...'
end
include EmbedCallback
end
执行
c = MyClass.new
c.m_2
结果
before the method ..
before the method 2222...
- method_2
after the method ...