Spring注解注⼊的⼏种⽅式(转)
平常的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    }
实例化bean的三种方式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=""/>