Spring框架(2)---IOC装配Bean(xml配置方式)

时间:2022-09-24 22:47:05

IOC装配Bean

(1)Spring框架Bean实例化的方式提供了三种方式实例化Bean
    构造方法实例化(默认无参数,用的最多)
    静态工厂实例化
    实例工厂实例化

下面先写这三种方法的applicationContext.xml配置文件:

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Bean的三种实例化方式================================================================================ -->
<!-- 2.1 使用无参的构造器 -->
<bean id="bean1" class="com.study.spring.b_instance.Bean1"></bean>
<!-- 2.2使用静态工厂方法 factory-method 是工厂提供的静态方法 -->
<bean id="bean2" class="com.study.spring.b_instance.Bean2" factory-method="createInstance"></bean>
<!-- 2.3配置实例化工厂的方法 -->
<bean id="bean3Factory" class="com.study.spring.b_instance.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"></bean>
<!-- end.Bean的三种实例化方式================================================================================ -->
Bean1类
public class Bean1 {

    //必须提供无参的构造函数  系统有默认无参的构造函数
}
Bean2类
public class Bean2 {
private static Bean2 Bean2 = new Bean2(); private Bean2() {
} public static Bean2 createInstance() {
return Bean2;
}
}

 Bean3类

public class Bean3 {

}

Bean3Factory类

 public class Bean3Factory {

     private Bean3Factory(){

     }

     public Bean3 getInstance(){
return new Bean3();
}
}

测试类InstanceDemo

 import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class InstanceDemo { //实例化工厂方法
@Test
public void demo3(){
//加载配置文件 创建工厂
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean3 bean3 =(Bean3) applicationContext.getBean("bean3");
System.out.println(bean3); } //静态工厂方法
@Test
public void demo2(){
//加载配置文件 创建工厂
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean2 bean2 =(Bean2) applicationContext.getBean("bean2");
System.out.println(bean2); }
//构造方法得到bean对象
@Test
public void demo1(){
//加载配置文件 创建工厂
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Bean1 bean1 =(Bean1) applicationContext.getBean("bean1");
System.out.println(bean1); }
}
/*
* 这三个都得到类似于com.study.spring.b_instance.Bean1@7229c204 的内存地址
*/

(2).Bean的其他配置:

一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称

id 属性在IoC容器中必须是唯一的

id 的命名要满足XML对ID属性命名规范 必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号

如果Bean的名称中含有特殊字符,就需要使用name属性 例如: <bean name="#person" class="cn.itcast.bean.Person"/>

因为name属性可以相同,所以后出现Bean会覆盖之前出现的同名的Bean

id和name的区别:

id遵守XML约束的id的约束.id约束保证这个属性的值是唯一的,而且必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号

name没有这些要求

如果bean标签上没有配置id,那么name可以作为id.

Bean的scope属性

  <!-- 3.Bean的scope属性===================================================================== -->
<bean id="product" class="com.study.spring.c_scope.Product" scope="singleton"></bean>
<!-- end.Bean的scope属性===================================================================== -->

     * singleton :单例的.(默认的值.)

    * prototype :多例的.

     * request :web开发中.创建了一个对象,将这个对象存入request范围,request.setAttribute();

   * session :web开发中.创建了一个对象,将这个对象存入session范围,session.setAttribute();

   * globalSession :一般用于Porlet应用环境.指的是分布式开发.不是porlet环境,globalSession等同于session;

3.Bean属性的依赖注入

前面已经知道如何获得对象,那我们接下来要知道如果给对象对象的属性赋值。

Spring框架(2)---IOC装配Bean(xml配置方式)

下面通过举例说明:

public class Car {

    private String name;

    private double price;

    public Car(String name, double price) {
super();
this.name = name;
this.price = price;
} @Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}

Car 类

public class Car2 {
private String name; private double price; public void setName(String name) {
this.name = name;
} public void setPrice(double price) {
this.price = price;
} @Override
public String toString() {
return "Car2 [name=" + name + ", price=" + price + "]";
} }

Car2类

public class CarInfo {

    public String getName(){
return "哈弗H6";
} public double caculatePrice(){
return 110000;
}
}

CarInfo类

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; public class CollectionBean {
private String name; private Integer age; private List<String> hobbies; private Set<Integer> numbers; private Map<String, String> map; private Properties properties; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public List<String> getHobbies() {
return hobbies;
} public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
} public Set<Integer> getNumbers() {
return numbers;
} public void setNumbers(Set<Integer> numbers) {
this.numbers = numbers;
} public Map<String, String> getMap() {
return map;
} public void setMap(Map<String, String> map) {
this.map = map;
} public Properties getProperties() {
return properties;
} public void setProperties(Properties properties) {
this.properties = properties;
} @Override
public String toString() {
return "CollectionBean [name=" + name + ", age=" + age + ", hobbies=" + hobbies + ", numbers=" + numbers
+ ", map=" + map + ", properties=" + properties + "]";
} }

CollectionBean类

public class Employee {

    private String name;

    private Car2 car2;

    public void setName(String name) {
this.name = name;
} public void setCar2(Car2 car2) {
this.car2 = car2;
} @Override
public String toString() {
return "Employee [name=" + name + ", car2=" + car2 + "]";
} }

Employee类

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDi { @Test
public void demo6() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean"); System.out.println(collectionBean);
} @Test
public void demo5() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Car2 car2 = (Car2) applicationContext.getBean("car2_2"); System.out.println(car2);
} @Test
public void demo4() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Employee e = (Employee) applicationContext.getBean("employee2"); System.out.println(e);
} @Test
public void demo3() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Employee e = (Employee) applicationContext.getBean("employee"); System.out.println(e);
} @Test
public void demo2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Car2 car2 = (Car2) applicationContext.getBean("car2"); System.out.println(car2);
} @Test
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Car car = (Car) applicationContext.getBean("car"); System.out.println(car);
}
}

TestDi测试类

上面这几个类都不是最主要的,我们主要是来看配置文件怎么写,这才是最关键的: 

applicationContext.xml
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Bean的依赖注入===================================================================================== -->
<!-- 4.1构造器注入 -->
<bean id="car" class="com.study.spring.e_di.Car">
<!-- 方式一.根据索引的位置 -->
<!-- <constructor-arg index="0" value="保时捷"></constructor-arg>
<constructor-arg index="1" value="1500000"></constructor-arg> -->
<!-- 方式二.根据名字配置 -->
<!-- <constructor-arg name="name" value="宝马"></constructor-arg>
<constructor-arg name="price" value="500000"></constructor-arg> -->
<!-- 方式三.根据类型配置 -->
<constructor-arg type="java.lang.String" value="奔驰"></constructor-arg>
<constructor-arg type="double" value="600000"></constructor-arg>
</bean> <!-- 4.2setter方法中注入 -->
<bean id="car2" class="com.study.spring.e_di.Car2">
<property name="name" value="雪佛兰"></property>
<property name="price" value="100000"></property>
</bean> <bean id="employee" class="com.study.spring.e_di.Employee">
<property name="name" value="张三"></property>
<property name="car2" ref="car2"></property>
</bean> <!-- 引用p命名空间 --><!-- 如果要引用p命名,那在最上面sxd中就要配置 xmlns:p="http://www.springframework.org/schema/p"-->
<bean id="car22" class="com.study.spring.e_di.Car2" p:name="宝马" p:price="500000">
</bean>
<bean id="employee2" class="com.study.spring.e_di.Employee" p:name="李四" p:car2-ref="car22"></bean> <!-- 引入spEL表达式 -->
<bean id="carInfo" class="com.study.spring.e_di.CarInfo"></bean>
<bean id="car2_2" class="com.study.spring.e_di.Car2">
<property name="name" value="#{carInfo.name}"></property>
<property name="price" value="#{carInfo.caculatePrice()}"></property>
</bean> <!-- 复杂属性的依赖注入 -->
<bean id="collectionBean" class="com.study.spring.e_di.CollectionBean">
<!-- 简单属性的注入 -->
<property name="name" value="归谷"></property>
<property name="age" value="12"></property>
<!-- 注入list集合 -->
<property name="hobbies">
<list>
<value>吃饭</value>
<value>睡觉</value>
<value>敲代码</value>
</list>
</property> <!-- 注入set集合 -->
<property name="numbers">
<set>
<value>10</value>
<value>20</value>
<value>30</value>
<value>40</value>
<value>50</value>
</set>
</property>
<!-- 注入map集合 -->
<property name="map">
<map>
<entry key="birthday" value="2017-1-1"></entry>
<entry key="address" value="杭州西湖"></entry>
<entry key="sex" value="female"></entry>
</map>
</property> <!-- 注入Properties -->
<property name="properties">
<props>
<prop key="compamy">杭州余杭未来科技城</prop>
<prop key="pnum">200</prop>
</props>
</property>
</bean> <!-- end Bean的依赖注入===================================================================================== -->
<import resource="classpath:bean1.xml"/>
<import resource="classpath:bean2.xml"/>
<!-- 这里导入是指如果在src下还有其它的beans.xml我们可以这样去调用 --> </beans>

有关applicationContext.xml这个配置文件里的内容一定要看懂,我写的还是比较基础和全面的。

有关命名空间p的使用我这里在解释下:

p:<属性名>="xxx" 引入常量值

p:<属性名>-ref="xxx" 引用其它Bean对象

关于这篇文章,我就写到这里,不足之处,欢迎大家多多指点,谢谢!

Spring框架(2)---IOC装配Bean(xml配置方式)的更多相关文章

  1. Spring框架&lpar;3&rpar;---IOC装配Bean&lpar;注解方式&rpar;

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  2. 使用Spring框架入门一:基于XML配置的IOC&sol;DI的使用

    一.Spring框架 1.方法一:逐项导入基础依赖包: spring-core.spring-beans.spring-context.spring-expression 2.方法二:最简洁的导入,直 ...

  3. Spring 简单使用IoC与DI——XML配置

    目录 Spring简介 导入jar包 Spring配置文件 Spring的IoC IoC简介 快速使用IoC Spring创建对象的三种方式 使用构造方法 使用实例工厂 使用静态静态工厂 Spring ...

  4. IOC装配Bean(注解方式)

    Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注解 ...

  5. Spring MVC 的 Java Config &lpar; 非 XML &rpar; 配置方式

    索引: 开源Spring解决方案--lm.solution 参看代码 GitHub: solution/pom.xml web/pom.xml web.xml WebInitializer.java ...

  6. spring security结合数据库验证用户-XML配置方式

    之前的用户信息我们都是使用的内存用户,测试例子可以,实际中使用肯定不行,需要结合数据库进行验证用户.这就是本节的重点: 项目目录如下:  在之前的项目中的依赖中添加两个依赖: <dependen ...

  7. 使用Spring框架入门三:基于XML配置的AOP的使用

    一.引入Jar包 <!--测试1使用--> <dependency> <groupId>org.springframework</groupId> &l ...

  8. Spring 框架 详解 (三)-----IOC装配Bean

    IOC装配Bean: 1.1.1 Spring框架Bean实例化的方式: 提供了三种方式实例化Bean. * 构造方法实例化:(默认无参数) * 静态工厂实例化: * 实例工厂实例化: 无参数构造方法 ...

  9. Spring框架---IOC装配Bean

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...

随机推荐

  1. SQL注入&colon;突破关键字过滤

    一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败).回车的ascii ...

  2. 浅谈 HTTPS 和 SSL&sol;TLS 协议的背景与基础

    来自:编程随想   >> 相关背景知识 要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 大致了解 HTTP 和 ...

  3. Nginx&plus;Keepalived实现高可用站点

    Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat. corosync.pacemaker.但是它一般不会单独出现,而是与 ...

  4. (转载)根据数据字典表定义的表结构&comma;生成创建表的SQL语句

    <来源网址:http://www.delphifans.com/infoview/Article_221.html>根据数据字典表定义的表结构,生成创建表的SQL语句 //1.  类名:T ...

  5. H TML5 之 (5) 一个在线画图板

    这里加入了点难度了,增加了对HTML很多时间的把握,对象的把握 index.html <!DOCTYPE HTML> <html> <head> <title ...

  6. Oracle 存储过程介绍

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

  7. Linux之旅&lpar;1&rpar;&colon; diff&comma; patch和quilt (下)

    Linux之旅(1): diff, patch和quilt (下) 2 quilt 我们自己的项目能够用cvs或svn管理所有代码.但有时我们要使用其它开发人员维护的项目.我们须要改动一些文件,但又不 ...

  8. STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push&lowbar;back,find,erase

    今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序.编译环境是VC6.0         这个程序使用了vect ...

  9. Boost中timer的简易用法

    boost::asio::deadline_timer timer_; timer_(io_service), timer_.expires_from_now(boost::posix_time::s ...

  10. iOS蓝牙调用的一般流程

    一.服务端(也叫周边设备吧..脑残的翻译) 1.实现类必须遵守协议 CBPeripheralManagerDelegate 2.需要的主要类有: @property(strong,nonatomic) ...