一、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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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()进行值的注入。分为普通属性和域属性

测试类:

1
2
3
4
5
6
7
8
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]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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双列集合:

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

1
2
3
4
5
6
7
8
9
10
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为该属性赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@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类:

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

测试类:

1
2
3
4
5
6
7
8
9
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的更多相关文章

  1. Spring学习指南-第二章-Spring框架基础(完)

    第二章 Spring框架基础 面向接口编程的设计方法 ​ 在上一章中,我们看到了一个依赖于其他类的POJO类包含了对其依赖项的具体类的引用.例如,FixedDepositController 类包含 ...

  2. 第二章 Spring MVC入门

    2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...

  3. [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续

    英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...

  4. java并发学习--第二章 spring boot实现线程的创建

    除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在sp ...

  5. 第二章 Spring MVC入门 —— 跟开涛学SpringMVC 读后感1

    2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...

  6. Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)

    前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...

  7. #Spring实战第二章学习笔记————装配Bean

    Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...

  8. 第三章 Spring.Net 环境准备和搭建

    在前面一章我们介绍了依赖注入,控制反转的概念.接下来我们来真正动手搭建一下Spring.Net的环境,看一下Spring.Net 中的控制反转和依赖注入是什么样子. 3.1  Spring.Net 下 ...

  9. Java Persistence with MyBatis 3(中文版) 第二章 引导MyBatis

    MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession,并执行映射的SQL语句.SqlSessionFactory对象可以通过基于XML的配置信息或者 ...

随机推荐

  1. Overload 和Override 的区别

    Overload 是重载的意思,Override 是覆盖的意思,也就是重写.重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同).重写 ...

  2. HttpClient通过Post上传多个文件

    public static String sendFilesPost(String url, String fileNames) { HttpClient httpClient = null; Htt ...

  3. Lind.DDD.Domain领域模型介绍

    回到目录 Lind.DDD.Domain位于Lind.DDD核心项目中,它主要面向领域实体而设计,由一个IEntity的标识接口,EntityBase基类和N个Entity实体类组成,其中IEntit ...

  4. PHP的变量和常量

  5. JQuery 实现两列等高并自适应高度

    想要使用 JQuery 实现两列等高并自适应高度,其实也很简单,原理就是取得左右两边的高度,然后判断这个值,把大的值赋给小的就行了.看代码: $(document).ready(function() ...

  6. jQuery实现checkbox反选(转载)

    //反选 $("#btnInvert").click(function () { //1.方法一实现反选 $("#chk input:checkbox").ea ...

  7. jquery中 $(document).ready()和window.onload的区别

    1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 ...

  8. AE创建一个空白的Shapefile

    1.IField和IFieldEdit区别: IFieldEdit是继承IField的,因为IField的属性大部分是只读的(read-only),所以IFieldEdit就在IField的基础上多了 ...

  9. iOS所有常见证书,appID,Provisioning Profiles配置说明及制作图文教程

    转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/9219333 概述: 苹果的证书繁锁复杂,制作管理相 ...

  10. Python绘制PDF文件~超简单的小程序

    Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...