`

Spring 注解方式实现自动检测和依赖注入

阅读更多

使用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依赖注入——java项目中使用spring注解方式进行注入.rar

    二、Spring注解方式的依赖注入 1. `@Autowired` 注解:这是Spring中最常用的注解,用于自动装配依赖。当Spring容器扫描到这个注解时,会自动寻找类型匹配的bean进行注入。如果存在多个候选bean,可以通过`@...

    Spring demo 自动检测注解

    7. **组件扫描**:Spring的`@Component`、`@Service`、`@Repository`和`@Controller`等注解用于标记组件类,配合`@ComponentScan`可以自动检测并注册这些类到IoC容器,从而实现bean的自动创建和依赖注入。...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一...以上就是关于Spring IoC容器以及注解依赖注入的相关知识点介绍,希望能够帮助大家更好地理解和掌握这一重要的技术。

    对Spring中注解怎么实现的一些基本原理

    在Spring框架中,注解是实现依赖注入和配置的核心机制之一。本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一...

    spring学习:依赖注入的几种方式讨论

    本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件`sample-autoconfig`进行理解和实践。 一、XML配置的依赖注入 在Spring早期版本中,XML配置是最常见的DI方式。开发者在Spring的配置文件(如`...

    详解Spring基于Annotation的依赖注入实现

    在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...

    使用反射和注解模拟Spring的依赖注入

    Spring框架广泛使用注解进行组件扫描和依赖注入,比如`@Component`用于标记一个类作为Spring管理的bean,`@Autowired`则用于自动装配依赖。 模拟Spring的依赖注入,我们可以创建一个简单的容器类,它使用反射来扫描...

    spring注解方式解析

    本文将深入解析Spring中的注解式编程,主要包括IOC(Inversion of Control,控制反转)的自动装配和依赖注入的解析。 首先,我们来看一下IOC自动装配。IOC是Spring的核心特性,它将对象的创建和管理从应用代码中...

    Spring注解注入属性

    使用Spring注解进行依赖注入,如`@Autowired`和`@Resource`,不仅简化了代码结构,减少了XML配置文件的冗余,还增强了代码的可读性和灵活性。通过合理利用这些注解及其辅助注解如`@Qualifier`,开发者可以更高效地...

    spring依赖注入的实现原理

    在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)实现了组件之间的解耦。 ### 依赖注入的基本概念 依赖注入允许开发者在不修改代码的情况下,通过配置来改变对象间的依赖关系。...

    spring中注解的实现原理

    在Spring框架中,注解是实现轻量级依赖注入、AOP(面向切面编程)以及其他功能的关键机制。本文将深入探讨Spring中注解的实现原理,帮助你更好地理解和运用这些核心概念。 首先,让我们从注解的基础知识开始。注解...

    spring注解注入示例详解.pdf

    Spring提供了多种注解来帮助开发者实现依赖注入,其中包括@Autowired、@Qualifier、@Resource以及@PostConstruct等。下面将详细介绍这些注解的使用方法和区别。 1. @Autowired注解 @Autowired是Spring提供的注解,...

    spring依赖注入底层详解

    在Spring中,依赖注入可以通过构造器注入、设值注入和接口注入三种方式实现。 1. 构造器注入:通过在类的构造函数中传递依赖对象来完成注入。这种方式在创建对象时就确保了所有依赖都已就绪,适合于对象的依赖关系...

    Spring 注解 方式配制的小demo

    Spring框架是Java开发中的一个核心工具,它通过提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等功能,极大地简化了企业级应用的开发工作。注解配置是Spring 2.5引入...

    Spring的依赖注入,与前置通知的实例

    通过结合依赖注入和前置通知,我们可以创建灵活且模块化的应用。例如,我们可以为服务层创建一个日志切面,然后通过依赖注入将这个切面引入到需要的日志记录的服务中。这样,无需修改服务类的代码,就能实现统一的...

    spring依赖注入

    在Spring中,依赖注入主要有三种方式:构造器注入、setter注入和接口注入。构造器注入是在对象实例化时通过构造函数传入依赖;setter注入则是通过调用对象的setter方法来设置依赖;接口注入则相对较少使用,它通过...

    Spring 控制反转 依赖注入

    **Spring 框架中的控制反转 (IoC) 和依赖注入 (DI)** 在软件开发中,控制反转(Inversion of Control,简称IoC)是一种设计原则,它将对象的创建和管理权从代码中剥离出来,转交给一个外部容器(如Spring框架)。...

Global site tag (gtag.js) - Google Analytics