zoukankan      html  css  js  c++  java
  • 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" />
  • 相关阅读:
    设计模式之观察者模式
    设计模式之代理模式
    用Javascript模拟微信飞机大战游戏
    [Leetcode] Remove Duplicates from Sorted List II
    [Leetcode] Remove Duplicates from Sorted List
    [Leetcode] Remove Duplicates from Sorted Array II
    [Leetcode] Palindrome Number
    [Leetcode] Decode Ways
    [Leetcode] Climbing Stairs
    [Leetcode] Maximum Subarray
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/8146563.html
Copyright © 2011-2022 走看看