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

而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,
而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。
 
spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:
  • Set注入
这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口):
 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注入:

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两个参数值传进来:
 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属性:

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,就是参数位置:
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>

另一种是设置参数类型:

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. Linuxserver沦陷为肉鸡的全过程实录

    Linuxserver沦陷为肉鸡的全过程实录 Linuxserver沦陷为肉鸡的全过程实录 从防火墙瘫痪说起 查找黑客行踪的方法 沦陷过程分析 1 oracle用户password被破解 2 黑客动作 ...

  2. LeetCode 443. String Compression (压缩字符串)

    题目标签:String 这一题需要3个pointers: anchor:标记下一个需要存入的char read:找到下一个不同的char write:标记需要存入的位置 让 read指针 去找到下一个 ...

  3. mybatis Generator生成代码及使用方式(转载)

    转载自:http://www.cnblogs.com/fengzheng/p/5889312.html 文章很棒,很不错,转了.

  4. shell curl 实现rest 并发测试

    for i in {1..50}; do curl http://10.43.95.26:5812/rdk/service/app/example/server/my_service & do ...

  5. codeforces 949B A Leapfrog in the Array

    B. A Leapfrog in the Array time limit per test 2 seconds memory limit per test 512 megabytes input s ...

  6. POJ 3268 最短路应用

    POJ3268 题意很简单 正向图跑一遍SPFA 反向图再跑一边SPFA 找最大值即可. #include<iostream> #include<cstdio> #includ ...

  7. Scala快速统计文件中特定单词,字符的个数

    val fileContent=Source.fromFile("/home/soyo/桌面/ss5.txt").getLines.mkString(",") ...

  8. 引水工程 Kruskal + Prim

    Kruskal题解 : 以案例输入为例 有五个缺水地区 , 这个个缺水地区之间建立联系的费用已经给出 并且之间水库的费用也已经给出 , 自己水库也已看为 是另一个 点 , 这样就有了 6 个点 , 这 ...

  9. python自动化测试学习笔记-6redis应用

    上次我们学到了redis的一些操作,下面来实际运用以下. 这里我们先来学习一下什么是cookie和session. 什么是Cookie 其实简单的说就是当用户通过http协议访问一个服务器的时候,这个 ...

  10. Django总结三

    回顾: - 装饰器 模板 - def wrapper(func): def inner(*args, **args): 执行被执行函数之前的操作 res = func(*args, **args) 执 ...