一、Bean作用域

spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的。代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构造器,创建实例对象

那么?我们如何说明出bean是单例的呢?

构建出两份学生对象,执行,发现两个对象的内存地址相同,内存中只有一份

如何使它成为多例的呢?那么则需要在配置文件中添加scope="prototype"该属性即可!

scope="prototype" 原型模式(N个对象):真正使用时才会创建,每获取一次,都会创建不同对象
scope="singleton" 单例模式:容器初始化时需要使用name建,每次获取的都是同一个对象,默认值


二、基于xml的DI(Dependency Injection)

注入类型:

定义学生Student实体类和小汽车Car实体类:进行封装和生成ToString(),并自定义属性Car

  1. public class Student {
  2. private String name;
  3. private String age;
  4. private Car car;
  5.  
  6. //无参构造
  7. public Student() {
  8. //System.out.println("Student.Student()");
  9. }
  10.  
  11. //带参构造
  12. public Student(String name, String age, Car car) {
  13.  
  14. this.name = name;
  15. this.age = age;
  16. this.car = car;
  17. }
  18.  
  19. @Override
  20. public String toString() {
  21. return "Student [name=" + name + ", age=" + age + ", car=" + car + "]";
  22. }
  23.  
  24. public Car getCar() {
  25. return car;
  26. }
  27.  
  28. public void setCar(Car car) {
  29. this.car = car;
  30. }
  31.  
  32. public String getAge() {
  33. return age;
  34. }
  35.  
  36. public void setAge(String age) {
  37. this.age = age;
  38. }
  39.  
  40. public String getName() {
  41. return name;
  42. }
  43.  
  44. public void setName(String name) {
  45. this.name = name;
  46. }
  47. }

 Car:

  1. public class Car {
  2.  
  3. private String color;
  4. private String brand;
  5.  
  6. //无参构造
  7. public Car() {
  8.  
  9. }
  10.  
  11. //带参构造
  12. public Car(String color, String brand) {
  13. super();
  14. this.color = color;
  15. this.brand = brand;
  16. }
  17.  
  18. @Override
  19. public String toString() {
  20. return "Car [color=" + color + ", brand=" + brand + "]";
  21. }
  22.  
  23. public String getColor() {
  24. return color;
  25. }
  26. public void setColor(String color) {
  27. this.color = color;
  28. }
  29. public String getBrand() {
  30. return brand;
  31. }
  32. public void setBrand(String brand) {
  33. this.brand = brand;
  34. }
  35. }

 1.1设值注入(set方法注入):本质上是调用了Bean的setXXX()进行值的注入。分为普通属性和域属性

测试类:

  1. public class Test01 {
  2. @Test
  3. public void addTest(){
  4. ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
  5.  
  6. Student student=(Student) ctx.getBean("stu");
  7. System.out.println(student);
  8. }

实现效果:


1.2构造注入

实现效果:


1.3命名空间p注入
使用前要先要在Spring配置文件中引入p命名空间

实现效果:


三、集合属性注入[List、Set、Map]

  1. public class MyCollection {
  2. private List<String> list;
  3. private Set<String> set;
  4. private Map<String,String> map;
  5.  
  6. public Map<String, String> getMap() {
  7. return map;
  8. }
  9.  
  10. public void setMap(Map<String, String> map) {
  11. this.map = map;
  12. }
  13.  
  14. public Set<String> getSet() {
  15. return set;
  16. }
  17.  
  18. public void setSet(Set<String> set) {
  19. this.set = set;
  20. }
  21.  
  22. public List<String> getList() {
  23. return list;
  24. }
  25.  
  26. public void setList(List<String> list) {
  27. this.list = list;
  28. }

Spring配置文件:

List与Set同理:

Map双列集合:

测试类:调用对应的方法:

  1. public class Test01 {
  2. @Test
  3. public void addTest(){
  4. ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
  5.  
  6. MyCollection collection=(MyCollection) ctx.getBean("collection");
  7. //System.out.println(collection.getList());
  8. //System.out.println(collection.getSet());
  9. System.out.println(collection.getMap());
  10. }


四、基于注解的DI

注:在项目中添加Spring AOP相关的JAR文件以及xsd约束文件。

由于是基于注解的DI,所以无需再Spring配置文件中进行节点配置,只需配置包扫描器即可!

配置包扫描器用途:

该包下以及子包中的类才可以被Spring扫描,去寻找被注解的类和属性,让Spring容器管理赋值

Student类:

指定@Component中的value即可在测试类中的getBean()中植入即可。

@Value为该属性赋值

  1. @Component(value="stu")
  2. public class Student {
  3. @Value("呵呵")
  4. private String name;
  5. @Value("13")
  6. private String age;
  7.  
  8. /*
  9. * JDK注解 @Resource(name="car2")
  10. */
  11.  
  12. /*
  13. * Spring注解
  14. */
  15. @Autowired
  16. @Qualifier(value="car2")
  17.  
  18. private Car car;
  19.  
  20. @Override
  21. public String toString() {
  22. return "Student [name=" + name + ", age=" + age + ", car=" + car + "]";
  23. }

Car类:

  1. @Component(value="car2")
  2.  
  3. public class Car {
  4. @Value("黑色")
  5. private String color;
  6. @Value("奥迪")
  7. private String brand;
  8.  
  9. @Override
  10. public String toString() {
  11. return "Car [color=" + color + ", brand=" + brand + "]";
  12. }

测试类:

  1. public class Test01 {
  2. @Test
  3. public void addTest(){
  4. ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
  5.  
  6. Student student=(Student) ctx.getBean("stu");
  7. System.out.println(student);
  8. }
  9. }

实现效果: 

等价于@Component的注解:

@Component[不分层的情况下]

@Repository() [Dao层] 

@Service() [Biz层]

@Controller() [Action类]

Spring多种注入方式及注解实现DI的更多相关文章

  1. Spring 02多种注入方式和注解实现DI

    一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...

  2. spring 四种依赖注入方式以及注解注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  3. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  4. Spring 依赖注入方式详解(四)

    IoC 简介 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想 ...

  5. Spring注入方式及注解配置

    一:基于xml的DI(Dependency Injection) 注入类型: 定义学生Student实体类和小汽车Car实体类:进行封装和生成ToString(),并自定义属性Car Student ...

  6. Spring IOC 注入方式详解 附代码

    引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...

  7. Spring IOC 注入方式

    依赖注入通常有如下两种方式: ①设值注入:IOC容器使用属性的Setter方法来注入被依赖的实例. 设值注入是指IOC容器使用属性的Setter方法来注入被依赖的实例.这种注入方式简单.直观,因而在S ...

  8. 关于Spring的注入方式

      spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire=" ...

  9. Spring bean注入方式

    版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5619525.html  Spring bean提供了3中注入方式:属 ...

随机推荐

  1. 错误:下列软件包有未满足的依赖关系: openssh-server : 依赖: openssh-client (= 1:7.1p1-4)

    解决办法:尝试了很久才解决,这个是我发现最有用的,完美的解决了我的困难 后续过程参考:http://blog.csdn.net/jszhangyili/article/details/8881807 ...

  2. JS与Jquery区别

    很多人对JS和JQuery很容易搞混淆,今天我们就相比学习下: 加载区别: var myfunction(){}; JS:1.window.onload=function(){} 2.<body ...

  3. 初识Java

    Java是一种简单的.面向对象的.分布式的.解释的.安全的.可移植的.性能优异的多线程语言.它以极强的安全性.平台无关性.硬件结构无关性.语言简洁.面向对象的特点,在网络编程语言中占据了无可比拟的优势 ...

  4. 如何正确响应ArcGIS JavaScript API中图形的鼠标事件

    在使用ArcGIS JavaScript API编写程序的时候,程序员往往需要完成这样一个功能:点击地图上的图形,自动进行专题GIS数据查询,当在地图非图形区域上点击时,自动进行底图兴趣点查询. 由于 ...

  5. IOS开发札记(2015-08-20)

    View显示数据借助Model的一个比较好的理由也是因为:有时候从服务器获取的数据相同的value可能对应不同的key(服务端多人协作开发时经常会出现这种情况) 这里盗图描述一下使用Model的好处 ...

  6. 如何获取ios 设备名字 model

    由于需要获取设备名字,在网上找了一些方法,发现能够解决问题,但是需要做一个匹配,然后设备年年都会出新款,而且设备的种类又很多,所以在获取设备信息后我又做了一个操作,--->我在google上找到 ...

  7. iOS国际化

    本文介绍iOS国际化包含以下几种: 应用名称,文字,图片和xib 首先在工程里添加支持的语言,这里用了English和中文 然后创建两个.strings类型的文件,文件名分别为InfoPlist和Lo ...

  8. iOS之深拷贝与浅拷贝

    在最开始,我们需要清楚一些关于内存分配方式的基础知识. 一般来说分为栈.堆.静态变量存储区.全局变量存储区.代码区. 前两个大家都懂的.通常将后三个合并称之为静态存储区,存储的是一些全局变量.静态变量 ...

  9. iOS之触摸及手势

    触摸事件 iOS中的事件: 在用户使用app过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型:    view的触摸事件处理: 响应者对象: 在iOS中不是任何对象都能处理事件,只有继承了 ...

  10. 代替Reflection(反射)的一些方法

    Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...