Spring是一个开源的框架,其目标是简化java的开发。为了降低Java开发的复杂性,Spring有如下的特性:

>> 基于POJO的轻量级和最小侵入性编程

>> 通过依赖注入和面向接口编程实现松耦合

>> 基于切面和惯例进行声明式编程

>> 通过切面和模板减少样板式代码

Spring的六大模块:核心Spring容器、Spring的AOP模块、数据访问与集成、Web和远程调用以及测试模块

Spring中还有其他模块,例如Spring WebService、Spring Security、Spring Web Flow、Spring .Net等等。Spring致力于简化企业级Java开发,促进代码松耦合,成功的关键在于依赖注入和AOP切面。依赖注入和AOP是Spring中最核心的部分。

** 配置并使用第一个bean

准备一个Bean,在这个类中有name和age属性

publicclass Person {

private String name;

privateintage;

public Person() {}

public Person(String name, intage) {

this.name = name;

this.age = age;

}

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

publicint getAge() {

returnage;

}

publicvoid setAge(intage) {

this.age = age;

}

@Override

public String toString() {

return"Person [name=" + name + ", age=" + age + "]";

}

}

创建一个如下的beans.xml

xmlns全名是:xml Name Space[xml命名空间]在这个文件配置文件中如果你要加入其它的标签,在这个头部加入命名空间和对应的schema约束文件的地址即可。

Person类的Bean配置如下:

<bean id="person" class="com.wxh.blog.Person">

<property name="name" value="wxh"></property>

<property name="age" value="22"></property>

</bean>

Bean中的id是唯一标识符,class是指向要配置bean的类全名。

在这个例子中用的是setter方法注入。Property中的name一定要和class中的属性的名字一样,才能正确匹配,value就是对应的值。

使用构造器注入

<bean id="person" class="com.wxh.blog.Person">

<constructor-arg name="name" value="wxh"></constructor-arg>

<constructor-arg name="age" value="22"></constructor-arg>

</bean>

在<constructor-arg>还有index[代表匹配构造函数中第几个参数]、type[代表value的类型]、ref[代表对其他bean的引用]

使用bean

publicstaticvoid main(String[] args) {

ApplicationContext ac=new ClassPathXmlApplicationContext("beans-example.xml");

Person person=(Person) ac.getBean("person");

System.out.println(person.toString());

}

ApplictionContext:应用上下文接口,派生与BeanFactory,BeanFactory是Spring的核心但是功能比较单一。

ApplicationContext接口的实现类有三个:

>> ClassPathXmlApplicationContext: 从类路径下的XML配置文件中加载上下文定义。

>> FileSystemXmlApplicationContext: 读取文件系统下的XML配置文件并加载上下文定义。

>> XmlWebApplictionContext: 读取Web应用下的XML配置文件并装载上下文。[Web中使用]

** 引用其他bean和内部beanz注入

利用ref就可以实现引用其他的bean了

首先添加一个Car类

publicclass Car {

private String brand;

privateintprice;

public Car() {}

public Car(String brand, intprice) {

this.price = price;

this.brand = brand;

}

public String getBrand() {

returnbrand;

}

publicvoid setBrand(String brand) {

this.brand = brand;

}

publicint getPrice() {

returnprice;

}

publicvoid setPrice(intprice) {

this.price = price;

}

@Override

public String toString() {

return"Car [brand=" + brand + ", price=" + price + "]";

}

}

配置Car的Bean

<bean id="car" class="com.wxh.blog.Car">

<constructor-arg value="吉利" ></constructor-arg>

<constructor-arg value="120000"></constructor-arg>

</bean>

利用ref引用car的bean

<bean id="person" class="com.wxh.blog.Person">

<constructor-arg name="name" value="wxh"></constructor-arg>

<constructor-arg name="age" value="22"></constructor-arg>

<constructor-arg name="car" ref="car"></constructor-arg>

</bean>

运行结果:Person [name=wxh, age=22, car=Car[brand=吉利, price=120000]]

内部Bean的使用如下:内部bean不能被其他bean使用所以用的不多。

<bean id="person" class="com.wxh.blog.Person">

<property name="name" value="wxh"></property>

<property name="age" value="22"></property>

<property name="car">

<bean class="com.wxh.blog.Car">

<property name="brand" value="吉利"></property>

<property name="price" value="20000"></property>

</bean>

</property>

</bean>

** 利用p名称空间装配属性

先引入名称空间p,再使用

p:属性名=”值” 或者 p:属性名-ref=”值”[引用]

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

 

<bean id="person" class="com.wxh.blog.Person"

p:name="wxh" p:age="22" p:car-ref="car"></bean>

** 集合的装配

先引入:xmlns:util="http://www.springframework.org/schema/util"

这里主要使用list、map、和props

>> list的使用

<util:list>

<bean class="com.wxh.blog.Car">

<property name="brand" value="奥迪"></property>

<property name="price" value="320000"></property>

</bean>

<bean class="com.wxh.blog.Car">

<property name="brand" value="比亚迪"></property>

<property name="price" value="100000"></property>

</bean>

<bean class="com.wxh.blog.Car">

<property name="brand" value="吉利"></property>

<property name="price" value="120000"></property>

</bean>

</util:list>

>> map的使用

<util:map>

<entry key="favorite" value="篮球"></entry>

<entry key="motto" value="no pains, no gains"></entry>

</util:map>

>> props的使用

<props>

<prop key="user">root</prop>

<prop key="password">root</prop>

<prop key="jdbcUrl">jdbc:mysql///test</prop>

<prop key="driverClass">com.mysql.jdbc.Driver</prop>

</props>

最后说一下空值的装配,应该是这样的:<property name=”name”><null/></property>

** bean的作用域

所有的bean默认都是单例的,但是可以通过scope[作用域]来设置。

在单例模式中当xml配置文件被ApplicationContext加载后就会产生一个bean的实例,以后索取bean的实例,都是获取的同一个实例。可以把scope的值设置为prototype[原型],这个在文件被加载后就不会马上产生bean,每次取出一个bean的实例就创建一个新的。

在大多数情况下,我们只需要默认的singleton即可。

** bean的生命周期

Spring IOC容器对bean的生命周期的管理过程是:

>> 通过构造器或者工厂方法创建Bean实例

>> 设置Bean的属性

>> 调用Bean的初始化方法

>> 使用Bean

>> 关闭容器,调用Bean的销毁方法

如何使用init-method和destroy-method?

先在class中添加一个init和destroy方法

publicvoid init(){

System.out.println("init......");

}

publicvoid destroy(){

System.out.println("destroy......");

}

再在xml配置文件中配置

<bean id="person" class="com.wxh.blog.Person" init-method="init" destroy-method="destroy" p:name="wxh" p:age="22" p:car-ref="car"></bean>

** 通过autowire自动装配

通过指定autowire属性可以让容器管理JavaBean自动注入依赖的对象。这样可以大大的简化配置文件的复杂度和代码量。

autowire可选参数常用的包括:

>> No: 默认值,默认是不启动自动装配的

>> byname: 通过bean属性的名字来查找Bean依赖的对象并注入

>> byType: 通过Bean属性的类型查找Bean依赖的对象并注入

<bean id="car" class="com.wxh.blog.Car">

<constructor-arg value="吉利" ></constructor-arg>

<constructor-arg value="120000"></constructor-arg>

</bean>

<bean id="person1" class="com.wxh.blog.Person" p:name="wxh" p:age="22" autowire="byName"></bean>

<bean id="person2" class="com.wxh.blog.Person" p:name="wxh" p:age="22" autowire="byType"></bean>

** Spring Bean之间的关系

Spring Bean之间的关系有继承[parent]和依赖[depends-on]

继承:子Bean可以继承父Bean就像Java中一样,子类的属性值可以覆盖父类。可以使用parent关键字继承。

<!-- parent bean -->

<bean id="parent" class="com.wxh.blog.Person" p:car-ref="car"></bean>

<!-- extends bean -->

<bean id="children1" class="com.wxh.blog.Person"  p:name="wxh" p:age="22" parent="parent"></bean>

<bean id="children2" class="com.wxh.blog.Person"  p:name="wqc" p:age="21" parent="parent"></bean>

结果:

Person [name=wxh, age=22, car=Car [brand=吉利, price=120000]]

Person [name=wqc, age=21, car=Car [brand=吉利, price=120000]]

当然父bean还可以当模板bean,只需要加上abstract=”true”就行了。

<!-- parent bean -->

<bean id="parent" p:car-ref="car" abstract="true"></bean>

<!-- extends bean -->

<bean id="children1" class="com.wxh.blog.Person"  p:name="wxh" p:age="22" parent="parent"></bean>

<bean id="children2" class="com.wxh.blog.Person"  p:name="wqc" p:age="21" parent="parent"></bean>

依赖:在创建bean的时候一定要依赖于其他的bean先创建才能创建。通过depends-on可以指定依赖的bean。

<bean id="person" class="com.wxh.blog.Person" p:name="wxh" p:age="22" parent="parent" depends-on="car"></bean>

** 通过工厂方法配置bean

调用静态方法创建Bean是将对象创建的过程封装到静态方法中,要声明静态方法创建Bean,需要用到factory-method,如果有参数可以用constrctor-arg元素传递参数。

先创建一个工厂类CarFactory.java

/**

* 单例模式,且线程安全

*/

publicclass CarFactory {

privateintid;

private String name;

private CarFactory() {}

publicstatic CarFactory getInstance(){

return creatCarFactory.carFactory;

}

privatestaticclass creatCarFactory{

privatestatic CarFactory carFactory=new CarFactory();

}

publicint getId() {

returnid;

}

publicvoid setId(intid) {

this.id = id;

}

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

@Override

public String toString() {

return"CarFactory [id=" + id + ", name=" + name + "]";

}

}

使用factory-method指定静态的工厂方法

<bean id="carFactory" class="com.wxh.blog.CarFactory" factory-method="getInstance"></bean>

还可以用实例工厂方法,即现需要创建工厂本身,再调用工厂的实例方法来返回bean的实例。就是getInstance方法不是静态的,factory-bean指定工厂Bean,factory-method指定工厂方法。

<bean id="carFactory" class="com.wxh.blog.CarFactory"></bean>

<bean id="factroy" factory-bean="carFactory" factory-method="getInstance"></bean>

** 使用SpEL表达式装配

SpEL表达式中用#{}界定符把值装配到Bean的属性中,#{}会提示Spring这个里边是SpEL表达式。

使用字面值、通过ID应用其他Bean或者Bean的属性,方法等

<bean id="personOfSpEL" class="com.wxh.model.Person" p:id="#{1111}" p:name="#{'吴鑫晖'}" p:car="#{cars}" p:more="#{more}"></bean>

在SpEL中使用T()运算符调用类作用域的方法和常量。例如

<property name="id" value="#{T(java.lang.Math).random()*100}"></property>

在SpEL值执行操作

在SpEl中提供了几种运算符,在这些运算符可以用在SpEL表达式中的值上。

<constructor-arg name="avgScore"

value="#{(T(java.lang.Math).random()*100+T(java.lang.Math).random()*100+T(java.lang.Math).random()*100)/3}"></constructor-arg>

 

spring—Bean配置的更多相关文章

  1. Spring学习(九)-----Spring bean配置继承

    在 Spring,继承是用为支持bean设置一个 bean 来分享共同的值,属性或配置. 一个子 bean 或继承的bean可以继承其父 bean 的配置,属性和一些属性.另外,子 Bean 允许覆盖 ...

  2. Spring bean配置继承

    在 Spring,继承是用为支持bean设置一个 bean 来分享共同的值,属性或配置. 一个子 bean 或继承的bean可以继承其父 bean 的配置,属性和一些属性.另外,子 Bean 允许覆盖 ...

  3. spring Bean配置的三种形式

    Spring Bean配置有以下三种形式: 传统的xml配置 Spring 2.5 以后新增注解配置 Spring3.0以后新增JavaConfig 1. 传统的xml配置 <?xml vers ...

  4. [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

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

  5. [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件

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

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

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

  7. Spring Bean配置2

    Spring表达式语言:SpEL •Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言. •语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框 ...

  8. Spring Bean配置

    Spring 是什么 •Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. •Spring 是一个 IOC(DI) 和 ...

  9. Spring Bean配置默认为单实例 pring Bean生命周期

    Bean默认的是单例的. 如果不想单例需要如下配置:<bean id="user" class="..." scope="singleton&q ...

随机推荐

  1. Linux命令-终止进程命令:killall

    强制杀死所有进程,注意它后面跟着是进程名而不是进程号 killall - httpd 杀死apache所有进程pstree -p | grep httpd 查看apache进程就没有了service ...

  2. PostgreSQL安装详细步骤(linux)

    官方安装文档:http://www.postgresql.org/download/linux/redhat/ 1. 检查PostgreSQL 是否已经安装 Linux-软件包管理-rpm命令管理-查 ...

  3. 【php】基础学习4

    这部分主要包括php面向对象的程序设计,具体如下: <html xmlns=http://www.w3.org/1999/xhtml> <head> <meta http ...

  4. 通过源码了解ASP.NET MVC 几种Filter的执行过程 在Winform中菜单动态添加“最近使用文件”

    通过源码了解ASP.NET MVC 几种Filter的执行过程   一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神 ...

  5. Android用shareUserID实现多个Activity显示在同一界面

    近来整理文档,发现两年前研究Android多个Activity叠加显示的方案.时光荏苒,一去不回. 虽然后来没有用上,但还是整理如下,Android版本还是2.2的: ActivityGroup描画方 ...

  6. Linux进程冻结技术

    1 什么是进程冻结 进程冻结技术(freezing of tasks)是指在系统hibernate或者suspend的时候,将用户进程和部分内核线程置于“可控”的暂停状态. 2 为什么需要冻结技术 假 ...

  7. 让thinkphp 支持ftp上传到远程,ftp删除

    让thinkphp真正的支持FTP上传.删除. 原创by default7#zbphp.com,如需转载请保留作者信息. /** * This is not a free software, All ...

  8. Python isspace() 方法

    描述 Python isspace() 方法检测字符串是否只由空格组成. 语法 isspace() 方法语法: S.isspace() 参数 无. 返回值 如果字符串中至少有一个字符,并且所有字符都是 ...

  9. 在windows下部署Redis 当作系统服务器自动启动

    部署Redis 其实Redis是可以安装成windows服务的,开机自启动,命令如下: redis-server --service-install redis.windows.conf 安装完之后, ...

  10. VC++学习之多线程(2)

    创建一个线程,自然有一个对应的系统API来完毕.CreateThread这个函数就用来创建线程的. 各种參数的用途我就不多说了,这里直接贴一个我自己练习的样例 1.以下是一个创建一个线程的样例,当然, ...