ApplicationContext与Spring AOP实现(

2020-02-28  本文已影响0人  低调的灬攻城狮

一、ApplicationContext

BeanFactory容器

二、动态代理AOP

1、动态代理
在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理对象,动态代理可以让我们在不修改源码的情况下增加新的功能。Java的动态代理有两种方式。

public interface Person<T> {
    List<T> get();
    boolean save(T s);
    boolean delete(int id);
    boolean update(T obj);
}
public class Factory {
    public static  Person get Person(){
        Person p = new  PersonImpl();//被代理的对象
        MyAspect ma = new MyAspect();//需要添加的代理
        /**
         * @param Factory.class.getClassLoader() 类加载器,用来加载代理类
         * @param us.getClass().getInterfaces() 被代理的接口
         * @param new InvocationHandler() 内部类 重写invoke方法
         */
         Person ps = ( Person) Proxy.newProxyInstance(Factory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {
            /**
             * 代理对象调用的回掉方法
             * @param proxy 代理对象
             * @param method 被代理的方法
             * @param args 被代理方法的参数列表对象
             * @return 每个方法的最终返回值
             * @throws Throwable
             */
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                ma.before();
                Object obj = method.invoke(p, args);//原方法
                ma.after();
                return obj;
            }
        });
        return ps;
    }
}
public static void main(String[] args) {
    //导入包   cglib-core  asm     ant     ant-launcher
    //创建运行器
    MethodInterceptor mi = new MethodInterceptor() {
        @Override
        public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
            System.out.println("运行前");
            arg3.invokeSuper(arg0, arg2);
            System.out.println("运行后");
            return null;
        }
    };
    //获取代理类
    Enhancer enhancer = new Enhancer();
    //设置父类
    enhancer.setSuperclass(Demo.class);
    //运行任务
    enhancer.setCallback(mi);
    //创建代理对象
    Demo d = (Demo)enhancer.create();
    d.method();
}

Spring框架中的动态代理方式

1. 创建被代理类接口并实现接口
2. 创建代理类,并实现MethodInterceptor接口

3. 配置beans.xml

<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="interfaces" value="com.aop.Service" />
    <property name="target" ref="us" />
    <property name="interceptorNames" value="my" />
    <property name="optimize" value="true" />
</bean>
上一篇 下一篇

猜你喜欢

热点阅读