使用xml方式实现自动检测和依赖注入需要进行繁琐的xml配置,主要包括两个部分:
(1)使用<bean>...</bean>进行bean的声明;
(2)使用<property>...</property>或者<constructor-arg>...</constructor-arg>进行setter或者构造器的依赖注入
当bean数量比较少时,xml配置比较简单,但是当bean数量非常多,bean和bean之间的依赖也非常复杂,这时候再使用xml配置就会非常繁琐,维护起来也相当复杂,使用注解就相对要简单一些。
还是针对以上两个问题:
(1)Spring框架提供了bean的自动检测来解决bean的声明问题;
(2)Spring框架提供了自动装配功能来解决属性的依赖注入;
1、bean的自动检测
Spring框架提供了以下五种特殊注解来标注类。
@Component -- Spring框架通用的注解,一般用来标注不好归类的类。
@Controller -- 专用于Spring MVC的控制器注解
@Service -- 标识该类为服务
@Repository -- 标识将该类定义为数据仓库
被@Component注解标注的自定义注解
当某一个类被以上注解所标注,并且在Spring的xml文件中做一些配置(具体的配置稍后会提到),Spring框架就会自动将该类识别为一个bean并将其注册到容器中。下面这个例子就是将OracleDaoImpl用@Repository标注为数据仓库,当框架启动时,就会将该类当作一个bean注册到容器中。
package com.springframework.ioc; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; @Repository public class OracleDaoImpl implements MyDao{ private String name; public void setName(String name){ this.name = name; } public String getName(){ return name; } @Override public void addUser(){ System.out.println("this is " + name + " add user..."); } }
可以看到以上OracleDaoImpl类是MyDao的一个子类,MyDao类有时不止有一个实现类,除了OracleDaoImpl之外还有一个MySqlDaoImpl实现类,同样也将这个类用@Repository标注。如下:
package com.springframework.ioc; import java.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; @Repository public class MysqlDaoImpl implements MyDao{ private String name; private int id; public void setName(String name){ this.name = name; } public String getName(){ return name; } @Override public void addUser(){ System.out.println("this is " + name + " id is " + id + " add user..."); } }
这个时候就会有一个问题,我该如何区分这两个bean呢?在xml配置中,我们会根据bean的id来区分,同样在也可使用注解加bean id来进行区分,修改如下:
package com.springframework.ioc; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; @Repository("OracleDao") public class OracleDaoImpl implements MyDao{ private String name; public void setName(String name){ this.name = name; } public String getName(){ return name; } @Override public void addUser(){ System.out.println("this is " + name + " add user..."); } }
将OracleDaoImpl类声明为id为“OracleDao”的bean。
package com.springframework.ioc; import java.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; @Repository("MysqlDao") public class MysqlDaoImpl implements MyDao{ private String name; private int id; public void setName(String name){ this.name = name; } public String getName(){ return name; } public MysqlDaoImpl(){ } public MysqlDaoImpl(String name, int id){ this.name = name; this.id = id; } @Override public void addUser(){ System.out.println("this is " + name + " id is " + id + " add user..."); } }
将MysqlDaoImpl声明为id为“MysqlDao”的bean。
这个时候就可以通过bean的id来对bean进行区分,也就为后面的自动装配做好铺垫。
前面说到,要使用bean的自动检测功能,需要对xml文件进行一下配置,如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> <!--对所有bean进行延迟初始化--> <!-- 自动扫描bean 自动装配bean --> <context:component-scan base-package="com.springframework.ioc"/> </beans>
使用
<context:component-scan base-package="com.springframework.ioc"/>
来指出需要自动检测的包即可。
二、自动装配
在自动检测完成bean,将bean注册到容器中后,接下来的任务就是自动装配了。
Spring框架提供了注解@Autowired标注属性、setter方法或者是构造器来解决对象的依赖问题,举例,要在service层调用dao层,则如下所示:
package com.springframework.ioc; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @Service("myService2") public class MyService2{ @Autowired @Qualifier("OracleDao") private MyDao myDao; public MyDao getMyDao() { return myDao; } }
可以看到,在service层有一个myDao属性,使用@Autowired和@Qualifier来自动装配bean,其中:
使用@Autowired注解表明是自动装配,使用@Qualifier注解来指出要装配的bean的id,以便匹配。
另外需要说明的是:使用的这些注解都是Spring框架提供的,这样代码就会和Spring框架耦合比较大,可以使用基于Java的注解@Inject 和@Named() 分别对应@Autowired和@Qualified()
相关推荐
二、Spring注解方式的依赖注入 1. `@Autowired` 注解:这是Spring中最常用的注解,用于自动装配依赖。当Spring容器扫描到这个注解时,会自动寻找类型匹配的bean进行注入。如果存在多个候选bean,可以通过`@...
7. **组件扫描**:Spring的`@Component`、`@Service`、`@Repository`和`@Controller`等注解用于标记组件类,配合`@ComponentScan`可以自动检测并注册这些类到IoC容器,从而实现bean的自动创建和依赖注入。...
### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一...以上就是关于Spring IoC容器以及注解依赖注入的相关知识点介绍,希望能够帮助大家更好地理解和掌握这一重要的技术。
在Spring框架中,注解是实现依赖注入和配置的核心机制之一。本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一...
本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件`sample-autoconfig`进行理解和实践。 一、XML配置的依赖注入 在Spring早期版本中,XML配置是最常见的DI方式。开发者在Spring的配置文件(如`...
在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...
Spring框架广泛使用注解进行组件扫描和依赖注入,比如`@Component`用于标记一个类作为Spring管理的bean,`@Autowired`则用于自动装配依赖。 模拟Spring的依赖注入,我们可以创建一个简单的容器类,它使用反射来扫描...
本文将深入解析Spring中的注解式编程,主要包括IOC(Inversion of Control,控制反转)的自动装配和依赖注入的解析。 首先,我们来看一下IOC自动装配。IOC是Spring的核心特性,它将对象的创建和管理从应用代码中...
使用Spring注解进行依赖注入,如`@Autowired`和`@Resource`,不仅简化了代码结构,减少了XML配置文件的冗余,还增强了代码的可读性和灵活性。通过合理利用这些注解及其辅助注解如`@Qualifier`,开发者可以更高效地...
在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)实现了组件之间的解耦。 ### 依赖注入的基本概念 依赖注入允许开发者在不修改代码的情况下,通过配置来改变对象间的依赖关系。...
在Spring框架中,注解是实现轻量级依赖注入、AOP(面向切面编程)以及其他功能的关键机制。本文将深入探讨Spring中注解的实现原理,帮助你更好地理解和运用这些核心概念。 首先,让我们从注解的基础知识开始。注解...
Spring提供了多种注解来帮助开发者实现依赖注入,其中包括@Autowired、@Qualifier、@Resource以及@PostConstruct等。下面将详细介绍这些注解的使用方法和区别。 1. @Autowired注解 @Autowired是Spring提供的注解,...
在Spring中,依赖注入可以通过构造器注入、设值注入和接口注入三种方式实现。 1. 构造器注入:通过在类的构造函数中传递依赖对象来完成注入。这种方式在创建对象时就确保了所有依赖都已就绪,适合于对象的依赖关系...
Spring框架是Java开发中的一个核心工具,它通过提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等功能,极大地简化了企业级应用的开发工作。注解配置是Spring 2.5引入...
通过结合依赖注入和前置通知,我们可以创建灵活且模块化的应用。例如,我们可以为服务层创建一个日志切面,然后通过依赖注入将这个切面引入到需要的日志记录的服务中。这样,无需修改服务类的代码,就能实现统一的...
在Spring中,依赖注入主要有三种方式:构造器注入、setter注入和接口注入。构造器注入是在对象实例化时通过构造函数传入依赖;setter注入则是通过调用对象的setter方法来设置依赖;接口注入则相对较少使用,它通过...
**Spring 框架中的控制反转 (IoC) 和依赖注入 (DI)** 在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。...