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 反射基础知识与实战 ...
随机推荐
- POJ3041_Asteroids
这个题目说,有一个N*N的规格的方格.某些格子里有*号,每次可以消除一行或者一列中所有的*号.最少需要消多少次? 新学到的,什么什么定理,最少点覆盖等于最大匹配数. 这个定理可以这样来理解(看别人的) ...
- 二分图最大匹配模板(pascal)
uoj#78. 二分图最大匹配 从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv ...
- ZJOI 2018 一试记
ZJOI一试几天,天微冷,雨.倒是考试当天近午时分出了太阳. 开题前的一刻,心情反而平静了,窗外泛着淡金色的日光照进来,仿佛今天的我并不是所谓来冲击省队,而只是来经历一场洗礼. 开题了,虽然有一点小插 ...
- 【bzoj1194】 HNOI2006—潘多拉的盒子
http://www.lydsy.com/JudgeOnline/problem.php?id=1194 (题目链接) 题意 给出S个自动机,如果一个自动机u的所有状态是另一个自动机v的状态的子集,那 ...
- Linux及安全实践四——ELF文件格式分析
Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...
- Linux内核设计与实现第十周读书笔记
第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...
- Hbase(七)hbase高级编程
一.Hbase结合mapreduce 为什么需要用 mapreduce 去访问 hbase 的数据? ——加快分析速度和扩展分析能力 Mapreduce 访问 hbase 数据作分析一 ...
- 解题:洛谷2633 Count on a tree
题面 在树上建主席树...... 每个点从父亲那里建过来,最后建出来就是从根到$i$这条链上的主席树,查询的时候一边差分一边查询 ($cmt[u]+cmt[v]-cmt[lca(u,v)]-cmt[a ...
- linux那些事
useradd -m -d /home/changp -Gusers,dialout,video account_name 创建新的账号 passwd account_name 修改指定账号的密码
- 题解【bzoj4587 & bzoj4408 [FJOI2016]神秘数】
Description \(n\) 个数的序列,每次询问一个区间,求最小的一个数使得不能用这个区间中的数之和表示. \(n \leq 10^5, \sum a_i \leq 10^9\) 这两个题一个 ...