新建工程,导入jar,添加spring配置文件(配置文件xxxx.xml)!

1.Helloword实现

Helloword.java

public class HelloWord {
private String name;
public void hello(){
System.out.println("Hello:" + name);
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("setname...");
this.name = name;
}
public HelloWord() {
System.out.println("con..");
}
}

applicationContext.xml

<!-- HelloWord -->
<!-- 配置Bean
class:是利用反射的原理,通过全类名方式在IOC容器中创建Bean,所以要求Bean必须有无参的构造器
id:标识容器中的Bean,id的值唯一
--> <!-- 属性注入 -->
<bean id="helloword" class="com.MrChengs1.HelloSpring.HelloWord">
<property name="name" value="spring"></property>
</bean>

测试

//1创建Spring的IOC容器对象
//ApplicationContext代表IOC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//注意:此时setter方法和无参的构造器已经被调用了

//2.IOC容器获得Bean实列
//getBean获得的是配置文件的 id的值
//利用id定位到容器中的Bean
HelloWord helloWord = (HelloWord) ctx.getBean("helloword");

//利用类型得到IOC中的Bean
//该方法不需要进行强制转换,但是如果我们有两个class类在Helloword的话,即在配置文件中,实例化两个HelloWord类,此时不知道返回哪一个类
//HelloWord helloWord = ctx.getBean(HelloWord.class);

//3.调用hello方法
helloWord.hello();

con..
setname...
Hello:spring

SpringIoc:IOC(控制反转)

是一个比较抽象的概念,是spring框架的核心,用来消减计算机程序的耦合问题。

对象的实例不在由调用者进行创建,交给spring容器来创建。

spring容器负责控制程序之间的关系,而不是直接由调用者的程序代码直接控制。

这样控制权由调用者转到spring容器,控制权发生了翻转-----spring的控制反转

Dependency Injection:DI(依赖注入)

是IOC的另一个说法,从不同的角度描述相同的概念。

spring容器负责将依赖的对象赋给调用者的成员变量,相当于为调用者注入他所依赖的实例。

Spring容器:
在Spring容器读取Bean配置Bean之后创建Bean实例之前,必须对它进行实例化,只有在
容器实例化之后,才可以从IOC容器里获取Bean实例化并使用。
Spring提供了 两种类型的IOC容器实现
->BeanFactory,IOC容器实现
->ApplicationContext提供了更多的高级特性是BeanFactory的子接口
->BeanFactory是spring框架的基础实施,面向Spring对象本身
ApplicationContext面向使用Spring框架的开发者,几乎使用所有的应用场合
都直接使用ApplicationContext面非底层的BeanFactory
->无论使用何种方式,配置文件是相同 的

ApplicationContext:
主要实现类:
ClassPathXmlApplicationContext:从类路径下加载文件
FileSystemXmlApplicationContext:从文件系统中加载配置文件
ConfigurableApplicationContext扩展于ApplicationContext新增加两个方法具有refersh()和close(),让AoolicationContext具有启动和刷新的,关闭的能力
ApplicationContext在初始化上下文的时候就实例化所有的单例的Bean
WebApplicationContext是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化准备工作

2.属性注入

属性注入就是通过setter方法进行Bean的实行值或依赖的对象
属性注入后使用<property>元素,使用name的属性名称,value属性或子节点进行指定属性值
属性注入是最长使用的注入!
属性注入必须要有无参的构造方法!!!!!!!!!!!!

利用java Bean规范所定义的setter方法来完成注入,灵活性且可读性高。

反射机制实现的。

<!-- 属性注入 -->
<bean id="helloword" class="com.MrChengs1.HelloSpring.HelloWord">
<property name="name" value="spring"></property>
</bean>

3.构造器注入

由java反射机制,通过构造方法完成相关的依赖注入。

通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实力话之后就可以使用
构造器注入在<constructer-age>元素里面声明属性,<constructer-age>中没有name属性

car.java

public class car {
private String brand;
private String corp;
private double price;
private int maxSpeech;
public car(String brand, String corp, double price) {
super();
this.brand = brand;
this.corp = corp;
this.price = price;
} public car(String brand, String corp, int maxSpeech) {
super();
this.brand = brand;
this.corp = corp;
this.maxSpeech = maxSpeech;
}
public car() {
super();
// TODO Auto-generated constructor stub
}
public car(String brand, String corp, double price, int maxSpeech) {
super();
this.brand = brand;
this.corp = corp;
this.price = price;
this.maxSpeech = maxSpeech;
}
  //setter.....
}

applicationContext.xml

使用<constructor-arg value="..." index="..."></constructor-arg>

constructor-arg:元素用于定义构造器方法的参数

index:用于指定参数的位置,默认从零开始

value:对属性进行赋值

<!-- 构造器注入                       
使用构造器方法可以指定参数的位置和类型,以区分重载构造器
-->
<bean id="car" class="com.MrChengs1.HelloSpring.car">
<constructor-arg value="LeiNuo" index=""></constructor-arg>
<constructor-arg value="shanghai" index=""></constructor-arg>
<constructor-arg value="" index=""></constructor-arg>
</bean>

测试:

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

car car = (com.MrChengs1.HelloSpring.car) ctx.getBean("car");
System.out.println(car.toString());

car [brand=LeiNuo, corp=shanghai, price=0.0, maxSpeech=300]

注意:仅使用index有时候也是无法区别要使用哪一个构造器的此时可以配合使用type进行区别

<bean id="car1" class="com.MrChengs.HelloSpring.car">
<constructor-arg value="AoDI" index=""></constructor-arg>
<constructor-arg value="shanghai" index=""></constructor-arg>
<constructor-arg value="" index="" type="int"></constructor-arg>
</bean> 

这样完全可以区分开使用那个构造器进行使用
使用构造器方法可以指定参数的位置和类型,以区分重载构造器

4.CDATA的使用

CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)

即把所有的特殊字符都可以转为纯文本的方式进行输出。

语法:<![CDATA[  字符  ]]>

字面值:可以使用字符串表示的值,可以通过<value>元素标签或者value属性值进行注入
  基本数据类型及其封装类,String等类型都可以采用字面值的方式进行注入
  若字面值中包含特殊的字符串,可以使用 <![CDATA[]]>把字面值包起来
  <constructor-arg index="1"><value><![CDATA[<shanghai>]]></value></constructor-arg>
  注意CDATA不能放在value属性值里面进行赋值,必须放在value的标签里面<value>

<bean id="car1" class="com.MrChengs1.HelloSpring.car">
<constructor-arg value="AoDI" index=""></constructor-arg>
<constructor-arg index=""><value><![CDATA[<shanghai>]]></value></constructor-arg>
<constructor-arg index="" type="int"><value></value></constructor-arg>
</bean>

测试:

       car car1 = (com.MrChengs1.HelloSpring.car) ctx.getBean("car1");
System.out.println(car1.toString());
car [brand=AoDI, corp=<shanghai>, price=0.0, maxSpeech=]

此时可以看到"<>"也进行纯文本的输出!

5.引入其他的bean/内部bean

内部Bean:就是在bean标签里面的bean,内部Bean不可以被外部bean引用

注:内部bean不需要进行写id,内部bean外部的bean不能引用

ref:引用其他的bean

Person.java

public class Person {
private String name;
private int age;
private car car;public Person(String name, int age, com.MrChengs1.HelloSpring.car car) {
super();
this.name = name;
this.age = age;
this.car = car;
}
public Person() {
super();
}
  //setter....
}

1).使用属性注入

applicationContext.xml

<!-- 引用其他的bean    属性注入-->
<bean id='person' class="com.MrChengs1.HelloSpring.Person">
<property name="name" value="Tom"></property>
<property name="age" value=""></property>

  <!--引用其他bean -->
<!-- <property name="car"><ref bean="car"/></property> -->
<!-- <property name="car" ref="car1"></property> --> <!-- 内部bean -->
<property name="car">
<bean class="com.MrChengs1.HelloSpring.car">
<constructor-arg value="Ford" index=""></constructor-arg>
<constructor-arg value="beijing" index=""></constructor-arg>
<constructor-arg value="" index=""></constructor-arg>
</bean>
</property>
</bean>

测试:

       Person p = (Person) ctx.getBean("person");
System.out.println(p);
Person [name=Tom, age=, car=car [brand=Ford, corp=beijing, price=0.0, maxSpeech=]]

2).构造器注入

applicationContext.xml

<!-- 引用其他的bean    构造器注入-->
<bean id="person1" class="com.MrChengs1.HelloSpring.Person" >
<constructor-arg value="Jerry"></constructor-arg>
<constructor-arg value=""></constructor-arg>
<constructor-arg ref="car"></constructor-arg>
</bean>

测试:

       Person p1 = (Person) ctx.getBean("person1");
System.out.println(p1);
Person [name=Jerry, age=, car=car [brand=LeiNuo, corp=shanghai, price=0.0, maxSpeech=]]

6.null和级联属性

可以使用专用的 <null/>元素标签为Bean的字符串或其他的字符串注入null
和Strus,Hilberante等框架一样Spring支持级联属性
属性需要先初始化,后才可以为其级联属性赋值

applicationContext.xml

<!-- 测试null 和 级联属性 -->
<bean id="person2" class="com.MrChengs1.HelloSpring.Person" >
<constructor-arg value="Bob"></constructor-arg>
<constructor-arg value=""></constructor-arg> <!-- null -->
<!-- <constructor-arg ><null/></constructor-arg> --> <!-- 级联 此时没有maxSpeech的值-->
<!-- 属性需要先初始化,后才可以为其级联属性赋值 -->
<constructor-arg ref="car"></constructor-arg>
<property name="car.maxSpeech" value=""></property>
</bean>

测试:

       Person p2 = (Person) ctx.getBean("person2");
System.out.println(p2);
Person [name=Bob, age=, car=car [brand=LeiNuo, corp=shanghai, price=0.0, maxSpeech=]]

7.p命名空间

导入命名空间

    xmlns:p="http://www.springframework.org/schema/p"

applicationContext.xml

<!-- P命名空间  先导入命名空间 -->
<bean id="person6" class="com.MrChengs2.Collection.Person" p:name="MrCheng" p:age=""
p:cars-ref="cars"></bean>
</beans>

此时的配置就相对简单!

起作用直接对属性进行赋值!

 

1.spring:helloword/注入/CDATA使用/其他Bean/null&级联/p命名空间的更多相关文章

  1. 二十7天 春雨滋润着无形 —Spring依赖注入

    6月11日,明确."夏条绿已密,朱萼缀明鲜.炎炎日正午,灼灼火俱燃." IT人习惯把详细的事物加工成的形状一致的类.正是这种一致,加上合适的规范.才干彰显对象筋道的牙感和bean清 ...

  2. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. 【spring set注入 注入集合】 使用set注入的方式注入List集合和Map集合/将一个bean注入另一个Bean

    Dao层代码: package com.it.dao; public interface SayHell { public void sayHello(); } Dao的Impl实现层: packag ...

  4. Spring学习(十八)Bean 的三种依赖注入方式介绍

    依赖注入:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖.接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法:•    属性注入方法• ...

  5. JAVA Spring JavaBean 属性值的注入方式( 属性注入, 特殊字符注入 <![CDATA[ 带有特殊字符的值 ]]> , 构造器注入 )

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功

    记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boo ...

  7. spring几种依赖注入方式以及ref-local/bean,factory-bean,factory-method区别联系

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

  8. spring 是如何注入对象的和bean 创建过程分析

    文章目录: beanFactory 及 bean 生命周期起步 BeanFactory refresh 全过程 BeanFactoryPostProcessor 和 BeanPostProcessor ...

  9. java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式

    Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...

随机推荐

  1. wxss无法调用本地资源图片

    微信小程序中,wxss中不能调用本地资源图片作为背景图片,奇怪的是在微信开发者工具中可以调用,但是到了真机预览的时候发现并不行,有的电脑上的连微信开发者工具里也不可以调用. 原因在于小程序上传的是代码 ...

  2. Java API 之 动态代理

    一.代理模式 如图:由于某些原因我们希望对该实现类进行访问控制.功能增强等,那么加入一层代理层,用代理层来调用实现类是一个很好的方式来解决这个问题,我们可以在调用实现类功能前后进行校验或者加入一些功能 ...

  3. log4j的简单使用

    引入jar包org.apache.log4j.Logger,项目src目录下建立一个log4j.properties配置文件 log4j.rootLogger=INFO,A1,R log4j.appe ...

  4. linux下查看内存的使用情况

    windows上有各种软件可以进行“一键加速”之类的操作,释放掉一些内存(虽然我暂时不知道是怎么办到的,有待后续学习).而任务管理器也可以很方便地查看各进程使用的内存情况,如下图: 同样地,linux ...

  5. Can't read stdin: end of file found

    问题是在我修改svn的账号和密码后出现的,因为百度出来的情况只有一种答案,所以记录一下我的情况,给其他人多一种排查思路.问题根源是,由于该版本库只有一个账号,更改了账号密码,没有同步修改post-co ...

  6. HTML5学习笔记之canvas

    标签 canvas标签有一个默认宽高:300*150: canvas的宽高一般写到行间样式中,写在style会有问题详细请看这里: 绘制环境 要绘图先要获取到绘制环境: var oC = docume ...

  7. 云栖神侠传—阿里云数据库专家德歌告诉你PostgreSQL的那些事

    什么是云栖神侠传: 云栖社区(http://yq.aliyun.com/?utm_source=yqdg),是阿里云面向开发者群体的开放型社区.在云栖社区中,活跃着许多阿里技术大牛,他们在自己的技术领 ...

  8. 使用qt帮助 查看样式表stylesheet的帮助文档

    QCreactor帮助文档中搜索的关键字 Qt Style Sheets Examples        有所有控件的样式例子 Qt Style Sheets Reference      控件的所有 ...

  9. WPF&Silverlight5 常用功能差异

    一晃从Wpf转到sl也有半年多了,总想总结一下wpf和sl的差异,今天终于下笔. 首先来个整体图: 通过上图可以发现其实sl只是使用了wpf的一小部分,只是sl依赖的freamwork有很大部分都一样 ...

  10. 微信小程序——代码构成

    通过上一章讲解,我们了解到如何初始化一个小程序项目,这里是官方给到demo地址,通过demo来看教程更方便于我们理解项目架构. 由四种文件构成: .json 后缀的 JSON 配置文件 .wxml 后 ...