java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring实例化bean的四种方式

Spring中实例化bean的四种方式详解

投稿:daisy

这篇文章主要给大家介绍了关于Spring中实例化bean的四种方式,分别是setter 方法、构造函数、静态工厂以及实例工厂等四种方法,分别给出了示例代码供大家参考学习,需要的朋友们下面随着小编来一起学习学习吧。

前言

在介绍Bean的实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式。

如果把Spring看作一个大型工厂,那么Spring容器中的Bean就是该工厂的产品。要想使用Spring工厂生产和管理Bean,就需要在配置文件中指明需要哪些Bean,以及需要使用何种方式将这些Bean装配到一起。

Spring容器支持两种格式的配置文件,分别为Properties文件格式和xml文件格式,而在实际的开发当中,最常使用的额是xml文件格式,因此在如下的讲解中,我们以xml文件格式的配置方式进行说明。XML配置文件的根元素是<beans>,其可以包含多个子元素<bean>,每个子元素定义一个Bean,并描述了Bean该如何被装配到Spring容器中。<bean>元素中的属性如下:

在配置文件中,通常一个普通的Bean只需要定义id和class两个属性即可,定义Bean的方式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- 将指定对象配置给spring,让spring创建其实例 -->
    <bean id="userDao" class="com.ioc.UserDaoImpl"/>
    <bean name="userDao1, userDao2" class="com.ioc.UserDaoImpl2"/>
</beans>

上述代码中,分别使用id和name属性定义了两个Bean,并使用class元素指定其对应的实现类,如果未指定id和name,则Spring会将class值当做id使用。

Spring实例化bean的四种方式

本文主要介绍四种实例化bean的方式(注入方式) 或者叫依赖对象实例化的四种方式。上面的程序,创建bean 对象,用的是什么方法 ,用的是构造函数的方式 (Spring 可以在构造函数私有化的情况下把类对象创建出来)

常用的创建方式有以下四种:

1) setter 方法

2) 构造函数

3) 静态工厂

4) 实例工厂

一、用 setter 方式

public interface IUserDao {
    void addUser();
    void delUser();
    void updateUser();
   }
   public class UserDaoImpl implements IUserDao {
    public void addUser() {
     System.out.println("addUser方法被调用了");
    }  
    public void delUser() {
     System.out.println("delUser方法被调用了");
    }  
    public void updateUser() {
     System.out.println("updateUser方法被调用了");
    }
   }
   public class UserAction {
     private IUserDao dao; //dao是一个依赖对象,要由springg进行管理,要生成 get set 方法
       public void execute(){
       dao.addUser();
       dao.updateUser();
       dao.delUser();
     }
    }
//配置文件
<bean name="userAction_name" class="cat.action.UserAction" >
<property name="dao" ref="userDao_name" /> //引用的是下面的名称
</bean> 
<bean name="userDao_name" class="cat.dao.UserDaoImpl" />
//测试
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
UserAction action=(UserAction)ctx.getBean("userAction_name");
action.execute(); 

二、构造函数

public class UserAction {
  //public UserAction(){} 可以保保留一个无参的构造函数 
  //这是几个依赖对象,不用生成get set方法了
  private UserInfo user;
  private String school;
  private IUserDao dao;  
  //希望Spring 由构造函数注入依赖对象
  public UserAction(IUserDao dao,UserInfo user,String school){
    this.dao=dao;
    this.school=school;
    this.user=user;
    } 
  public void execute(){
    dao.addUser();
    dao.updateUser();
    dao.delUser(); 
    System.out.println(user);
    System.out.println(school);
}
//配置文件
<bean name="userInfo_name" class="cat.beans.UserInfo" >
  <property name="id" value="1" />
  <property name="userName" value="周周" />
  <property name="password" value="123" />
  <property name="note" value="这是备注" />
</bean>   
<bean name="userAction_name" class="cat.action.UserAction" >
  <constructor-arg ref="userDao_name" />
  <constructor-arg ref="userInfo_name" />
  <constructor-arg value="哈尔滨师范大学" />
</bean> 
/*
也可以指定 索引和 type 属性 , 索引和type 都可以不指定
<bean name="userAction_name" class="cat.action.UserAction" >
<constructor-arg index="0" ref="userDao_name" type="cat.dao.IUserDao" /> 如果是接口,就不能指定是实现类的类型
<constructor-arg index="1" ref="userInfo_name" type="cat.beans.UserInfo" />
<constructor-arg index="2" value="哈尔滨师范大学" />
</bean>
*/   
<bean name="userDao_name" class="cat.dao.UserDaoImpl" />
//测试
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
UserAction action=(UserAction)ctx.getBean("userAction_name");
action.execute(); 

三、静态工厂方式

//工厂,用来生成dao的实现类
public class UserDaoFactory {
public static IUserDao createUserDaoInstance(){
  return new UserDaoOracleImpl();
  }
} 
public class UserAction {
  private IUserDao dao;//使用工厂方式注值,也要生成set方法
  public void execute(){
    dao.addUser();
    dao.updateUser();
    dao.delUser();
}
public void setDao(IUserDao dao) {
    this.dao = dao;
    } 
}
//配置文件 
<bean name="userAction_name" class="cat.action.UserAction" >
<property name="dao" ref="userDao_name" />
</bean>
<bean name="userDao_name" class="cat.dao.UserDaoFactory" factory-method="createUserDaoInstance" />
//测试
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
UserAction action=(UserAction)ctx.getBean("userAction_name");
action.execute(); 

四、实例工厂

//工厂 =>
public class UserDaoFactory {
//这个方法不是静态的
public IUserDao createUserDaoInstance(){
  return new UserDaoOracleImpl();
  }
}
//配置文件 
<bean name="userAction_name" class="cat.action.UserAction" >
<property name="dao" ref="userDao_name" />
</bean>
<bean name="userDaoFactory_name" class="cat.dao.UserDaoFactory" />
<bean name="userDao_name" factory-bean="userDaoFactory_name" factory-method="createUserDaoInstance" />

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:
阅读全文