在这里会介绍如下知识点:
- factory-method
- factory-bean
- lookup-method
- replace-method
factory-method
在Spring中如果对一个bean的创建使用工厂方法模式就可以使用factory-method
/**
* factory-method demo
* @author zhangwei_david
* @version $Id: FactoryMethodDemo.java, v 0.1 2015年7月8日 下午11:03:58 zhangwei_david Exp $
*/
public class FactoryMethodDemo {
public static Person getPerson() {
return new Person() {
@Override
public String getSex() {
return "male";
}
};
}
}
<bean id="male" class="com.cathy.demo.spring.FactoryMethodDemo"
factory-method="getPerson" />
factory-bean
在上一个示例中class指向的是一个工厂方法类,如果这个工厂方法类对多个bean中都有使用,可以通过factory-bean 进行优化处理
/**
*
* @author zhangwei_david
* @version $Id: FactoryBeanDemo.java, v 0.1 2015年7月8日 下午10:08:58 zhangwei_david Exp $
*/
public class FactoryBeanDemo {
public Man getMan() {
return new Man();
}
public Person getPerson() {
System.out.println("getPerson");
return new Person() {
@Override
public String getSex() {
return "femal";
}
};
}
}
<bean id="factoryBeanDemo" class="com.cathy.demo.spring.FactoryBeanDemo" />
<bean id="person" factory-bean="factoryBeanDemo" factory-method="getPerson" />
lookup-method
在Spring中多数的bean都是单例的,但是如果有一个单例bean需要引用一个prototype bean怎么处理了,不可能每次都需要查询加载bean吧。在这样的场景下lookup-method可以很好的解决。
/**
* lookup-method使用示例
*
* @author zhangwei_david
* @version $Id: LookupMethodDemo.java, v 0.1 2015年7月8日 下午2:55:38 zhangwei_david Exp $
*/
public abstract class LookupMethodDemo {
protected Man man = getMan();
/**抽象方法**/
public abstract Man getMan();
public int getId() {
return man.getId();
}
}
/**
*
* @author zhangwei_david
* @version $Id: Man.java, v 0.1 2015年6月7日 下午6:46:30 zhangwei_david Exp $
*/
public class Man extends Person implements InitializingBean {
private int id = (int) (Math.random() * 100);
/**
* @see com.cathy.demo.spring.Person#getSex()
*/
@Override
public String getSex() {
return "Male";
}
/**
* Getter method for property <tt>id</tt>.
*
* @return property value of id
*/
public int getId() {
return id;
}
/**
* Setter method for property <tt>id</tt>.
*
* @param id value to be assigned to property id
*/
public void setId(int id) {
this.id = id;
}
/**
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
public void afterPropertiesSet() throws Exception {
System.out.println(" 初始化 Man [id=" + getId() + "]");
}
}
<bean id="lookupMethodDemo" class="com.cathy.demo.spring.LookupMethodDemo">
<lookup-method name="getMan" bean="man" />
</bean>
<bean id="man" class="com.cathy.demo.spring.Man" scope="prototype" />
/**
*
* @author zhangwei_david
* @version $Id: MySpringTest.java, v 0.1 2015年6月7日 下午5:50:50 zhangwei_david Exp $
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:META-INF/spring/test-beans.xml")
public class MySpringTest {
@Autowired
private LookupMethodDemo lookupMethodDemo;
@Autowired
private Man man;
@Test
public void test() {
System.out.println(man.getId());
System.out.println(lookupMethodDemo.getId());
}
}
测试的结果是:
初始化 Man [id=4]
初始化 Man [id=13]
初始化 Man [id=48]
48
13
replace-method
我们知道在Spring中可以使用AOP增强一个方法也可以替换一个方法的功能,可是有不少人却不知道在Spring中还有更简单的方式,就是使用replece-method替换一个方法。
/**
* 一个方法替换的简单示例
* @author zhangwei_david
* @version $Id: ReplacMethodDemo.java, v 0.1 2015年7月8日 下午10:26:22 zhangwei_david Exp $
*/
public class ReplaceMethodDemo {
public String getName() {
return "original";
}
}
/**
*
* @author zhangwei_david
* @version $Id: Replacer.java, v 0.1 2015年7月8日 下午10:27:18 zhangwei_david Exp $
*/
public class Replacer implements MethodReplacer {
/**
* @see org.springframework.beans.factory.support.MethodReplacer#reimplement(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
return "replacer";
}
}
<bean id="replacer" class="com.cathy.demo.spring.Replacer" />
<!-- 方法替换的demo -->
<bean id="replaceMethodDemo" class="com.cathy.demo.spring.ReplaceMethodDemo">
<replaced-method name="getName" replacer="replacer" />
</bean>
通过调用replceMethodDemo.getName()的结果是:replacer