代理的应用(AOP)

来源:互联网 发布:centos 禁止ip访问ssh 编辑:程序博客网 时间:2024/06/04 21:16

      实现AOP功能的封装与配置

                            工厂类BeanFactory负责创建目标类或者代理类的实例对象,并通过配置文件

                            实现切换,其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串

                            在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,

                            否则,返回该类实例对象的getProxy方法,返回一个代理对象

                            BeanFactory的构造方法接受代表配置文件的输入流对象,配置文件格式如下

                            #xxx= java.util.ArrayList

                            xxx= com.sdut.ProFactoryBean

                            xxx.target= java.util.ArrayList

                            xxx.advice= com.sdut.MyAdvice

                            ProxyFactoryBean充当动态生成代理的工厂,需要为工厂提供目标,和通知

                            程序如下:

                     BeanFactory.java  bean工厂

                                     publicclass BeanFactory {

                                               //创建配置文件对象

                                               Propertiesprop = new Properties();

                                               publicBeanFactory(InputStream ips){

                                                        try{

                                                                 prop.load(ips);

                                                        }catch (IOException e) {

                                                                 //TODO Auto-generated catch block

                                                                 e.printStackTrace();

                                                        }

                                               }

                                               publicObject getBean(String name){

                                                        StringclassName = prop.getProperty(name);

                                                        //创建className的字节码对象

                                                        Object  obj;

                                                        try{

                                                                 Classclazz = Class.forName(className);

                                                                 //创建字节码对象所对应类的实例

                                                                 obj= clazz.newInstance();

                                                                 if(objinstanceof ProxyFactoryBean){

                                                                           //为代理工厂送去目标,和消息

                                                                           ProxyFactoryBeanproxyFactoryBean = (ProxyFactoryBean)obj;

                                                                           //获取advice,target;

                                                                           MyAdviceadvice = (MyAdvice)Class.forName(prop.getProperty(name +".advice")).newInstance();

                                                                           Objecttarget = Class.forName(prop.getProperty(name +".target")).newInstance();

                                                                           proxyFactoryBean.setAdvice(advice);

                                                                           proxyFactoryBean.setTarget(target);

                                                                           //开始创建代理对象

                                                                           Objectproxy = proxyFactoryBean.getProxy();

                                                                           returnproxy;

                                                                 }

                                                                 else{

                                                                           returnobj;

                                                                 }

                                                        }catch (Exception e) {

                                                                 //TODO Auto-generated catch block

                                                                 e.printStackTrace();

                                                        }

                                                        returnnull;

                                               }

                                     }

                     ProxyFactoryBean.java 代理工厂

                                     publicclass ProxyFactoryBean {

                                               privateObject target ;

                                               privateAdvice advice;

                                              

 

                                               publicObject getTarget() {

                                                        returntarget;

                                               }

 

                                               publicvoid setTarget(Object target) {

                                                        this.target= target;

                                               }

 

                                               publicAdvice getAdvice() {

                                                        returnadvice;

                                               }

 

                                               publicvoid setAdvice(Advice advice) {

                                                        this.advice= advice;

                                               }

 

                                               publicObject getProxy(){

                                                        Objectproxy3 = Proxy.newProxyInstance(target.getClass().getClassLoader(),

                                                                           target.getClass().getInterfaces(),newInvocationHandler(){

                                                                

                                                                                    @Override

                                                                                    publicObject invoke(Object proxy, Method method,

                                                                                                       Object[]args) throws Throwable {

                                                                                             advice.getBeginTime(method);

                                                                                             ObjectretVal  = method.invoke(target, args);

                                                                                             advice.getEndTime(method);

                                                                                             returnretVal;

                                                                                    }

                                                                

                                                        });

                                                        returnproxy3;

                                               }

                                     }

              测试类AopFrameworkTest.java

                            publicclass AopFramewrokTest {

                                     publicstatic void main(String[] args) throws IOException {

                                               //读取配置文件

                                               InputStreamips =AopFramewrokTest.class.getResourceAsStream("config.properties");

                                               Objectobj = new BeanFactory(ips).getBean("xxx");

                                               System.out.println(obj.getClass().getName());

                                               ips.close();

                                               Collectioncollection = (Collection)obj;

                                               collection.add("kk");

                                              

                                     }

                            }

                           

原创粉丝点击