首页 > 开发 > Java > 正文

详解Spring框架---IOC装配Bean

2024-07-13 10:05:16
字体:
来源:转载
供稿:网友

IOC装配Bean

(1)Spring框架Bean实例化的方式提供了三种方式实例化Bean

  1. 构造方法实例化(默认无参数,用的最多)
  2. 静态工厂实例化
  3. 实例工厂实例化

下面先写这三种方法的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,ioc,bean,实例化bean,spring装配bean

下面通过举例说明: 

Car 类

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 + "]";  }}

Car2类

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 + "]";  }}

CarInfo类

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

CollectionBean类

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 + "]";  }  }

Employee类

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 + "]";  }}

TestDi测试类

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);  }}

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

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对象

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表