文档章节

Spring Bean基础

akane_oimo
 akane_oimo
发布于 06/24 18:38
字数 1060
阅读 18
收藏 0

1、Bean之间引用

<!--如果Bean配置在同一个XML文件中,使用local引用-->
<ref bean="someBean"/>

<!--如果Bean配置在不同的XML文件中,使用ref引用-->
<ref local="someBean"/>

其实两种情况都可以使用“ref”引用Bean。但使用local可以提高代码可读性。

2、注入值到Bean属性

Spring有三种方式注入值到 bean 属性:

  • 正常方式
  • 快捷方式
  • “P”模式

例如有一个类:

public class CCC{
    private String name;
    private String type;

    //getter和setter方法
    //...
}

三种注入值的方法如下:

//正常方式
<bean id="ccc" class="CCC">
    <property name="name">
        <value>电脑</value>
    </property>
    <property name="type">
        <value>联想</value>
    </property>
</bean>

//快捷方式
<bean id="ccc" class="CCC">
    <property name="name" value="电脑" />
    <property name="type" value="联想" />
</bean>

//“p“模式
<bean id="ccc" class="CCC" 
      p:name="电脑" p:type="联想" />

3、加载多个配置文件

将所有Bean配置在一个XML文件中不现实,通常会按照Bean的功能、类别配置在不同的XML文件中。

比如现在有三个配置文件a.xml, b.xml和c.xml。可以用下面这种原始方法加载多个配置文件:

ApplicationContext context = 
    	new ClassPathXmlApplicationContext(new String[] {"a.xml","b.xml","c.xml"});

但更好的方法是创建一个super.xml,该xml组织所有想加载的xml, 然后加载该xml即可。

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<import resource="a.xml"/>
    <import resource="b.xml"/>
    <import resource="c.xml"/>
	
</beans>
ApplicationContext context = 
    	new ClassPathXmlApplicationContext("super.xml");

4、配置内部Bean

例如有一个Customer类,持有一个私有Person类的引用。第一种实现是配置Bean引用----单独配置两个Bean,然后让customer bean引用person bean。这里实现第二种方法:将person bean配置在customer bean内部。

<bean id="Customer" class="Customer">
    <property name="person">
        <bean class="Person">
            <property name="name" value="张三" />
            <property name="address" value="南京" />
            <property name="age" value="21" />
        </bean>
    </property>
</bean>

5、Bean的作用域

Spring Bean支持5种范围域:

  1. 单例 - 相同请求返回同一个bean实例
  2. 原型- 当每次请求时返回一个新的bean实例
  3. 请求 - 返回每个HTTP请求的一个Bean实例
  4. 会话 - 返回每个HTTP会话的一个bean实例
  5. 全局会话- 返回全局HTTP会话的一个bean实例

大多数情况下使用单例和原型。Spring默认范围域是单例。

单例和原型的区别用一个例子来说明:

还用上面的CCC类来讲,如果配置橙单例模式(就是默认情况),那么调用情况以及相应输出如下:

public static void main( String[] args ){
    ApplicationContext context = 
    	 new ClassPathXmlApplicationContext("main.xml");

    CCC ccc1 = (CCC)context.getBean("ccc");
    ccc1.setName("电脑1");
    System.out.println("name : " + ccc1.getName());
    	
    //再次取这个Bean
    CCC ccc2 = (CCC)context.getBean("ccc");
    System.out.println("name : " + ccc2.getName());
}

//输出:
//电脑1
//电脑1

如果配置成原型模式:

//通过XML配置文件
<bean id="ccc" class="CCC" scope="prototype"/>

//通过注解
@Service
@Scope("prototype")
public class CCC{
    //...
}

调用和相应输出如下:

public static void main( String[] args ){
    ApplicationContext context = 
    	 new ClassPathXmlApplicationContext("main.xml");

    CCC ccc1 = (CCC)context.getBean("ccc");
    ccc1.setName("电脑1");
    System.out.println("name : " + ccc1.getName());
    	
    //再次取这个Bean
    CCC ccc2 = (CCC)context.getBean("ccc");
    System.out.println("name : " + ccc2.getName());
}

//输出:
//电脑1
//null

6、PropertyPlaceholderConfigurer读取配置文件

项目开发过程中通常将一些配置信息写在一个单独文件中,如properties文件。Spring可以使用 PropertyPlaceholderConfigurer 类来获取外部文件的配置信息。

例如在项目类路径下有一个属性文件(database.properties),包含数据库的详细信息。

jdbc.driverClassName=com.mysql.jdbc.Driver
	jdbc.url=jdbc:mysql://localhost:3306/hello
	jdbc.username=root
	jdbc.password=123456

可以在配置文件中配置一个PropertyPlaceholderConfigurer映射到“database.properties”属性文件。

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>database.properties</value>
    </property>
</bean>

<bean id="hello" class="Hello">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

7、配置Bean继承

<bean id="baseCustomer" class="BaseCustomer">
	<property name="country" value="Malaysia" />
</bean>

<bean id="customerBean" parent="baseCustomer">
	<property name="action" value="buy" />
	<property name="type" value="1" />
</bean>

8、其他知识点

  • 配置集合(List,Set,Map)
  • 创建集合(Set、List、Map)通过ListFactoryBean、SetFactoryBean、MapFactoryBean
  • 依赖检查等

 

© 著作权归作者所有

共有 人打赏支持
akane_oimo
粉丝 19
博文 129
码字总数 155529
作品 0
南京
其他
Spring_总结_03_装配Bean之自动装配

一、前言 本文承接上一节:Spring总结02_依赖注入 在上一节我们了解到依赖注入的实质就是装配。 这一节我们来学习下装配Bean的相关知识。 二、Bean的装配机制 1.三种装配机制 Spring提供了三...

shirayner
07/27
0
0
Spring BeanFactory和FactoryBean的区别

有些东西可能知其用,但也需知其所以然,特转载该篇Spring BeanFactory和FactoryBean的区别 及 包是 Spring IoC 容器的基础。 一、BeanFactory 定义了IOC容器的最基本形式,并提供了IOC容器应...

淡淡的倔强
09/07
0
0
浅谈Spring设计分析_201800814

spring学习的思考与发现 1:spring中核心的几个部分 1:core : 工具类角色 2:beans : 各种实例化,被管理的对象与类 3:为整个spring容器提供维护,最基础的环境 2:IOC和AOP应该是在beans模块实现...

noteman
08/14
0
0
Spring import配置文件的顺序问题

使用Spring import多配置文件是很方便的。 Spring多配置文件加载顺序是,先加载在前面配置的文件,再加载后面的,但是如果有bean的名字一样的话,后加载的bean会替换掉前面的bean。 如果写一...

亮_dangdang
2014/05/25
0
0
4、Spring2.x集成MX4J

一、简介 Spring的JMX支持提供了一些特性,让你能透明地将Spring应用程序集成到JMX基础实施中去。 确切地说,Spring的JMX支持提供了四种核心特性: 将任意Spring Bean自动注册为JMX MBean 灵...

飓风2000
09/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ std::function 和 std::bind

C++11提供了std::function和std::bind两个工具,用于引用可调用对象。这些可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。引用可调用对象,可以用于...

yepanl
48分钟前
1
0
python:可迭代对象的索引

关于 python的range的用法: 注意是[ 开始,结束)的半开区间,不包括结束 http://www.runoob.com/python/python-func-range.html import collectionsfrom collections import Iterable字符串......

Oh_really
今天
2
0
docker-compose ,docker-stack

1.例子 version: "3"services: php: image: registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5 ports: - "38080:80" networks: - my_php_mysql volum......

chenbaojun
今天
3
0
SQL_Server2000示例数据库NorthWind的分析(转)

SQL_Server2000示例数据库NorthWind的分析 表名:Categories(食品类别表) 表结构: 字段名称 数据类型 长度 允许为空 CategoryID(主键) int 4 否 CategoryName nvarchar 15 否 Description ...

QQZZFT
今天
1
0
laravel 5.5 Session store not set on request.

laravel 5.5 数据存入session,会出现Session store not set on request.错误。查了下laravel 5.5将session放到global middleware中,需要laravel的文件 ./app/Http/Kernel.php中的加上一句:...

MichaelShu
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部