通过静态工厂方法创建Bean
-
以往是直接在配置文件中配置Bean的实例,而后再使用Application类获取Bean的实例,而通过静态工厂方法创建Bean则是将Bean对象的创建过程封装到静态工厂类的方法中.
-
而在配置文件的时候,配置的时静态工厂方法的实例,并设置调用的方法,而后通过调用工厂方法获取Bean的实例
-
听着很拗口,其实直接写一遍代码就懂了.
-
示例:实现静态方法创建Bean
- 创建一个接口,工厂类应该创建的是这个接口的实现类的实例
- 创建Encryption接口
package mao.shu.encryption;
public interface Encryption {
/**进行密码加密处理
* @param string
* @return
*/
public String getCode(String string);
}
- 定义MD5Encryption类,实现Encryption接口
package mao.shu.encryption.impl;
import mao.shu.encryption.Encryption;
import java.math.BigInteger;
import java.security.MessageDigest;
public class MD5Encryption implements Encryption {
@Override
public String getCode(String string) throws Exception{
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(string.getBytes());
return new BigInteger(1,md5.digest()).toString(16);
}
}
- 建立Base64Encryption类,同样实现Encryption接口
import mao.shu.encryption.Encryption;
import sun.misc.BASE64Encoder;
public class Base64Encryption implements Encryption {
@Override
public String getCode(String string) throws Exception {
return new BASE64Encoder().encode(string.getBytes("utf-8"));
}
}
- 建立静态实例化工厂类
package mao.shu.encryption.factory;
import mao.shu.encryption.Encryption;
import mao.shu.encryption.impl.Base64Encryption;
import mao.shu.encryption.impl.MD5Encryption;
public class EnctyptionFactory {
public static Encryption getEncryption(String typename){
if("md5".equals(typename)){
return new MD5Encryption();
}else if("base64".equals(typename)){
return new Base64Encryption();
}
}
}
- 定义encryption.xml文件配置工厂类实例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
配置静态工厂类实例
使用factory-method 指定工厂使用的方法
使用 constructor-arg 标签传入方法所需的参数
-->
<bean id="md5" class="mao.shu.encryption.factory.EnctyptionFactory"
factory-method="getEncryption">
<constructor-arg name="typename" value="md5"/>
</bean>
<bean id="base64" class="mao.shu.encryption.factory.EnctyptionFactory"
factory-method="getEncryption">
<constructor-arg name="typename" value="base64"/>
</bean>
</beans>
- 测试程序
package mao.shu.encryption;
import mao.shu.encryption.impl.Base64Encryption;
import mao.shu.encryption.impl.MD5Encryption;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import static org.junit.Assert.*;
public class EncryptionTest {
private ApplicationContext applicationContext;
@Before
public void before() {
this.applicationContext = new ClassPathXmlApplicationContext("mao/shu/encryption/encryption.xml");
}
@Test
public void test() throws Exception {
MD5Encryption md5 = this.applicationContext.getBean("md5",MD5Encryption.class);
String md5Password = md5.getCode("原密码");
Base64Encryption base64 = this.applicationContext.getBean("base64",Base64Encryption.class);
String base64Password = base64.getCode("原密码");
System.out.println("md5加密处理:"+md5Password);
System.out.println("base64加密处理:"+base64Password);
}
}
- 输出结果
通过调用实例工厂方法创建Bean
- 名字听着很高大上,实际上只不过是对工厂类的对象创建过程进行再一次的封装,本质上和直接通过静态工厂创建Bean的实例过程没什么区别.
- 唯一区别的就是需要将工厂类创建子类对象的方法 改为非静态的.
- 修改EnctyptionFactory 工厂类的getEncryption()方法
public Encryption getEncryption(String typename){
if("md5".equals(typename)){
return new MD5Encryption();
}else if("base64".equals(typename)){
return new Base64Encryption();
}
return null;
}
- 修改encryption.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置静态工厂类实例-->
<bean id="encryptionFactory" class="mao.shu.encryption.factory.EnctyptionFactory"/>
<!--
配置bean实例
使用factory-bean 配置工厂类的实例
使用factory-method 配置工厂类调用的方法
使用 constructor-arg 传入方法所需要的参数
-->
<bean id="md5" factory-bean="encryptionFactory"
factory-method="getEncryption">
<constructor-arg name="typename" value="md5"/>
</bean>
<bean id="base64" factory-bean="encryptionFactory"
factory-method="getEncryption">
<constructor-arg name="typename" value="base64"/>
</bean>
</beans>
-
重新执行测试程序
-
结果一样