平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,

而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,
而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。
 
spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:
  • Set注入
这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口):
  1. 1 package com.bless.springdemo.action;
  2. 2 public class SpringAction {
  3. 3 //注入对象springDao
  4. 4 private SpringDao springDao;
  5. 5 //一定要写被注入对象的set方法
  6. 6 public void setSpringDao(SpringDao springDao) {
  7. 7 this.springDao = springDao;
  8. 8 }
  9. 9
  10. 10 public void ok(){
  11. 11 springDao.ok();
  12. 12 }
  13. 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注入:

  1. 1 <!--配置bean,配置后该类由spring管理-->
  2. 2 <bean name="springAction" class="com.bless.springdemo.action.SpringAction">
  3. 3 <!--(1)依赖注入,配置当前类中相应的属性-->
  4. 4 <property name="springDao" ref="springDao"></property>
  5. 5 </bean>
  6. 6 <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
  • 构造器注入
这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,
这里的注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来:
  1. 1   public class SpringAction {
  2. 2 //注入对象springDao
  3. 3 private SpringDao springDao;
  4. 4 private User user;
  5. 5
  6. 6 public SpringAction(SpringDao springDao,User user){
  7. 7 this.springDao = springDao;
  8. 8 this.user = user;
  9. 9 System.out.println("构造方法调用springDao和user");
  10. 10 }
  11. 11
  12. 12 public void save(){
  13. 13 user.setName("卡卡");
  14. 14 springDao.save(user);
  15. 15 }
  16. 16 }

在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性:

  1. 1 <!--配置bean,配置后该类由spring管理-->
  2. 2 <bean name="springAction" class="com.bless.springdemo.action.SpringAction">
  3. 3 <!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置-->
  4. 4 <constructor-arg ref="springDao"></constructor-arg>
  5. 5 <constructor-arg ref="user"></constructor-arg>
  6. 6 </bean>
  7. 7 <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
  8. 8 <bean name="user" class="com.bless.springdemo.vo.User"></bean>

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

下面是设置index,就是参数位置:
  1. 1 <bean name="springAction" class="com.bless.springdemo.action.SpringAction">
  2. 2 <constructor-arg index="0" ref="springDao"></constructor-arg>
  3. 3 <constructor-arg index="1" ref="user"></constructor-arg>
  4. 4 </bean>

另一种是设置参数类型:

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

Spring 注解注入的几种方式(转)的更多相关文章

  1. Spring静态注入的三种方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen1403876161/article/details/53644024Spring静态注入的三 ...

  2. Spring依赖注入的三种方式

    看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...

  3. Spring之注入的几种方式

    普通注入 在配置文件里 <!-- 构造注入 --> <bean id="user1" class="entity.User"> < ...

  4. SSH深度历险记(八) 剖析SSH核心原则+Spring依赖注入的三种方式

           于java发育.一类程序猿必须依靠类的其他方法,它是通常new依赖类的方法,然后调用类的实例,这样的发展问题new良好的班统一管理的例子.spring提出了依赖注入的思想,即依赖类不由程 ...

  5. SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

           在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...

  6. Spring自动注入的几种方式

    ---恢复内容开始---   @Service("accountEmailService")public class AccountEmailServiceImpl impleme ...

  7. spring 依赖注入的3种方式

    在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来:另一类则是依赖注入,而Spring主要使用的是依赖注入.一般而言,依赖注入可以分为3种方式 ...

  8. spring自动注入的三种方式

    所谓spring自动注入,是指容器中的一个组件中需要用到另一个组件(例如聚合关系)时,依靠spring容器创建对象,而不是手动创建,主要有三种方式: 1. @Autowired注解——由spring提 ...

  9. Spring基于注解注入的两种方式

    1.@Autowried 1)默认基于类型查找容器的的Bean进行注入(注入的Bean的实现类是唯一的). 2)当实现类的Bean大于一个的时候,需结合@Qualifier,根据Bean的名称来指定需 ...

随机推荐

  1. [转] CV Datasets on the web

    转自:CVPapers This material is presented to ensure timely dissemination of scholarly and technical wor ...

  2. 大话设计模式宏观总结——创建型&amp;结构型&amp;行为型

    师傅验收项目的时候.问大话设计模式那三种类型的差别和联系是什么,顿时我傻了眼.由于除了知道这三种类型分别如何称呼以外.从来都没想过为什么这样划分?于是,我便回答:我没想过这个问题.若是从字面上来理解的 ...

  3. BNUOJ 13098 约瑟夫环问题

    C. Josephus Problem 题目链接:http://www.bnuoj.com/v3/contest_show.php?cid=7095#problem/C 题目描述   The hist ...

  4. S6十大特性

    http://www.alloyteam.com/2016/03/es6-front-end-developers-will-have-to-know-the-top-ten-properties/

  5. lightbox2

    http://lokeshdhakar.com/projects/lightbox2/ 简单的demo <html> <head id="head"> &l ...

  6. java使用poi读取doc和docx文件(maven自动导入依赖包)

    java使用poi读取doc和docx文件(maven自动导入依赖包) 于是在网上搜寻了一阵之后才发现原来doc文档和excel一样不能用普通的io流的方法来读取,而是也需要用poi,于是进行了一番尝 ...

  7. 腾讯云SSL证书管理

    2018050608010400y5mbx15awnpwxfhdmd7zqet1i9dzaqkvb6lxzosi4qq5ezbr

  8. E20170804-mk

    epic n. 史诗; 叙事诗; 史诗般的作品; estimate vt. 估计,估算; 评价,评论; 估量,估价; Sprint  vi. 冲刺,全速短跑; n. 全速短跑; 速度或活动的突然爆发; ...

  9. css的一些命名规范

    网页制作中规范使用DIV+CSS命名规则,可以改善优化功效特别是团队合作时候可以提供合作制作效率,具体DIV CSS命名规则CSS命名大全内容篇. 常用DIV+CSS命名大全集合,即CSS命名规则 D ...

  10. JavaScript中相等==和严格相等===的区别

    在JavaScipt中==(相等)和===(严格相等,strick equality 也有译作“恒等”.“全等”)用于比较两个值是否相等,两个运算符允许任意类型的操作数.如果操作数相等则返回true, ...