Spring框架为一个bean配置依赖注入的四种方式:属性注入、构造方法注入、工厂注入、泛型依赖注入。
1、属性注入:属性方法注入利用setXxx() 方法注入 Bean 的属性值或者依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际项目中最常采用的注入方式 。首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性。
一个People的entity对象:
1 packagecom.java1234.entity;2
3 public classPeople {4
5 private intid;6 privateString name;7 private intage;8
9 public People(int id, String name, intage) {10 super();11 this.id =id;12 this.name =name;13 this.age =age;14 }15
16 publicPeople() {17 super();18 //TODO Auto-generated constructor stub
19 }20
21 public intgetId() {22 returnid;23 }24 public void setId(intid) {25 this.id =id;26 }27 publicString getName() {28 returnname;29 }30 public voidsetName(String name) {31 this.name =name;32 }33 public intgetAge() {34 returnage;35 }36 public void setAge(intage) {37 this.age =age;38 }39
40 @Override41 publicString toString() {42 return "People [id=" + id + ", name=" + name + ", age=" + age + "]";43 }44
45
46
47 }
beans.xml配置文件:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/beans/spring-beans.xsd">
6
7
8
9
10
11
12
13
14
一个测试程序:
1 packagecom.java1234.Test;2
3 importorg.springframework.context.support.ClassPathXmlApplicationContext;4
5 importcom.java1234.entity.People;6
7
8 public classTest {9 public static voidmain(String[] args) {10 @SuppressWarnings("resource")11 ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");12 People people = (People)applicationContext.getBean("people");13 System.out.println(people);14 //属性注入:用于给bean对象的属性赋值
15 People people2 = (People)applicationContext.getBean("people2");16 System.out.println(people2);17
18 }
2、构造方法注入:首先要保证被注入的bean要有包含全部属性的构造方法,然后再在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到了节点,该节点有四个属性:
· index是索引,指定注入的属性,从0开始,如:0代表personDao,1代表str属性;
· type是指该属性所对应的类型,如Persondao对应的是com.aptech.dao.PersonDAO;
· ref 是指引用的依赖对象;
· value 当注入的不是依赖对象,而是基本数据类型时,就用value;
一个People的entity对象:同上
beans.xml配置文件:
一个测试程序:
1 packagecom.java1234.Test;2
3 importorg.springframework.context.support.ClassPathXmlApplicationContext;4
5 importcom.java1234.entity.People;6
7
8 public classTest {9 public static voidmain(String[] args) {10 @SuppressWarnings("resource")11 ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");12 //构造方法注入-->通过bean对象属性类型的方法给属性赋值
13 People people3 = (People)applicationContext.getBean("people3");14 System.out.println(people3);15 //构造方法注入-->通过bean对象属性索引值的方法给属性赋值
16 People people4 = (People)applicationContext.getBean("people4");17 System.out.println(people4);18 //构造方法注入-->联合使用两种方法给bean对象属性赋值
19 People people5 = (People)applicationContext.getBean("people5");20 System.out.println(people5);21
22 }
在Spring中,注入依赖对象可以采用手工装配或自动装配,在实际应用开发中建议使用手工装配,因为自动装配会产生许多未知情况,开发人员无法预见最终的装配结果。手工装配依赖对象又分为两种方式:
一种是在XML文件中,通过在bean节点下配置;如上面讲到的使用属性方法注入依赖对象和使用构造器方法注入依赖对象都是这种方式。
另一种就是在java代码中使用注解的方式进行装配,在代码中加入@Resource或者@Autowired、
Autowired是自动注入,自动从spring的上下文找到合适的bean来注入
Resource用来指定名称注入
Qualifier和Autowired配合使用,指定bean的名称,如
1 @Autowired2 @Qualifier("userDAO")3 private UserDAO userDAO;
怎样使用注解的方式来为某个bean注入依赖对象呢?
第一、我们需要在Spring容器的配置文件beans.xml文件中配置以下信息,这些信息是一个Spring配置文件的模板:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3
5 xmlns="http://www.springframework.org/schema/beans"
6
7 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
8
9 xmlns:context="http://www.springframework.org/schema/context"
10
11 xmlns:p="http://www.springframework.org/schema/p"
12
13 xsi:schemaLocation="http://www.springframework.org/schema/beans
14 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
15 http://www.springframework.org/schema/context
16 http://www.springframework.org/schema/context/spring-context-2.5.xsd
17 ">
18
19
注意:只有配置了标签的代码才可以引入注解的命名空间,否则报错。
第二、在配置文件中打开节点,告诉Spring容器可以用注解的方式注入依赖对象;其在配置文件中的代码如下:
1
2
3 ……4
5
6
7 ……8
9
第三,在配置文件中配置bean对象(这个就是对bean对象进行正常的装配);
第四,在需要依赖注入的UserBizImpl类中,声明一个依赖对象,不用生成该依赖对象的setter方法,并且为该对象添加注解:
1 public class UserBizImpl implementsUserBiz {2
3 @Resource(name="userDao")4
5 private UserDAO userDao = null;6
7 public voidaddUser() {8
9 this.userDao.addUser();10
11 }12
13 }
备注:使用注解的方式对依赖进行注入一般有两种写法:使用@Autowired或者@Resource。两者的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,但是当找不到与名称匹配的bean时,才会按类型装配。
比如:我们用@Autowired为上面的代码UserDAO接口的实例对象进行注解,它会到Spring容器中去寻找与UserDAO对象相匹配的类型,如果找到该类型则将该类型注入到userdao字段中;
如果用@Resource进行依赖注入,它先会根据指定的name属性去Spring容器中寻找与该名称匹配的类型,例如:@Resource(name="userDao"),如果没有找到该名称,则会按照类型去寻找,找到之后,会对字段userDao进行注入。
通常我们使用@Resource。
使用注解注入依赖对象不用再在代码中写依赖对象的setter方法或者该类的构造方法,并且不用再配置文件中配置大量的依赖对象,使代码更加简洁,清晰,易于维护。
在Spring IOC编程的实际开发中推荐使用注解的方式进行依赖注入。
3、工厂方法注入
工厂方法注入又分为静态方法注入和非静态方法注入。这两者的区别主要是在装配bean对象的时候不一样,进而导致依赖注入的方法也不一样。
创建一个非静态工厂类:
1 packagecom.java1234.factory;2
3 importcom.java1234.entity.People;4
5 /**
6 * 这是一个专门创建People对象的工厂,但是在这里为了简单起见,我们直接把创建的人的属性直接7 * 固定好了。8 *@authorBaozi9 *10 */
11 public classPeopleFactory {12 publicPeople creatPeople() {13 People people = newPeople();14 people.setId(1000);15 people.setName("小七");16 people.setAge(22);17 returnpeople;18 }19 }
创建一个静态工厂类:
1 packagecom.java1234.factory;2
3 importcom.java1234.entity.People;4
5 /**
6 * 这是一个专门创建People对象的工厂,但是在这里为了简单起见,我们直接把创建的人的属性直接7 * 固定好了。8 *@authorBaozi9 *10 */
11 public classPeopleFactory_Static {12 public staticPeople creatPeople() {13 People people = newPeople();14 people.setId(1001);15 people.setName("小狗");16 people.setAge(29);17 returnpeople;18 }19 }
配置beans.xml文件:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/beans/spring-beans.xsd">
6
7
9
10
13
14
15
16
19
20
测试程序:
1 packagecom.java1234.Test;2
3 importorg.springframework.context.support.ClassPathXmlApplicationContext;4
5 importcom.java1234.entity.People;6
7
8 public classTest {9 public static voidmain(String[] args) {10 @SuppressWarnings("resource")11 ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");12 //工厂方法的非静态方法创建JavaBean对象
13 People people6 = (People)applicationContext.getBean("people6");14 System.out.println(people6);15 //工厂方法的静态方法创建JavaBean对象
16 People people9 = (People)applicationContext.getBean("people9");17 System.out.println(people9);18 }19 }
4、泛型依赖注入:这个设计的知识点比较多,等以后在总结。