spring中将静态工厂方法和实例工厂方法注入到ioc容器中

在我们刚开始学习spring的ioc技术时,我们都是通过在applicationContext.xml配置文件中将我们的类通过配置注入到IOC容器中的,我们可能会很熟练的将一个类注入到IOC中,但是怎样将静态工厂方法和实例工厂方法的返回对象注入到IOC容器中呢?下面我们就一起来看看吧.

将静态工厂方法注入到IOC容器中

首先我们创建一个Animal的实体类,这个类很简单,当它被创建时会打印创建时的信息

public class Animal{
    public Animal(){
        System.out.println("Animal is creating....");
    }
}

然后我们再来创建一个静态工厂方法,这个getAnima()l静态方法在被调用时会返回一个Animal对象

给调用者.

public class UserDao {
    //静态工厂
    public static Animal getAnimal(){
        return new Animal();
    }
}

那么我们如何将这个静态工厂方法交给IOC容器管理呢?很简单,bean标签中有一个factory-method属性,我们只需将class指定为UserDao这个类的引用路径,并且将factory-method的值指定为静态工厂方法的方法名就可以了:

 <!-- bean实例化静态工厂  -->
 <!-- 直接将静态方法所在的类作为class值, 静态方法作为factory-method的值即可   -->
 <bean id="animal" class="cn_java_factory.UserDao" factory-method="getAnimal"/>

接下来我们来测试一下:

public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //得到静态工厂方法创造的Animal对象
        Animal animal = (Animal) applicationContext.getBean("animal");
    }

结果:

Animal is creating....

进程已结束,退出代码0

可以看到Animal对象已经被IOC创造出来了.

将实例化工厂方法注入到IOC容器中

这里先再创建一个Person类

public class Person {
    public Person(){
        System.out.println("Person is creating....");
    }
}

然后我们再在UserDao这个类中创建一个实例化的工厂方法:getPerson

public class UserDao {
    //实例工厂
    public Person getPerson(){
        return new Person();
    }
}

第一种方法:

实例化工厂方法的注入与静态工厂方法的注入有点不同,因为我们知道静态方法不需要new出一个对象,直接通过类名.静态方法名()就可以进行调用,但是实例方法需要先new出对象,才可以进行调用,所以要想将实例化工厂方法注入到IOC容器中,首先要得到一个对象,通过这个对象才能将实例化工厂函数注入到IOC容器中:

 <!-- bean实例化实例工厂   -->
    <!-- 由于实例化工厂要先得到对象才可以得到工厂函数,所以首先得到对象的bean才可以进行实例化   -->
    <bean id="userDao" class="cn_java_factory.UserDao"/>
    <bean id="person" factory-bean="userDao" factory-method="getPerson"/>

我们可以看出我们首先要得到UserDao这个对象,将这个对象赋给另一个bean的factory-bean属性,再通过我们前面提到的factory-method指出工厂函数的方法名才可以实现我们的目的.下面来介绍另外一种更加常用的方法.

第二种方式(在许多框架中都是使用这种方法进行IOC的注入)

通过实现FactoryBean这个接口的getObject()和getObjectType()方法也可以将实例化工厂方法注入到IOC中

//FactoryBean<E>的泛型类型写你通过实例化工厂方法得到的类型
public class PersonFactory implements FactoryBean<Person> {
    @Override
    public Person getObject() throws Exception {
        //先得到一个UserDao对象
        UserDao userDao = new UserDao();
        //再通过UserDao对象的getPerson实例化工厂方法得到Person类型的对象
        return userDao.getPerson();
    }
    
    //因为通过这个实例化工厂方法得到Person类型,所以我们返回Person类型的字节码对象
    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }

    //是否采用单例工厂模式制造对象
    @Override
    public boolean isSingleton() {
        return true;
    }
}

然后我们只要在配置文件中写上PersonFactory这个类的配置就可以了

 <!--  还可以通过实现FactoryBean来实现实例工厂的实例化  -->
<bean id="person" class="cn_java_factory.PersonFactory"/>

然后我们再来测试一下:

 public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = (Person) applicationContext.getBean("person");
    }

 结果:

Person is creating....

进程已结束,退出代码0

可以看到结果也是正确的.

上面就是spring中将静态工厂方法和实例工厂方法注入到ioc容器中的方法了,感谢您的阅读!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值