• Spring中bean的注入方式


    一、spring基于xml的装配方式

    1、Set()注入:

    这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口)

     1 public class SpringAction {
     2     private SpringDao springDao;
     3 
     4     public void setSpringDao(SpringDao springDao) {
     5         this.springDao = springDao;
     6     }
     7 
     8     public void ok(){
     9         System.out.println("ok");
    10     }
    11 }

    随后编写spring的xml文件中,name属性是class属性的一个别名,class属性指类的全名,因为在SpringAction中有一个公共属性Springdao,所以要在标签中创建一个标签指定SpringDao。标签中的name就是SpringAction类中的SpringDao属性名,ref指下面,这样其实是spring将SpringDaoImpl对象实例化并且调用SpringAction的setSpringDao方法将SpringDao注入:

    1     <!--配置该bean,该bean由spring管理-->
    2     <bean name="springAction" class="com.eliansun.config.SpringAction">
    3         <!--(1)依赖注入,配置当前类中相应的属性-->
    4         <property name="springDao" ref="springDao"></property>
    5     </bean>
    6     <bean name="springDao" class="com.eliansun.config.SpringDao">
    7     </bean>

    2、构造器注入:

    这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来:

    1 private SpringDao springDao;
    2     private SysUser user;
    3     public  SpringAction(SpringDao springDao,SysUser user){
    4         this.springDao = springDao;
    5         this.user = user;
    6     }
    7     private void save(){
    8         System.out.println("两个都有");
    9     }
    在XML文件中同样不用的形式,而是使用标签,ref属性同样指向其它标签的name属性:
    1     <!--配置该bean,该bean由spring管理-->
    2     <bean name="springAction" class="com.eliansun.config.SpringAction">
    3         <!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置-->
    4         <constructor-arg ref="springDao"></constructor-arg>
    5         <constructor-arg ref="user"></constructor-arg>
    6     </bean>
    7     <bean name="springDao" class="com.eliansun.config.SpringDao"></bean>
    8     <bean name="user" class="com.eliansun.domain.sys.SysUser"></bean>

    解决构造方法参数的不确定性:你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:

    下面是设置index,就是参数位置:

    1   <bean name="springAction" class="com.eliansun.config.SpringAction">
    2         <!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置-->
    3         <constructor-arg index="0" ref="springDao"></constructor-arg>
    4         <constructor-arg index="1" ref="user"></constructor-arg>
    5    </bean>

    另一种是设置参数类型:

    <constructor-arg type="java.lang.String" ref=""/>

    3、静态工厂实例化:

    静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过”工程类.静态方法()”来获取对象,而是依然通过spring注入的形式获取:

    public class DaoFactory {
        public static final FactoryDao getStaticFactoryDaoImpl(){
            return new StaticFacotryDaoImpl();
        }
    }

    同样看关键类,这里我需要注入一个FactoryDao对象,这里看起来跟第一种注入一模一样,但是看随后的xml会发现有很大差别:

    public class SpringAction {
        private FactoryDao factoryDao;
        public void setFactoryok(){
            factoryDao.saveFactory();
        }
        public void setFactoryDao(FactoryDao factoryDao){
            this.factoryDao = factoryDao;
        }
    }

    Spring的IOC配置文件,注意看指向的class并不是FactoryDao的实现类,而是指定静态工厂DaoFactory类,并且通过配置 factory-method属性指定调用哪个工厂方法:

    1 <!--配置bean,配置后该类由spring管理--> 
    2 <bean name="springAction" class="com.bless.springdemo.action.SpringAction" > 
    3   <!--(3)使用静态工厂的方法注入对象,对应下面的配置文件(3)--> 
    4   <property name="staticFactoryDao" ref="staticFactoryDao"></property> 
    5   </property> 
    6 </bean> 
    7 <!--(3)此处获取对象的方式是从工厂类中获取静态方法,静态工厂核心语句--> 
    8 <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean> 

    4、实例工厂实例化 :

    实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法:

    1 public class DaoFactory {  
    2     //实例工厂  
    3     public FactoryDao getFactoryDaoImpl(){  
    4         return new FactoryDaoImpl();  
    5     }  
    6 } 

    那么下面这个类没什么说的,跟前面也很相似,但是我们需要通过实例工厂类创建FactoryDao对象:

    public class SpringAction {  
        //注入对象  
        private FactoryDao factoryDao;  
          
        public void factoryOk(){  
            factoryDao.saveFactory();  
        }  
      
        public void setFactoryDao(FactoryDao factoryDao) {  
            this.factoryDao = factoryDao;  
        }  
    }  

    最后看spring配置文件,核心是通过factory-bean的属性指定配置得实例工厂,后使用factory-method属性确定使用工厂中的那个方法:

    1 <!--配置bean,配置后该类由spring管理-->  
    2     <bean name="springAction" class="com.bless.springdemo.action.SpringAction">  
    3         <!--(4)使用实例工厂的方法注入对象,对应下面的配置文件(4)-->  
    4         <property name="factoryDao" ref="factoryDao"></property>  
    5     </bean>  
    6       
    7     <!--(4)此处获取对象的方式是从工厂类中获取实例方法,实例工厂核心语句-->  
    8     <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean>  
    9     <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean> 
    Spring IOC注入方式用得最多的是(1)(2)种,多谢多练就会非常熟练。
            另外注意:通过Spring创建的对象默认是单例的,如果需要创建多实例对象可以在<bean>标签后面添加一个属性:
    <bean name="..." class="..." scope="prototype">  

    二、Spring基于注解注入的两种方式:

    1.@Autowried

    1)默认基于类型查找容器的的Bean进行注入(注入的Bean的实现类是唯一的)。

    2)当实现类的Bean大于一个的时候,需结合@Qualifier,根据Bean的名称来指定需要注入的实例。或者使用@Primary注解标注具体的Bean来让Spring优先选择该Bean进行注入

    3)@Autowried注解可以标注在构造方法、set方法(属性)、字段

    @Qualifier标注在方法参数、set方法、字段上、类型上

    @Primary标注在类上以及方法上

    2.@Resource(JSR250的标准)

    1)默认是基于Bean的名称进行注入,如果查找的name不存在,则会根据类型进行查找

    2)当指定name属性时,则只按照名称进行查找

    3)当指定type属性时,则只按照类型进行查找

    4)当指定name和type时,则这两个属性必须同时满足才可注入

    public class SpringAction {
        @Resource
        private FactoryDao factoryDao;
        
        @Autowired
        private FactoryDao factoryDao1;
    }
  • 相关阅读:
    Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint
    Windows Azure Cloud Service (39) 如何将现有Web应用迁移到Azure PaaS平台
    Azure China (7) 使用WebMetrix将Web Site发布至Azure China
    Microsoft Azure News(4) Azure新D系列虚拟机上线
    Windows Azure Cloud Service (38) 微软IaaS与PaaS比较
    Windows Azure Cloud Service (37) 浅谈Cloud Service
    Azure PowerShell (6) 设置单个Virtual Machine Endpoint
    Azure PowerShell (5) 使用Azure PowerShell创建简单的Azure虚拟机和Linux虚拟机
    功能代码(1)---通过Jquery来处理复选框
    案例1.用Ajax实现用户名的校验
  • 原文地址:https://www.cnblogs.com/lzghyh/p/12580674.html
Copyright © 2020-2023  润新知