第二章 spring
一、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的更多相关文章
- Spring学习指南-第二章-Spring框架基础(完)
第二章 Spring框架基础 面向接口编程的设计方法 在上一章中,我们看到了一个依赖于其他类的POJO类包含了对其依赖项的具体类的引用.例如,FixedDepositController 类包含 ...
- 第二章 Spring MVC入门
2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...
- [翻译]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 ...
- java并发学习--第二章 spring boot实现线程的创建
除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在sp ...
- 第二章 Spring MVC入门 —— 跟开涛学SpringMVC 读后感1
2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...
- Spring 3.x 实践 第一个例子(Spring 3.x 企业应用开发实战读书笔记第二章)
前言:工作之后一直在搞android,现在需要更多和后台的人员交涉,技术栈不一样,难免鸡同鸭讲,所以稍稍学习下. 这个例子取自于<Spring 3.x 企业应用开发实战>一书中的第二章,I ...
- #Spring实战第二章学习笔记————装配Bean
Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...
- 第三章 Spring.Net 环境准备和搭建
在前面一章我们介绍了依赖注入,控制反转的概念.接下来我们来真正动手搭建一下Spring.Net的环境,看一下Spring.Net 中的控制反转和依赖注入是什么样子. 3.1 Spring.Net 下 ...
- Java Persistence with MyBatis 3(中文版) 第二章 引导MyBatis
MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession,并执行映射的SQL语句.SqlSessionFactory对象可以通过基于XML的配置信息或者 ...
随机推荐
- POJ 2115 C Looooops扩展欧几里得
题意不难理解,看了后就能得出下列式子: (A+C*x-B)mod(2^k)=0 即(C*x)mod(2^k)=(B-A)mod(2^k) 利用模线性方程(线性同余方程)即可求解 模板直达车 #incl ...
- php实现设计模式之 组合模式
<?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 * * * 1) 抽象构件角色Co ...
- centos svn服务器搭建
1.安装svnyum install subversion查看安装目录rpm -ql subversion 查看yum安装subversion的位置 2.创建仓库创建版本库目录mkdir -p /va ...
- Visual Studio for Mac 简介
2016-12-13 Hutchinson 微软中国MSDN 在 11 月举行的 Connect(); 上,Microsoft 将推出 Visual Studio for Mac 预览版.这是一个激动 ...
- .net 实体类与json转换(.net自带类库实现)
注意要点. 1.jsonhelp编写时候添加的引用.System.Runtime.Serialization.Json; 2.实体类需声明为public jsonhelp代码: using Syste ...
- Tomcat的下载和配置
目录结构: // contents structure [-] 下载Tomcat 配置Tomcat 运行Tomcat 参考文章 下载Tomcat 读者可以到apache官网下载Tomcat.笔者下载的 ...
- AMD and CMD are dead之KMDjs在JS工程化的努力
总览 kmdjs发布了最接近最终版本的0.0.4版本https://github.com/kmdjs/kmdjs,你已经完全可以在项目中使用.我已经无法用语言形容其完美程度.借用我发的微博: 模块 ...
- JavaScript-数组去重由慢到快由繁到简
indexOf去重 Array.prototype.unique1 = function() { var arr = []; for (var i = 0; i < this.length; i ...
- CSS3动画属性Transform解读
无论你是前端还是设计师,相信你在网页二维空间上的操作早已经得心应手,JS处理时间线的动画也早已经 烂熟于胸.从今天开始,我跟大家分享一些“新”的东西,网页的第三个维度,以及纯CSS实现的动画.限于篇幅 ...
- Intent属性详解三 data、type和extra
1 Data 执行时要操作的数据 在目标<data/>标签中包含了以下几种子元素,他们定义了url的匹配规则: android:scheme 匹配url中的前缀,除了“http”.“ht ...