`
fjg0427
  • 浏览: 42423 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

spring 注入方式

 
阅读更多
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类 实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该 对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作 不由我们程序员来做而是交给spring容器来做。

spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:
  • Set注入
这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口):
Java代码  收藏代码
  1. package  com.bless.springdemo.action;  
  2. public   class  SpringAction {  
  3.         //注入对象springDao   
  4.     private  SpringDao springDao;  
  5.         //一定要写被注入对象的set方法   
  6.         public   void  setSpringDao(SpringDao springDao) {  
  7.         this .springDao = springDao;  
  8.     }  
  9.   
  10.         public   void  ok(){  
  11.         springDao.ok();  
  12.     }  
  13. }  

随后编写spring的xml文件,<bean>中的 name属性是class属性的一个别名,class属性指类的全名,因为在SpringAction中有一个公共属性Springdao,所以要 在<bean>标签中创建一个<property>标签指定SpringDao。<property>标签中的 name就是SpringAction类中的SpringDao属性名,ref指下面<bean name="springDao"...>,这样其实是spring将SpringDaoImpl对象实例化并且调用SpringAction的setSpringDao方法将SpringDao注入
Java代码  收藏代码
  1. <!--配置bean,配置后该类由spring管理-->  
  2.     <bean name="springAction"   class = "com.bless.springdemo.action.SpringAction" >  
  3.         <!--(1 )依赖注入,配置当前类中相应的属性-->  
  4.         <property name="springDao"  ref= "springDao" ></property>  
  5.     </bean>  
  6. <bean name="springDao"   class = "com.bless.springdemo.dao.impl.SpringDaoImpl" ></bean>  
  

  • 构造器注入
这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了 两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在SpringAction 的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来:
Java代码  收藏代码
  1. public   class  SpringAction {  
  2.     //注入对象springDao   
  3.     private  SpringDao springDao;  
  4.     private  User user;  
  5.       
  6.     public  SpringAction(SpringDao springDao,User user){  
  7.         this .springDao = springDao;  
  8.         this .user = user;  
  9.         System.out.println("构造方法调用springDao和user" );  
  10.     }  
  11.           
  12.         public   void  save(){  
  13.         user.setName("卡卡" );  
  14.         springDao.save(user);  
  15.     }  
  16. }  
 
在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性:
Xml代码  收藏代码
  1. <!--配置bean,配置后该类由spring管理-->   
  2.     < bean   name = "springAction"   class = "com.bless.springdemo.action.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.bless.springdemo.dao.impl.SpringDaoImpl" > </ bean >   
  8.          < bean   name = "user"   class = "com.bless.springdemo.vo.User" > </ bean >   
  解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:
下面是设置index,就是参数位置:
Xml代码  收藏代码
  1. < bean   name = "springAction"   class = "com.bless.springdemo.action.SpringAction" >   
  2.         < constructor-arg   index = "0"   ref = "springDao" > </ constructor-arg >   
  3.         < constructor-arg   index = "1"   ref = "user" > </ constructor-arg >   
  4.     </ bean >   
  另一种是设置参数类型:
Xml代码  收藏代码
  1. < constructor-arg   type = "java.lang.String"   ref = "" />   
 
  • 静态工厂的方法注入
静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取:
Java代码  收藏代码
  1. package  com.bless.springdemo.factory;  
  2.   
  3. import  com.bless.springdemo.dao.FactoryDao;  
  4. import  com.bless.springdemo.dao.impl.FactoryDaoImpl;  
  5. import  com.bless.springdemo.dao.impl.StaticFacotryDaoImpl;  
  6.   
  7. public   class  DaoFactory {  
  8.     //静态工厂   
  9.     public   static   final  FactoryDao getStaticFactoryDaoImpl(){  
  10.         return   new  StaticFacotryDaoImpl();  
  11.     }  
  12. }  

同样看关键类,这里我需要注入一个FactoryDao对象,这里看起来跟第一种注入一模一样,但是看随后的xml会发现有很大差别:
Java代码  收藏代码
  1.   public   class  SpringAction {  
  2.         //注入对象   
  3.     private  FactoryDao staticFactoryDao;  
  4.       
  5.     public   void  staticFactoryOk(){  
  6.         staticFactoryDao.saveFactory();  
  7.     }  
  8.     //注入对象的set方法   
  9.     public   void  setStaticFactoryDao(FactoryDao staticFactoryDao) {  
  10.         this .staticFactoryDao = staticFactoryDao;  
  11.     }  
  12. }  
 
Spring的IOC配置文件,注意看<bean name="staticFactoryDao">指向的class并不是FactoryDao的实现类,而是指向静态工厂DaoFactory,并且配置 factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法
Xml代码  收藏代码
  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 >   
  9.       
 


  • 实例工厂的方法注入
实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法:
Java代码  收藏代码
  1. public   class  DaoFactory {  
  2.     //实例工厂   
  3.     public  FactoryDao getFactoryDaoImpl(){  
  4.         return   new  FactoryDaoImpl();  
  5.     }  
  6. }  

那么下面这个类没什么说的,跟前面也很相似,但是我们需要通过实例工厂类创建FactoryDao对象:
Java代码  收藏代码
  1. public   class  SpringAction {  
  2.     //注入对象   
  3.     private  FactoryDao factoryDao;  
  4.       
  5.     public   void  factoryOk(){  
  6.         factoryDao.saveFactory();  
  7.     }  
  8.   
  9.     public   void  setFactoryDao(FactoryDao factoryDao) {  
  10.         this .factoryDao = factoryDao;  
  11.     }  
  12. }  
 
最后看spring配置文件:
Xml代码  收藏代码
  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>标签后面添加一个属性:
Java代码  收藏代码
  1. <bean name= "..."   class = "..."  scope= "prototype"
分享到:
评论

相关推荐

    Spring三种注入方式(三)

    本篇主要介绍Spring中的三种注入方式,包括构造器注入、设值注入和接口注入。 **一、构造器注入** 构造器注入是通过构造函数来传递依赖对象的一种方式。当类有多个构造函数时,Spring会使用带有最多参数的构造函数...

    Spring的注入方式详解

    下面我们将详细探讨Spring 中的三种注入方式:接口依赖注入(Type1)、setter/getter 注入(Type2,也称为属性注入)和构造方法注入(Type3)。 1. **接口依赖注入(Type1)** 这种注入方式相对不常见,主要适用于...

    Spring三种注入方式(二)

    本篇主要介绍Spring中的三种注入方式,着重讲解在"Spring三种注入方式(二)"中的内容。我们将深入探讨setter注入,这是Spring中最常见的注入方式之一。 ### 一、setter注入 setter注入是通过Spring容器调用对象的...

    Spring注入的方式

    本文将详细探讨Spring中的两种主要注入方式:构造器注入和setter注入,以及它们各自的特点和适用场景。 首先,让我们理解什么是依赖注入(Dependency Injection,简称DI)。在传统的编程模式中,一个类通常会直接...

    spring的注入方式

    Spring提供了多种注入方式,包括set注入、构造注入和自动注入,让我们逐一深入探讨。 1. **Set注入** Set注入是最常见的注入方式,它通过setter方法来设置对象的依赖。首先,你需要在类中声明需要注入的属性,并...

    Spring中你不知道的注入方式编程开发技术共6页.pdf

    本资料“Spring中你不知道的注入方式编程开发技术共6页.pdf”深入探讨了一些不常见但实用的Spring注入方式。尽管描述中提到的文件是一个压缩包,但从其标题我们可以推测其内容可能包括以下几点: 1. **构造器注入**...

    Spring注入方式有哪些

    Spring框架是Java开发中广泛使用的依赖注入(Dependency Injection,简称DI)容器,它极大地提高了代码的可测试性和可维护性。...理解并掌握这些注入方式,对于高效地使用Spring框架进行开发至关重要。

    Spring定义bean的三种方式和自动注入

    Spring提供两种主要的自动注入方式:`byName`和`byType`,以及更推荐的`@Autowired`注解。 - `byName`:根据Bean的属性名查找相同名称的Bean进行注入。 - `byType`:如果Bean的属性类型只有一个匹配的Bean,那么...

    spring学习:依赖注入的几种方式讨论

    Spring Boot引入了一种更智能的依赖注入方式——自动配置。自动配置是通过`@EnableAutoConfiguration`注解启动的,它根据项目中的类路径和特定条件自动配置Bean。例如,如果类路径下存在`MongoClient`的jar,Spring ...

    Spring 三种依赖注入方式.doc

    Spring 三种依赖注入方式 Spring 框架中提供了多种依赖注入方式,其中最常用的三种依赖注入方式分别是接口注入、设值注入和构造函数注入。下面,我们将分别对这三种依赖注入方式进行详细的介绍和分析。 一、接口...

    spring试题(含答案)

    Spring 的依赖注入方式有 setter 注入、构造方法注入和接口注入。依赖注入的目标是在代码之外管理程序组建间的依赖关系。 1. Spring 注入方式有 setter 注入、构造方法注入和接口注入。其中,setter 注入和构造方法...

    Spring依赖注入的方式

    本文将深入探讨Spring中的依赖注入方式,包括构造器注入、设值注入和接口注入。 **一、构造器注入** 构造器注入是通过在类的构造函数中传入依赖对象来实现的。Spring容器在创建对象时,会调用带有相应依赖的构造...

    Spring三种注入方式(一)

    本篇主要介绍Spring中的三种注入方式,包括构造器注入、设值注入和接口注入。 首先,我们来看构造器注入。构造器注入是在创建对象时,通过构造器传递依赖对象。这种方式强制了对象在创建时就必须提供所有必要的依赖...

    关于spring boot中几种注入方法的一些个人看法

    Spring Boot 中的几种注入方法 在 Spring Boot 中,注入是一种非常重要的机制,用于将 bean 对象注入到其他 bean 对象中,以便实现松耦合和高内聚的设计目标。下面我们将对 Spring Boot 中的几种注入方法进行详细的...

    Spring注释 注入方式源码示例,Annotation

    要用注解注入方式,还需要在applicationContext.xml文件加入一行代码: &lt;context:component-scan base-package="Mode"&gt;&lt;/context:component-scan&gt; //表示在包mode下面的类将扫描带有@Component,@Controller,@Service...

    spring依赖注入三种方式 测试源码

    本文将深入探讨Spring中的三种依赖注入方式,并结合源码分析其工作原理。 1. **构造器注入** 构造器注入是通过构造函数来传递依赖对象的。当创建一个类的新实例时,Spring容器会调用带有所需参数的构造函数,从而...

    spring的注入方式.doc

    详细介绍spring的三种注入方式,带有实例和图片

    spring注入原理

    Spring支持两种主要的注入方式:XML配置和注解配置。随着Java的发展,注解方式逐渐成为主流,因为它更简洁、直观。在Spring中,我们通常使用`@Autowired`、`@Qualifier`、`@Resource`等注解来进行依赖注入。 - `@...

    spring注入配置文件

    spring注入配置文件,使用注解注入的

    Web服务器端在Action、dao、service之外实现spring注入

    我们在开发过程中经常会发生spring注入错误或失败的情况,其实Web服务器端在Action、dao、service包之内是很容易实现的,在这些包之外实现spring注入就不容易了,总是出错,其实根本原因是无法获得相应的spring上...

Global site tag (gtag.js) - Google Analytics