zoukankan      html  css  js  c++  java
  • Spring框架(2)---IOC装配Bean(xml配置方式)

    IOC装配Bean

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

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

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:p="http://www.springframework.org/schema/p"
     5     xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
     6         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     7         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
     8        
     9     <!-- Bean的三种实例化方式================================================================================ -->    
    10       <!-- 2.1  使用无参的构造器 -->
    11      <bean id="bean1" class="com.study.spring.b_instance.Bean1"></bean>
    12       <!-- 2.2使用静态工厂方法  factory-method 是工厂提供的静态方法 -->
    13      <bean id="bean2" class="com.study.spring.b_instance.Bean2" factory-method="createInstance"></bean>
    14      <!-- 2.3配置实例化工厂的方法 -->
    15      <bean id="bean3Factory" class="com.study.spring.b_instance.Bean3Factory"></bean>
    16      <bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"></bean>
    17     <!-- 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类

     1 public class Bean3Factory {
     2     
     3     private Bean3Factory(){
     4         
     5     }
     6       
     7     public Bean3 getInstance(){
     8         return new Bean3();
     9     }
    10 }

    测试类InstanceDemo

     1 import org.junit.Test;
     2 import org.springframework.context.ApplicationContext;
     3 import org.springframework.context.support.ClassPathXmlApplicationContext;
     4 
     5 public class InstanceDemo {
     6     
     7     //实例化工厂方法
     8     @Test
     9     public void demo3(){
    10        //加载配置文件 创建工厂
    11         ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    12         
    13         Bean3 bean3 =(Bean3) applicationContext.getBean("bean3");
    14         System.out.println(bean3);
    15         
    16     }
    17     
    18     //静态工厂方法
    19     @Test
    20     public void demo2(){
    21        //加载配置文件 创建工厂
    22         ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    23         
    24         Bean2 bean2 =(Bean2) applicationContext.getBean("bean2");
    25         System.out.println(bean2);
    26         
    27     }
    28     //构造方法得到bean对象
    29     @Test
    30     public void demo1(){
    31        //加载配置文件 创建工厂
    32         ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    33         
    34         Bean1 bean1 =(Bean1) applicationContext.getBean("bean1");
    35         System.out.println(bean1);
    36         
    37     }
    38 }
    39 /*
    40  * 这三个都得到类似于com.study.spring.b_instance.Bean1@7229c204 的内存地址
    41  */

    (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属性的依赖注入

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

    下面通过举例说明:

    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
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:p="http://www.springframework.org/schema/p"
     5     xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
     6         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     7         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
     8     
     9     
    10     <!-- Bean的依赖注入===================================================================================== -->    
    11      <!-- 4.1构造器注入 -->
    12         <bean id="car" class="com.study.spring.e_di.Car">
    13             <!-- 方式一.根据索引的位置 -->
    14             <!-- <constructor-arg index="0" value="保时捷"></constructor-arg>
    15              <constructor-arg index="1" value="1500000"></constructor-arg> -->
    16              <!-- 方式二.根据名字配置 -->
    17              <!-- <constructor-arg name="name" value="宝马"></constructor-arg>
    18              <constructor-arg name="price" value="500000"></constructor-arg> -->
    19              <!-- 方式三.根据类型配置 -->
    20              <constructor-arg type="java.lang.String" value="奔驰"></constructor-arg>
    21              <constructor-arg type="double" value="600000"></constructor-arg>
    22         </bean>
    23         
    24       <!-- 4.2setter方法中注入 -->  
    25       <bean id="car2" class="com.study.spring.e_di.Car2">
    26           <property name="name" value="雪佛兰"></property>
    27           <property name="price" value="100000"></property>
    28       </bean>
    29       
    30       <bean id="employee" class="com.study.spring.e_di.Employee">
    31           <property name="name" value="张三"></property>
    32           <property name="car2" ref="car2"></property>
    33       </bean>
    34       
    35       <!-- 引用p命名空间 --><!-- 如果要引用p命名,那在最上面sxd中就要配置  xmlns:p="http://www.springframework.org/schema/p"-->
    36        <bean id="car22" class="com.study.spring.e_di.Car2" p:name="宝马" p:price="500000">
    37       </bean>
    38       <bean id="employee2" class="com.study.spring.e_di.Employee" p:name="李四" p:car2-ref="car22"></bean>
    39       
    40         <!-- 引入spEL表达式 -->
    41       <bean id="carInfo" class="com.study.spring.e_di.CarInfo"></bean>
    42         <bean id="car2_2" class="com.study.spring.e_di.Car2">
    43             <property name="name" value="#{carInfo.name}"></property>
    44             <property name="price" value="#{carInfo.caculatePrice()}"></property>
    45         </bean>
    46         
    47      <!-- 复杂属性的依赖注入 -->    
    48         <bean  id="collectionBean" class="com.study.spring.e_di.CollectionBean">
    49             <!-- 简单属性的注入 -->
    50             <property name="name" value="归谷"></property>
    51             <property name="age" value="12"></property>
    52             <!-- 注入list集合 -->
    53              <property name="hobbies">
    54                  <list>
    55                      <value>吃饭</value>
    56                      <value>睡觉</value>
    57                      <value>敲代码</value>
    58                  </list>
    59              </property>
    60              
    61              <!-- 注入set集合 -->
    62              <property name="numbers">
    63                  <set>
    64                      <value>10</value>
    65                      <value>20</value>
    66                      <value>30</value>
    67                      <value>40</value>
    68                      <value>50</value>
    69                  </set>
    70              </property>
    71              <!-- 注入map集合 -->
    72              <property name="map">
    73                  <map>
    74                      <entry key="birthday" value="2017-1-1"></entry>
    75                      <entry key="address" value="杭州西湖"></entry>
    76                      <entry key="sex" value="female"></entry>
    77                  </map>
    78              </property>
    79              
    80              <!-- 注入Properties -->
    81              <property name="properties">
    82                  <props>
    83                      <prop key="compamy">杭州余杭未来科技城</prop>
    84                      <prop key="pnum">200</prop>
    85                  </props>
    86              </property>
    87         </bean>
    88         
    89     <!-- end  Bean的依赖注入===================================================================================== -->    
    90     <import resource="classpath:bean1.xml"/>        
    91     <import resource="classpath:bean2.xml"/>        
    92     <!-- 这里导入是指如果在src下还有其它的beans.xml我们可以这样去调用 -->    
    93         
    94 </beans>

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

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

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

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

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

     

     

     

  • 相关阅读:
    validation 参数效验框架
    小酌一下:Maven
    小酌一下:git 常用命令
    小酌一下:anaconda 基本操作
    小酌一下:Win10 解决fetch_20newsgroups下载速度巨慢
    学习笔记:Python3 异常处理
    学习笔记:Python3 面向对象
    学习笔记:Python3 函数式编程
    学习笔记:Python3 函数
    学习笔记:Python3 高级特性
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6511887.html
Copyright © 2011-2022 走看看