Spring中想要使用注解进行依赖注入,需要进行如下配置:

<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<context:annotation-config/>
</beans>

Spring自带依赖注入的注解

@Required,该注解必须用是setter方法上面,目的是强制要求提供setter所需数据,否则报错。

例如,BeanA中的字段field,有一个setField( T field)方法。当在该方法上使用了@Required之后,在XML中创建BeanA时就必须给出设置field所需的数据。

如下所示:

package o1.bean;

import org.springframework.beans.factory.annotation.Required;

public class BeanA {
private String message; public String getMessage(){
return message;
} @Required //只能放在setter上,在XML配置BeanA时必须指定setter注入,否则在Spring容器启动时将抛出异常
public void setMessage(String message){
this.message = message;
}
}
<?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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!--开启注解支持-->
<context:annotation-config/> <bean class="o1.bean.BeanA">
<!--因为有了@Required,所以这里必须提供,否则报错-->
<property name="message" ref="message"/>
</bean> <bean name="message" class="java.lang.String">
<constructor-arg index="0" value="hello world"/>
</bean> </beans>
package o1;

import o1.bean.BeanA;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class A {
private ApplicationContext applicationContext; @Before
public void setUp(){
applicationContext=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
} @Test
public void run1(){
BeanA bean = applicationContext.getBean(BeanA.class);
System.out.println(bean.getMessage());
} }

@Autowired(required=true)

自动注入,required=true的作用与@Required相同。

可用于构造器、字段、方法。

默认根据参数类型自动装配,但必须只能有一个候选项(required=false则可以允许0个候选项)。

@Value(value="SpEL")

可用于字段、方法(@Autowired method)。

如:

@Value(value="#{message}")
private String message;
@Autowired
public void initMessage(@Value(value = "#{message}") String message) {
this.message = message;
}

@Qualifier(value="限定标识符")

可用于方法、字段、参数。

配合@Autowired使用,可用于多个候选项的情况。

实例如下:

package o1.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import javax.sql.DataSource; public class BeanB {
private DataSource dataSourceA;
private DataSource dataSourceB; public DataSource getDataSourceA(){
return dataSourceA;
} @Autowired
public void initDataSource(@Qualifier( "mysqlDataSource2" ) DataSource dataSource){ //
this.dataSourceA =dataSource;
} public DataSource getDataSourceB(){
return dataSourceB;
} @Autowired
public void setDataSourceB(@Qualifier( "mysqlDataSource1" ) DataSource dataSourceB){
this.dataSourceB = dataSourceB;
}
}
<?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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!--开启注解支持-->
<context:annotation-config/>
<context:property-placeholder location="db.properties"/> <bean class="o1.bean.BeanB"/> <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<qualifier type="org.springframework.beans.factory.annotation.Qualifier" value="mysqlDataSource1"/> <!--type可以省略-->
<property name="driverClassName" value="${driverClass}"/>
<property name="url" value="${jdbcUrl_1}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean> <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<qualifier type="org.springframework.beans.factory.annotation.Qualifier" value="mysqlDataSource2"/>
<property name="driverClassName" value="${driverClass}"/>
<property name="url" value="${jdbcUrl_2}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean> </beans>
package o1;

import o1.bean.BeanB;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class B {
private ApplicationContext applicationContext; @Before
public void setUp(){
applicationContext=new ClassPathXmlApplicationContext("classpath:applicationContextB.xml");
} @Test
public void run1(){
BeanB bean = applicationContext.getBean(BeanB.class);
System.out.println(bean.getDataSourceA());
System.out.println(bean.getDataSourceB()); }
}

db.properties

driverClass=com.mysql.jdbc.Driver
jdbcUrl_1=jdbc\:mysql\://localhost\:3306/testdb1?useUnicode=true&amp;characterEncoding=UTF8
jdbcUrl_2=jdbc\:mysql\://localhost\:3306/testdb2?useUnicode=true&amp;characterEncoding=UTF8
user=root
password=root

如果有几个常用的DataSource,那么可以自定义注解来使用,而不必每次都是@Qualifier("xx")。如下:

自定义@MySQL和@Oracle

package o1.customize_qualifier;

import org.springframework.beans.factory.annotation.Qualifier;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target( {ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE} )
@Retention( RetentionPolicy.RUNTIME )
@Qualifier
public @interface MySQL {
}
package o1.customize_qualifier;

import org.springframework.beans.factory.annotation.Qualifier;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target( {ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE} )
@Retention( RetentionPolicy.RUNTIME )
@Qualifier
public @interface Oracle {
}

使用qualifier来限定需要注入的bean:

<?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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!--开启注解支持-->
<context:annotation-config/> <bean class="o1.bean.BeanC"/> <bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<qualifier type="o1.customize_qualifier.MySQL" value="mysqlDataSource"/><!--value可以省略!-->
</bean> <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<qualifier type="o1.customize_qualifier.Oracle" value="oracleDataSource"/>
</bean> </beans>

要被注入的bean:

package o1.bean;

import o1.customize_qualifier.MySQL;
import o1.customize_qualifier.Oracle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import javax.sql.DataSource; public class BeanC {
private DataSource dataSourceA;
private DataSource dataSourceB; @Autowired
public void initDataSource(@MySQL DataSource dataSourceA, @Oracle DataSource dataSourceB){
this.dataSourceA = dataSourceA;
this.dataSourceB = dataSourceB;
} public DataSource getDataSourceA(){
return dataSourceA;
} public DataSource getDataSourceB(){
return dataSourceB;
} }

测试:

package o1;

import o1.bean.BeanB;
import o1.bean.BeanC;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.sql.DataSource; public class C {
private ApplicationContext applicationContext; @Before
public void setUp(){
applicationContext=new ClassPathXmlApplicationContext("classpath:applicationContextC.xml");
} @Test
public void run1(){
BeanC bean = applicationContext.getBean(BeanC.class);
DataSource dataSource1 = applicationContext.getBean("dataSource1", DataSource.class);
DataSource dataSource2 = applicationContext.getBean("dataSource2", DataSource.class); Assert.assertEquals(dataSource1, bean.getDataSourceA());
Assert.assertEquals(dataSource2, bean.getDataSourceB());
}
}

==================================================

使用<context:annotation-config/>标签来开启注解形式的依赖注入。

使用<context:component-scan/>标签来表示需要要自动注册Bean定义,而通过base-package属性指定扫描的类路径位置。

注意,<context:component-scan/>默认开启了annotation-config。

使用<aop:aspectj-autoproxy/>标签开启Spring对@AspectJ风格切面的支持。

@AspectJ风格的切面可以通过@Compenent注解标识其为Spring管理Bean,而@Aspect注解不能被Spring自动识别并注册为Bean,必须通过@Component注解来完成。

Spring零散所得

<<<未完待续>>>

声明:源自张开涛的Spring教程,再加工。

Spring 依赖注入(DI)的注解的更多相关文章

  1. Spring 依赖注入(DI) 的三种方式 和 对集合类型的注入

    // 分别省略了getter setter public class Student { private String name; private int age; private Teacher t ...

  2. Helloworld之Spring依赖注入/控制反转(DI/IoC)版

    Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依 ...

  3. Spring框架学习笔记(1)——控制反转IOC与依赖注入DI

    Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...

  4. 1.4 Spring 依赖注入(DI)和控制反转(IOC)详解

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1  Spring 依赖注 ...

  5. 小白都能看懂的 Spring 源码揭秘之依赖注入(DI)源码分析

    目录 前言 依赖注入的入口方法 依赖注入流程分析 AbstractBeanFactory#getBean AbstractBeanFactory#doGetBean AbstractAutowireC ...

  6. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  7. spring(3)------控制反转(IOC)/依赖注入(DI)

    一.spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control).它把传统上由程序代码直接操控的对象的调用权交给容器.通过容器来实现对象组件的装配和管理. 所谓 ...

  8. SSM框架之Spring(3)IOC及依赖注入(基于注解的实现)

    Spring(3)IOC及依赖注入(基于注解的实现) 学习基于注解的 IoC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样 的,都是要降低程序间的耦合.只是配置的形 ...

  9. Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解

    一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...

  10. Spring(2):依赖注入DI

    依赖注入DI 当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在Spring里,创建被 ...

随机推荐

  1. 为训练深度OCR 图像,生成文本图像

    https://github.com/Sanster/text_renderer Generate text images for training deep learning ocr model 在 ...

  2. osX显示隐藏文件

    终端输入: defaults write com.apple.finder AppleShowAllFiles -bool YES

  3. Oracle学习笔记之一,重温范式

    第一范式(1NF) 第一范式是第二和第三范式的基础,是最基本的范式.第一范式包括下列的指导原则: 数据组的每个属性只可以包含一个值. 关系中的每个数组必须只包含相同数量的值. 关系中的每个数组一定不能 ...

  4. Android --------------------ActionBar 与 ViewPager 和 ActionTab 切换 的源代码实现

    參考网址: 点击打开链接 源代码实现: package com.example.actionbardemo2; import android.app.ActionBar; import android ...

  5. Ruby的DevKit名词解释

    为了加快运行速度,Ruby下好多扩展包都是用C语言写的二进制包,如果我们要安装就要重新编译,DevKit包主要就是将编译用的工具链打包,解决了众多依赖问题,方便了群众. 但是,在实际安装中,可能还会遇 ...

  6. 在vps上安装中文环境

    现在vps默认都是安装的英文环境,其实变成中文环境也很简单.我记录以下在ubuntu下如何改变为中文环境. 1.安装中文环境包. sudo apt install language-pack-zh-h ...

  7. [k8s]kube-router替代kube-proxy实现svc网络和pod网络

    本文讲解了kube-router部署,无需在部署kube-proxy了. kube-router采用lvs实现svc网络,采用bgp实现pod网络. kube-router也是基于cni网络,本文是容 ...

  8. Loadrunner常用操作

    LoadRunner 参数化 为什么需要参数化? 大众理解:为了更加真实的模拟用户操作 底层原理: 1,应用服务,数据库会校验该值的唯一性(unique key) 2,为了避免数据库的查询缓存对性能测 ...

  9. C++虚函数表与虚析构函数

    1.静态联编和动态联编联编:将源代码中的函数调用解释为要执行函数代码. 静态联编:编译时能确定唯一函数.在C中,每个函数名都能确定唯一的函数代码.在C++中,因为有函数重载,编译器须根据函数名,参数才 ...

  10. js求n行m列二维数组对角线元素之和的思路

    window.onload=function(){   var arr =  [[1,2,4],[5,6,7],[8,9,10]];   var i =3,j=3;   var result1=0,r ...