框架原理

Ioc原理
Ioc的基本概念:不创建对象,但是描述创建他们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪项服务.容器负责将这些联系在一起.
Ioc(控制反转)的实现建立在工厂模式,java反射机制和jdk的操作xml的dom解析方式.spring的bean工厂主要实现了以下步骤:
1.解析配置文件(bean.xml)
2.使用反射机制动态加载每个class节点中的配置
3.为每个class节点中配置的类实例化一个对象
4.使用反射机制调用各个对象的setter方法,将配置文件中的属性值设置进对应的对象
5.将这些对象放在一个存储空间(beanmap)
6.使用getbean方法从存储空间(beanmap)中取出指定的javabean
Aop原理
Aop源代码实现中包含动态代理.动态代理是在不修改原有类对象方法的源代码基础上,通过代理对象实现原有类对象方法的增强,也就是拓展原有类对象的功能,比如常用的日志事务,安全等功能.日志,事务是狠多方法都需要的功能,可以将日志打印,事务控制代码公共抽象出来,然后以动态代理的方式加入需要使用的方法中,那么这些方法不编写日志和事务的代码,却可以实现日志和事务功能.
动态代理中包含一个类和一个接口
1,invocationhandler
package com.zl.server.test;
import java.lang.reflect.Method;
public interface InvocationHadler {
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}
参数说明:
Object proxy:指最终生成的代理实例,一般不会用到
Method method:要调用的方法
Object[] args:方法调用时所需要的参数
可以将InvocationHandler 接口的子类相像成一个代理的最终操作类
2.Proxy类,此类事专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供如下的操作方法:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException
参数说明:
ClassLoader :类加载器
Class<?>[] interfaces:得到全部接口
Class<?>[] interfaces:得到InvocationHandler接口的子类实例

1.先创建一个接口
package com.zl.server.test;

public interface StudentDao {
public abstract void login();
public abstract void regist();
}
2.创建接口实现类
package com.zl.server.test;

public class StudentDaoImpl implements StudentDao{

public void login() {
	// TODO Auto-generated method stub
	System.out.println("登录");
}

public void regist() {
	// TODO Auto-generated method stub
	System.out.println("注册");
}

}
3.实现InvocationHandler接口
package com.zl.server.test;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyInvocationHandler implements InvocationHadler{

private Object target;
public Object bind(Object target) {
	//绑定一个委托对象,就是接口对象
	 this.target=target;
	 //返回一个代理对象
	 return Proxy.newProxyInstance(target.getClass(), target.getClass().getInterfaces(), this)
	 
}
public Object invoke(Object proxy, Method method, Object[] args2) throws Throwable {
	// TODO Auto-generated method stub
	System.out.println("假设此处为权限检查,事务处理代码");
	Object result=met.invoke(target, args2);
	System.out.println("日志打印");
	return result;
}

}
3.测试代码
package com.zl.server.test;

public class StudentDemo {
public static void main(String[] args) {
StudentDao sd = new StudentDaoImpl();
sd.login();
sd.regist();
System.out.println("-----");
MyInvocationHandler handler = new MyInvocationHandler();
StudentDao proxy = (StudentDao) handler.bind(sd);
proxy.login();
/**
* 此处采用动态代理模式调用了登录方法,那么在调用登录方法之会执行MyInvocationHandler类中的
* invoke方法中的System.out.println(“假设此处为权限检查,事务处理代码”);,调用完后会执行
* System.out.println(“日志打印”);既aop前,aop后的实现方法
*/
proxy.regist();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值