• 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" />
  • 相关阅读:
    MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStart
    (转)Spring MVC
    ios>android>javaee
    css标准导航代码
    图片对齐问题
    display:inline、block、inline-block的区别
    css怎么引用某张图片?链接要怎么写
    论怎么写好一篇实验报告
    路由器及其配置方法
    (转)MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet
  • 原文地址:https://www.cnblogs.com/7758521gorden/p/8149399.html
Copyright © 2020-2023  润新知