黑马程序员(八) 实现Aop功能的封装和配置的小程序

要求:::工厂类BeanFactory 负责创建目标类或者代理类的实例对象,并通过配置文件实现切换,其

方法更具参数字符串返回一个相应的实例对象,如果番薯字符串在配置文件中对应的类名下不是

ProxyFactorybean则直接返回该类的实例对象,否则返回该类实例对象的getProxy方法返回的对象


设计思路:::

1,BeanFactory的构造方法接受达标配置文件的输入流对象。配置文件如下

//xxx=java.util.ArrayList
xxx=day3.ProxyFactoryBean
xxx.target=java.util.ArrayList
xxx.advise=day3.MyAdvice

2,ProxyFactoryBean充当封装生成动态代理的工厂,需要为工厂类提供哪些配置信息呢。?

  目标:

  通知:

3,编写客户端应用

   a,编写实现advice接口的类和配置文件中进行配置

   b,调用BeanFactory获取对象


第一步。。创建BeanFactory

package day3;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;


public class BeanFactory {
	private static Properties pro;
	BeanFactory(InputStream ins)//BeanFactory的输入流构造方法。直接的从调用程序里传入一个配置文件调用它

	{
		pro=new Properties();
		try {
			pro.load(ins);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public Object getBean(String name)throws Exception//创建getbean方法。。
	{
		String vaule=pro.getProperty(name);
		Class clazz=Class.forName(vaule);
		Object bean=clazz.newInstance();//创建bean类型的实例对象。
		if(bean instanceof ProxyFactoryBean)//bean 对象属于proxyFactoryBean创建的对象
		{
			ProxyFactoryBean proxy=(ProxyFactoryBean)bean;//强制转换。因为bean对象属于它
			String adviseName=pro.getProperty(name+".advise");
			MyAdvice advise=(MyAdvice)Class.forName(adviseName).newInstance();//加载配置文件,创建一个配置文件对象
			String targetName=pro.getProperty(name+".target");
			Object target=Class.forName(targetName).newInstance();
			proxy.setAdvise(advise);//设置proxybean对象的的字段值
			proxy.setTarget(target);
			return proxy.getProxy();//调用getProxy方法。返回proxy对象
		}
		return bean;
	}

}
因为如果是ProxyFactorybean的话该类实例对象的getProxy方法返回的对象。。这里就要引用到动态代理返回的对象。

调用模板。。创建ProxyFactorybean类。同时设置好两个字段属性值。。这也是一个bean类。按照bean类去设置就可以了

package day3;

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

public class ProxyFactoryBean {
	private MyAdvice advise;
package day3;

import java.io.InputStream;

public class AopFramworkTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		InputStream ins=AopFramworkTest.class.getResourceAsStream("config.properties");
		System.out.println(new BeanFactory(ins).getBean("xxx").getClass().getName());
		
		

	}

}

创建主程序加载配置信息。调用方法返回实例对象


package day3;

import java.io.InputStream;

public class AopFramworkTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		InputStream ins=AopFramworkTest.class.getResourceAsStream("config.properties");
		System.out.println(new BeanFactory(ins).getBean("xxx").getClass().getName());
		
		

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值