Bean 工厂(AOP)

原创 2012年03月27日 17:38:28

BeanFactory.java

package reflect.aop;

import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;
import static java.lang.System.out;
public class BeanFactory {
	
	
	// 给出一个字符串,返回这个字符串对应的类的Bean对象
	// 如果是代理类,则返回代理,否则,则返回bean
	// 产生代理类前,要设置代理的目标、通知
	Properties proper = new Properties();
	public BeanFactory(InputStream in) {
		try {
			this.proper.load(in);
		}catch(Exception ex) {
			
		}
	}
	public Object getBean(String name) {
		
		Object bean = null;
		Class clazz = null;
		try {
			
		clazz = Class.forName(this.proper.getProperty(name));
		bean = clazz.newInstance(); // 得到一个bean 如果这个是一个代理,则得到它的代理bean
		if(bean instanceof ProxyFactoryBean)// 如果是代理类,设置其代理目标,代理消息,然后返回代理类
		{
			ProxyFactoryBean b = (ProxyFactoryBean)bean;
			b.setTarget(Class.forName(proper.getProperty("target")).newInstance());
			b.setAdvice((Advice)Class.forName(proper.getProperty("advice")).newInstance());
			return b.getProxy(); 
		}
		}catch(Exception ex) {
			ex.printStackTrace();
		}
		return bean;
	}
	// +------------  Main ------------------
	public static void main(String args[]) {
		InputStream in = BeanFactory.class.getResourceAsStream("config.properties");
		BeanFactory factory = new BeanFactory(in);
		Action bean = (Action)factory.getBean("aaa");
		out.println(bean.getClass());
		bean.cry();
	}
}
class ProxyFactoryBean
{
	private Object target = null;
	private Advice advice = null;
	public void setTarget(Object target) { // 设置代理类的代理目标
		this.target = target ;
	}
	public void setAdvice(Advice adv) {
		this.advice = adv; // 设置代理的处理消息
	}
	public Object getProxy() // 得到代理类,并执行adivce.beforeMethod advice.afterMethod
	{
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {

			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				Object result = null;
				advice.beforeMethod();
				result = method.invoke(target, args);
				advice.afterMethod();
				return result;
			}
		});
	}
}
class Advice {    // 在执行 method.invoke(target,args) 方法前执行的内容封闭成类
	public void beforeMethod()
	{
		out.println("Method start");
	}
	public void afterMethod() {
		out.println("Method end");
	}
}


Action.java

package reflect.aop;
import static java.lang.System.out;
public interface Action {//目标的接口
	
	void say();
	void smile();
	void cry();
}
class Person implements Action// 目标类
{
	@Override
	public void cry() {
		out.println("Person crying..");
	}
	@Override
	public void say() {
		out.println("Person crying..");
		
	}
	@Override
	public void smile() {
		out.println("Person crying..");
		
	}
}

配置文件

#aaa=java.lang.String
aaa=reflect.aop.ProxyFactoryBean
target= reflect.aop.Person
advice=reflect.aop.Advice



 

Spring学习(三)ioc工厂bean深入理解

> 我所理解的工厂bean: 我们在使用ioc容器形成类之间的依赖关系,也就是在配置文件中配置bean的时候,一般是class指向的是实体bean类,通过ref将另外一个bean对象注入到这个类中...
  • u011250851
  • u011250851
  • 2015年08月25日 22:24
  • 5395

Spring通过工厂方法配置Bean

通过静态工厂方法配置Bean1、调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单地调用静态方法,而不用关心创建对象的细节 2、要声明通过静态方法创建的B...
  • jyxmust
  • jyxmust
  • 2017年02月01日 23:56
  • 3032

Spring AOP之高级应用--在已有的bean中引入行为

问题: 有时候有一组共享公共行为类。在OOP中,它们必须扩展相同的基类或者实现相同的接口。 此外,Java的单继承机制仅允许一个类最多扩展一个基类。所以,不能同时从多个实现类中继承行为。 解决方案: ...
  • zhoupeng_love
  • zhoupeng_love
  • 2014年03月20日 14:09
  • 2059

深入学习Spring框架之五通过工厂方法创建Bean

前面我们介绍了,通过构造器的方式创建Bean对象,今天我们来讲一下通过工厂方法来创建Bean。     有些时候,我们有必要将一些类设置为单例模式,比如说一个国家的最高领导人,再比如我们在银行办理业...
  • lycyl
  • lycyl
  • 2016年09月08日 16:01
  • 1031

spring详解:通过FactoryBean自定义工厂初始化Bean

FactoryBean是一个接口,扩展功能提供给用户自定义工厂方法和工厂对象用于实例化对象。...
  • u013458516
  • u013458516
  • 2015年11月03日 15:17
  • 2341

Spring学习笔记一: Bean工厂(BeanFactory )与应用上下文(ApplicationContext)BeanFactory

bean工厂:最简单的容器,提供了基础的依赖注入支持。创建各种类型的Bean. 应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务。beans包提供了以...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2016年07月14日 20:19
  • 2132

Spring学习笔记(二)后处理器与AOP

Spring 后处理器和AOP
  • z55887
  • z55887
  • 2016年09月27日 21:37
  • 771

转:Spring使用静态工厂方法创建Bean

如何在Spring中不再使用Spring创建Bean实例,而是把Bean创建过程转移到开发者手中。 1. 使用静态工厂方法创建Bean     使用静态工厂方法创建Bean实例时,class属...
  • u012110719
  • u012110719
  • 2015年08月18日 16:03
  • 1536

Spring 使用实例工厂方法实例化Bean

知识点介绍:         实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法。 【转载使用,请注明出处:http://blog.csdn.net/m...
  • ma_hoking
  • ma_hoking
  • 2014年12月20日 22:00
  • 2138

Spring 工厂方式 创建bean实例

摘自:http://layznet.iteye.com/blog/906619    很多情况下使用定义一个bean,这种定义方式Spring将会调用默认的无参数构造方法创建Bean实例。除此...
  • u014223536
  • u014223536
  • 2015年03月03日 15:04
  • 966
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bean 工厂(AOP)
举报原因:
原因补充:

(最多只允许输入30个字)