Spring4---通过工厂类创建Bean

通过静态工厂方法创建Bean

  • 以往是直接在配置文件中配置Bean的实例,而后再使用Application类获取Bean的实例,而通过静态工厂方法创建Bean则是将Bean对象的创建过程封装到静态工厂类的方法中.

  • 而在配置文件的时候,配置的时静态工厂方法的实例,并设置调用的方法,而后通过调用工厂方法获取Bean的实例

  • 听着很拗口,其实直接写一遍代码就懂了.
    在这里插入图片描述

  • 示例:实现静态方法创建Bean

  1. 创建一个接口,工厂类应该创建的是这个接口的实现类的实例
  • 创建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>
  • 重新执行测试程序

  • 结果一样

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值