Spring4笔记5--基于注解的DI(依赖注入)
基于注解的DI(依赖注入):
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 Bean 实例。只需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。
<?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.xsd">
<!-- 只扫描子包,不扫描当前包 -->
<!-- <context:component-scan base-package="com.tongji.*"/> -->
<!-- 先扫描子包,再扫描当前包 -->
<!-- <context:component-scan base-package="com.tongji"/> --> <context:component-scan base-package="com.tongji.di01"/>
</beans>
注意:添加的约束http://www.springframework.org/schema/context/spring-context.xsd
注解基本注入:
package com.tongji.di01; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; //与本注解具有相同功能的注解还有三个:
//@Repository:注解在Dao接口的实现类上,表示当前Dao类为组件
//@Service:注解在Service接口的实现类上,表示当前Service类为组件
//@Controller:注解在Controller接口的实现类上,表示当前Controller类为组件(SpringMVC)
@Component("student") //表明当前类为组件,容器创建的这个组件对象名称为myStudent,相当于<bean/>的id属性
@Scope("prototype") //设置Bean的作用范围,默认是singleton
public class Student {
@Value("张三") //为name属性赋值
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
System.out.println("执行setName");
this.name = name;
} public int getAge() {
return age;
} @Value("23") //可以将该注解放到set上
public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
} }
解释:注解注入时,POJO类可以没有setXXX()方法,但还是写上去比较好。
注解域属性的自动注入:
(1) 用Spring自带的注解实现:
@Component("myStudent")
@Scope("prototype")
public class Student {
@Value("张三")
private String name;
@Value("23")
private int age;
@Autowired //byType方式自动注入
private School school;
@Component("myStudent")
@Scope("prototype")
public class Student {
@Value("张三")
private String name;
@Value("23")
private int age;
@Autowired
@Qualifier("mySchool") //byName方式自动注入
private School school;
补充:@Autowired 还有一个属性 required,默认值为 true,表示当匹配失败后,会终止程序运行。若将其值设置为 false,则匹配失败,将被忽略,未匹配的属性值为 null。
(2)使用JDK提供的注解实现:
@Component("myStudent")
@Scope("prototype")
public class Student {
@Value("张三")
private String name;
@Value("23")
private int age;
@Resource //byType方式自动注入
private School school;
@Component("myStudent")
@Scope("prototype")
public class Student {
@Value("张三")
private String name;
@Value("23")
private int age;
@Resource(name="mySchool") //byName方式自动注入
private School school;
注解Bean的定制声明始末:
@PostConstruct
public void postInit() {
System.out.println("初始化完毕之后");
} @PreDestroy
public void preDestory() {
System.out.println("销毁之前");
}
在方法上使用@PostConstruct,与原来的 init-method 等效。在方法上使用@PreDestroy,与 destroy-method 等效。
使用JavaConfig进行配置:
JavaConfig,是在 Spring 3.0 开始从一个独立的项目并入到 Spring 中的。JavaConfig 可以看成一个用于完成 Bean 装配的配置文件,只不过是程序员使用 Java 自己编写的。
package com.tongji.di07; import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration //表明当前POJO类将会被当作配置文件来使用,即Spring容器
public class MyJavaConfig { @Bean(name="mySchool") //表明当前方法的返回值为一个Bean对象
public School mySchoolCreater() {
return new School("清华大学");
} @Bean(name="school") //byName方式需要定义的该Bean的name值与被注入的属性名相同
public School mySchoolCreater2() {
return new School("北京大学");
} //@Bean(name="myStudent", autowire=Autowire.BY_TYPE) //byType方式自动注入
@Bean(name="myStudent", autowire=Autowire.BY_NAME) //byName方式自动注入
public Student myStudentCreater() {
return new Student("赵六",26);
}
}
解释:此时School类和Student类就不需要注解了。
使用 junit4 测试 Spring:
对 Spring 程序的运行,首先需要创建容器对象,而后还要从容器中获取对象,再对其进行执行。但,JUnit4 对 Spring 程序有专门的测试方法。
package com.tongji.di08; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; //使用Spring的测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:com/tongji/di08/applicationContext.xml")
public class MyTest2 extends AbstractJUnit4SpringContextTests { @Autowired //byType
@Qualifier("myStudent") //byName
private Student student;
@Test
public void test01() {
System.out.println(student);
} }
注意:Student对象的注入方式可以是基于XML的,也可以是基于注解的。
注解与XML共同使用:
注解的好处是,配置方便,直观。但其弊端也显而易见:以硬编码的方式写入到了 Java代码中,其修改是需要重新编译代码的。
XML 配置方式的最大好处是,对其所做修改,无需编译代码,只需重启服务器即可将新的配置加载。
若注解与 XML 同用,XML 的优先级要高于注解。这样做的好处是,需要对某个 Bean做修改,只需修改配置文件即可。当然,此时,Bean 类要有 setXXX() 或构造器。
Spring4笔记5--基于注解的DI(依赖注入)的更多相关文章
- 开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入
12.2 注解实现Bean依赖注入 12.2.1 概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...
- 注解实现Bean依赖注入
12.2.1 概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数 ...
- SSM-Spring-07:Spring基于注解的di注入
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解: 说起注解,哇哦,每个人都或多或少的用到过 像什么@Overried,@Test,@Param等等之前就 ...
- 三大框架 之 Spring(IOC控制反转、DI依赖注入)
目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- Spring:(二)DI依赖注入方式
DI 依赖注入 DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象. 属性注入的 ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- Spring-初识Spring框架-IOC控制反转(DI依赖注入)
---恢复内容开始--- IOC :控制反转 (DI:依赖注入)使用ioc模式开发 实体类必须有无参构造方法1.搭建Spring环境下载jarhttp://maven.springframework. ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
随机推荐
- C++解析命令行参数(仿C语言args)
说好不造轮子的,就管不住这手 #include <cstdio> #include <string> #include <vector> bool ParseCha ...
- 深入理解JAVA虚拟机JVM
深入理解JAVA虚拟机JVM Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.java之所以能实现一次编写到处执行,也就是因为jVM.原理:编 ...
- 解题:POI 2008 Subdivision of Kingdom
题面 还可以这么搜......学到了(PoPoQQQ orz) 我们最朴素的做法是枚举所有状态(当然可以剪,剪完最终实际状态量也是$C_{26}^{13}$的),然后每次$O(n)$扫一遍判断,大概会 ...
- [POI2012]STU-Well
题意翻译 给定一个非负整数序列A,每次操作可以选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max(∣xi−xi−1∣)最小,输出这个最小值以及此时最小的k (1≤n≤1 000 ...
- C++析构函数的自动调用(用于父类指针指向子类对象,内存泄漏问题)
class A {public:A() { printf("A \n"); }~A() { printf(" ~A \n"); } // 这里不管写不写virt ...
- RabbitMQ 中 Connection 和 Channel 详解
我们知道无论是生产者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是 Connection. 一旦 TCP 连接建立起来,客户端紧接着可以创建一个 ...
- GDB调试工具
1.运行代码的三种情况 a.运行时有逻辑问题 gdb a.out 设置断点 单行执行 b.运行代码没有退出 一直运行 结束不了 挂载调试 跟踪调试 -g ...
- 朝韩危机-Python模拟导弹互射
萨德系统是麻省理工学院的林肯实验室牵头开发的.林肯实验室可以说是美军方手中的一张王牌.二个反导系统(末段高空区域导弹防御(THAAD)系统,和 国家导弹防御系统(NMD))均由实验室牵头.它既是技术支 ...
- [应用篇]第一篇 EL表达式入门
概念 EL表达式:EL 全名为Expression Language,就是为了替代<%= %>脚本表达式. 作用 获取数据: EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的 ...
- Shell记录-Shell命令(文件权限)
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1. 命令格式 ch ...