Spring多种注入方式及注解实现DI
一、Bean作用域
spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的。代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构造器,创建实例对象
那么?我们如何说明出bean是单例的呢?
构建出两份学生对象,执行,发现两个对象的内存地址相同,内存中只有一份
如何使它成为多例的呢?那么则需要在配置文件中添加scope="prototype"该属性即可!
scope="prototype" 原型模式(N个对象):真正使用时才会创建,每获取一次,都会创建不同对象
scope="singleton" 单例模式:容器初始化时需要使用name建,每次获取的都是同一个对象,默认值
二、基于xml的DI(Dependency Injection)
注入类型:
定义学生Student实体类和小汽车Car实体类:进行封装和生成ToString(),并自定义属性Car
- public class Student {
- private String name;
- private String age;
- private Car car;
- //无参构造
- public Student() {
- //System.out.println("Student.Student()");
- }
- //带参构造
- public Student(String name, String age, Car car) {
- this.name = name;
- this.age = age;
- this.car = car;
- }
- @Override
- public String toString() {
- return "Student [name=" + name + ", age=" + age + ", car=" + car + "]";
- }
- public Car getCar() {
- return car;
- }
- public void setCar(Car car) {
- this.car = car;
- }
- public String getAge() {
- return age;
- }
- public void setAge(String age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
Car:
- public class Car {
- private String color;
- private String brand;
- //无参构造
- public Car() {
- }
- //带参构造
- public Car(String color, String brand) {
- super();
- this.color = color;
- this.brand = brand;
- }
- @Override
- public String toString() {
- return "Car [color=" + color + ", brand=" + brand + "]";
- }
- public String getColor() {
- return color;
- }
- public void setColor(String color) {
- this.color = color;
- }
- public String getBrand() {
- return brand;
- }
- public void setBrand(String brand) {
- this.brand = brand;
- }
- }
1.1设值注入(set方法注入):本质上是调用了Bean的setXXX()进行值的注入。分为普通属性和域属性
测试类:
- public class Test01 {
- @Test
- public void addTest(){
- ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
- Student student=(Student) ctx.getBean("stu");
- System.out.println(student);
- }
实现效果:
1.2构造注入
实现效果:
1.3命名空间p注入
使用前要先要在Spring配置文件中引入p命名空间
实现效果:
三、集合属性注入[List、Set、Map]
- public class MyCollection {
- private List<String> list;
- private Set<String> set;
- private Map<String,String> map;
- public Map<String, String> getMap() {
- return map;
- }
- public void setMap(Map<String, String> map) {
- this.map = map;
- }
- public Set<String> getSet() {
- return set;
- }
- public void setSet(Set<String> set) {
- this.set = set;
- }
- public List<String> getList() {
- return list;
- }
- public void setList(List<String> list) {
- this.list = list;
- }
Spring配置文件:
List与Set同理:
Map双列集合:
测试类:调用对应的方法:
- public class Test01 {
- @Test
- public void addTest(){
- ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
- MyCollection collection=(MyCollection) ctx.getBean("collection");
- //System.out.println(collection.getList());
- //System.out.println(collection.getSet());
- System.out.println(collection.getMap());
- }
四、基于注解的DI
注:在项目中添加Spring AOP相关的JAR文件以及xsd约束文件。
由于是基于注解的DI,所以无需再Spring配置文件中进行节点配置,只需配置包扫描器即可!
配置包扫描器用途:
该包下以及子包中的类才可以被Spring扫描,去寻找被注解的类和属性,让Spring容器管理赋值
Student类:
指定@Component中的value即可在测试类中的getBean()中植入即可。
@Value为该属性赋值
- @Component(value="stu")
- public class Student {
- @Value("呵呵")
- private String name;
- @Value("13")
- private String age;
- /*
- * JDK注解 @Resource(name="car2")
- */
- /*
- * Spring注解
- */
- @Autowired
- @Qualifier(value="car2")
- private Car car;
- @Override
- public String toString() {
- return "Student [name=" + name + ", age=" + age + ", car=" + car + "]";
- }
Car类:
- @Component(value="car2")
- public class Car {
- @Value("黑色")
- private String color;
- @Value("奥迪")
- private String brand;
- @Override
- public String toString() {
- return "Car [color=" + color + ", brand=" + brand + "]";
- }
测试类:
- public class Test01 {
- @Test
- public void addTest(){
- ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
- Student student=(Student) ctx.getBean("stu");
- System.out.println(student);
- }
- }
实现效果:
等价于@Component的注解:
@Component[不分层的情况下]
@Repository() [Dao层]
@Service() [Biz层]
@Controller() [Action类]
Spring多种注入方式及注解实现DI的更多相关文章
- Spring 02多种注入方式和注解实现DI
一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...
- spring 四种依赖注入方式以及注解注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- Spring 依赖注入方式详解
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- Spring 依赖注入方式详解(四)
IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想 ...
- Spring注入方式及注解配置
一:基于xml的DI(Dependency Injection) 注入类型: 定义学生Student实体类和小汽车Car实体类:进行封装和生成ToString(),并自定义属性Car Student ...
- Spring IOC 注入方式详解 附代码
引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...
- Spring IOC 注入方式
依赖注入通常有如下两种方式: ①设值注入:IOC容器使用属性的Setter方法来注入被依赖的实例. 设值注入是指IOC容器使用属性的Setter方法来注入被依赖的实例.这种注入方式简单.直观,因而在S ...
- 关于Spring的注入方式
spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire=" ...
- Spring bean注入方式
版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5619525.html Spring bean提供了3中注入方式:属 ...
随机推荐
- 错误:下列软件包有未满足的依赖关系: openssh-server : 依赖: openssh-client (= 1:7.1p1-4)
解决办法:尝试了很久才解决,这个是我发现最有用的,完美的解决了我的困难 后续过程参考:http://blog.csdn.net/jszhangyili/article/details/8881807 ...
- JS与Jquery区别
很多人对JS和JQuery很容易搞混淆,今天我们就相比学习下: 加载区别: var myfunction(){}; JS:1.window.onload=function(){} 2.<body ...
- 初识Java
Java是一种简单的.面向对象的.分布式的.解释的.安全的.可移植的.性能优异的多线程语言.它以极强的安全性.平台无关性.硬件结构无关性.语言简洁.面向对象的特点,在网络编程语言中占据了无可比拟的优势 ...
- 如何正确响应ArcGIS JavaScript API中图形的鼠标事件
在使用ArcGIS JavaScript API编写程序的时候,程序员往往需要完成这样一个功能:点击地图上的图形,自动进行专题GIS数据查询,当在地图非图形区域上点击时,自动进行底图兴趣点查询. 由于 ...
- IOS开发札记(2015-08-20)
View显示数据借助Model的一个比较好的理由也是因为:有时候从服务器获取的数据相同的value可能对应不同的key(服务端多人协作开发时经常会出现这种情况) 这里盗图描述一下使用Model的好处 ...
- 如何获取ios 设备名字 model
由于需要获取设备名字,在网上找了一些方法,发现能够解决问题,但是需要做一个匹配,然后设备年年都会出新款,而且设备的种类又很多,所以在获取设备信息后我又做了一个操作,--->我在google上找到 ...
- iOS国际化
本文介绍iOS国际化包含以下几种: 应用名称,文字,图片和xib 首先在工程里添加支持的语言,这里用了English和中文 然后创建两个.strings类型的文件,文件名分别为InfoPlist和Lo ...
- iOS之深拷贝与浅拷贝
在最开始,我们需要清楚一些关于内存分配方式的基础知识. 一般来说分为栈.堆.静态变量存储区.全局变量存储区.代码区. 前两个大家都懂的.通常将后三个合并称之为静态存储区,存储的是一些全局变量.静态变量 ...
- iOS之触摸及手势
触摸事件 iOS中的事件: 在用户使用app过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: view的触摸事件处理: 响应者对象: 在iOS中不是任何对象都能处理事件,只有继承了 ...
- 代替Reflection(反射)的一些方法
Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...