前面已经介绍了如何上手Spirng编码以及IOC的核心概念,今天给大家讲解Spring的另一个重点——DI。

Spring核心模块
IoC 其实有两种方式,一种就是 DI(Dependency Injection) ,而另一种是 DL(Dependency Lookup)即依赖查找。前者是当前组件被动接受IoC容器注入的依赖组件,而后者则是组件主动去某个服务注册地查找其依赖的组件,我们这里重点介绍DI。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。Spring是通过反射技术实现注入的,它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性。
简单的总结一下依赖注入:
注入的方式主要包括Setter注入(重点)、构造器注入和参数直接注入。还有拓展方式注入,即:p命名空间注入和c命名空间注入,这里就不再展开介绍了,有兴趣的同学可以自行研究。
IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 bean 后,调用该 bean的setter 方法(类中必须有属性的set方法),即可实现基于setter的DI
代码如下:
- public class Address {
 - private String address;
 - public String getAddress() {
 - return address;
 - }
 - public void setAddress(String address) {
 - this.address = address;
 - }
 - }
 
- import java.util.List;
 - import java.util.Map;
 - import java.util.Properties;
 - import java.util.Set;
 - public class Student {
 - private String name;
 - private Address address;
 - private String[] books;
 - private List
 hobbys; - private Map
 card; - private Set
 games; - private String wife;
 - private Properties info;
 - public void setName(String name) {
 - this.name = name;
 - }
 - public String getName() {
 - return this.name;
 - }
 - public void setAddress(Address address) {
 - this.address = address;
 - }
 - public void setBooks(String[] books) {
 - this.books = books;
 - }
 - public void setHobbys(List
 hobbys) { - this.hobbys = hobbys;
 - }
 - public void setCard(Map
 card) { - this.card = card;
 - }
 - public void setGames(Set
 games) { - this.games = games;
 - }
 - public void setWife(String wife) {
 - this.wife = wife;
 - }
 - public void setInfo(Properties info) {
 - this.info = info;
 - }
 - public void show(){
 - System.out.println("name="+ name
 - +",address="+ address.getAddress()
 - +",books="
 - );
 - for (String book:books){
 - System.out.print("<<"+book+">>\t");
 - }
 - System.out.println("\nhobbys:"+hobbys);
 - System.out.println("card:"+card);
 - System.out.println("games:"+games);
 - System.out.println("wife:"+wife);
 - System.out.println("info:"+info);
 - }
 - }
 
配置文件
配置文件中把name 赋值为小明,即完成了对代码 private String name的注入。
测试类
- public static void main(String[] args) {
 - ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
 - Student student=(Student)context.getBean("student");
 - System.out.println(student.getName());
 - }
 
运行结果,输出:小明
常见注入方式的xml 配置如下:
使用ref进行引入其他bean
数组注入
数学 语文 英语 
List注入
听歌 看电影 打游戏 
Map注入
set注入
CS 斗地主 消消乐 
Null注入
Properties注入
123456 男 小明 
测试方法
- public static void main(String[] args) {
 - ApplicationContextcontext = new ClassPathXmlApplicationContext("bean1.xml");
 - Studentstudent=(Student)context.getBean("student");
 - student.show();
 - }
 
运行结果,输出:
name=小明,address=北京,books=
<<数学>> <<语文>> <<英语>>
hobbys:[听歌, 看电影, 打游戏]
card:{招行=123456789, 工行=987654321}
games:[CS, 斗地主, 消消乐]
wife:null
info:{学号=123456, 性别=男, 姓名=小明}
指IoC 容器使用构造方法注入被依赖的实例。基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖。
代码如下:
- public class Student2{
 - private String name;
 - public Student2(String name) {
 - this.name = name;
 - }
 - public void setName(String name) {
 - this.name = name;
 - }
 - public void show(){
 - System.out.println("name="+ name );
 - }
 - }
 
配置文件中设置
测试代码
- public static void main(String[] args) {
 - ApplicationContextcontext = new ClassPathXmlApplicationContext("bean3.xml");
 - Student2 user = (Student2) context.getBean("student1")
 - user.show();
 - }
 
运行结果:
name=kevin1
主要通过注解@Autowired、@Qualifier和@Resource来实现
@Autowired是按类型自动转配的,不支持id匹配。
需要导入 spring-aop的包
配置文件中设置<
context:annotation-config/>
代码:
- public class Animal {
 - @Autowired private Cat cat; //运行时spring通过DI会把Cat类实例化
 - @Autowired private Dog dog;//运行时spring通过DI会把Dog类实例化
 - public void printCatshot() {
 - cat.shout();
 - }
 - public void printDogshot() {
 - dog.shout();
 - }
 - }
 
@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在一个类型的不同bean时,就会抛出BeanCreationException异常;我们可以使用@Qualifier配合@Autowired来解决这些问题。
代码:
- @Autowired
 - @Qualifier(value= "dog1")
 - private Dog dog1;
 - beans.xml
 
@Resource是J2EE提供的, 需导入Package: javax.annotation.Resource;
@Resource如有指定的name属性,先按该属性进行byName方式查找装配,其次再进行默认的byName方式进行装配,都不成功,则报异常。
代码
- @Resource(name = "dog2")
 - private Dog dog;
 - beans.xml
 
IoC通过DI技术主要实现了以下两点:
【编辑推荐】
                本文题目:测试同学上手Spring之DI深入解析
                
                本文地址:http://www.csdahua.cn/qtweb/news42/422042.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网