在我们刚开始学习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容器中的方法了,感谢您的阅读!!