• 02_Spring Bean的装配模式_基于XML配置方式


    一.三种实例化Bean的方式

    1.使用类构造器实例化(默认无参数)

    <bean id="bean1" class="com.demo1.Bean1"></bean>

    2.使用静态工厂方法实例化(简单工厂模式)静态方法

    <bean id="bean2" class="com.demo2.Bean2Factory" factory-method="getBean2"></bean>
    
    <!--需要创建一个UserFactroy类-->
    public class Bean2Factory{
          public  static Bean2 getBean2(){
                return new Bean2();
          }}
    

    3.使用实例工厂方法实例化(工厂方法模式)非静态方法

    <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
    <bean id="bean3Factory" class="com.demo2.Bean3Factory"/>
    public class Bean3Factory{
          public  Bean3  getBean3(){
                    return new Bean3();
          }
    }
    

    在applicationContext.xml配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
        <!-- bean对象创建
            1.无参构造
        -->
        <bean name="user" class="com.bean.User">
    
        </bean>
    
        <bean name="address" class="com.bean.Address">
        </bean>
        <!-- bean对象创建
          2.静态工厂方法(不常用)
      -->
        <bean name="user1" class="com.bean.UserFactory" factory-method="createUser">
        </bean>
        <!-- bean对象创建
         3.工厂方法L:非静态(不常用)
     -->
        <bean name="user2" factory-method="createUser1" factory-bean="factorybean">
    
        </bean>
        <bean name="factorybean" class="com.bean.UserFactory">
        </bean>
    </beans>
    

    如果要使用工厂方法配置bean,而后要配置一个UserFactory.java对象

    package com.bean;
    
    /**
     * Created by jiatp
     */
    public class UserFactory {
        public static User createUser(){
            System.out.println("静态方法创建");
            return new User();
        }
    
        public User createUser1(){
            System.out.println("非静态方法");
            return new User();
        }
    }
    

    Bean的命名,id属性和name属性:

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

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

    id 的命名要满足XML对ID属性命名规范

     必须以字母开始,可以使用字母、数字、连字符、下划线、冒号

    如果Bean的名称中含有特殊字符,就需要使用name属性

    例如:

     <bean name="#person" class="com.bean.Person"/>

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

    Bean的作用域:

    scope属性 :

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

    * prototype:多例的.

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

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

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

    实际开发中主要使用singleton,prototype

    <bean id="customer" class="com.demo3.Customer" scope="prototype"></bean>

    Spring容器中Bean的生命周期:

    1.instantiate bean对象实例化

    2.populate properties 封装属性

    3.如果Bean实现BeanNameAware 执行 setBeanName

    4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext

    5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization

    6.如果Bean实现InitializingBean 执行 afterPropertiesSet

    7.调用<bean init-method="init"> 指定初始化方法 init

    8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization

    9.执行业务处理

    10.如果Bean实现 DisposableBean 执行 destroy

    11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

    二.依赖注入Bean的属性

    代码实现:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://www.springframework.org/schema/beans"
    	xmlns:p="http://www.springframework.org/schema/p"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    	<!-- 对象注入 -->
    	<!-- 
    	    1) set方式注入 
    		基本数据类型  :  (8种) 
    		引用数据类型 :  包含类类型的属性
    	 -->
    	<bean name="user" class="com.bean.User">
    		<property name="name" value="tom"></property>
    		<property name="age" value="18"></property>
    		<property name="address" ref="address"></property>
    	</bean>
    	<bean name="address" class="com.bean.Address">
    		<property name="city" value="北京"></property>
    		<property name="street" value="王府井"></property>
    	</bean>
    	<!-- 
    		2)构造方法注入 
    	 -->
    	<bean name="user1" class="com.bean.User">
    		<!-- constructor-arg 
    			name属性:参数的名称  
    		 	value属性:参数的值  
    		 	ref属性:引用的bean对象 
    		 	index属性:说明参数位置  index="0"
    		 	type属性: 参数的类型   type="java.lang.String"
    		 -->
    		<constructor-arg name="name" value="abc" type="java.lang.String"></constructor-arg>
    		<constructor-arg name="age" value="20" type="java.lang.Integer"></constructor-arg>
    		<constructor-arg name="address" ref="address"></constructor-arg>
    	</bean>
    	 <!-- 
    		3) p名称注入(了解)
    	 -->
    	 <bean name="user3" class="com.bean.User"
    	  p:name="张三" p:age="10" p:address-ref="address">
    	 </bean>
    	 <!--
    	 	4) spel 注入 spring Expression language string 表达式语言 
    	 -->
    	 <bean name="user4" class="com.bean.User">
    	 	<property name="name" value="#{user.name}"></property>
    		<property name="age" value="#{user3.age}"></property>
    		<property name="address" ref="address"></property>
    	 </bean>
    </beans>
    
    
    
    
    
    
    
    

    1) set方式注入 :
            基本数据类型  :  (8种) 
            引用数据类型 :  包含类类型的属性

    使用set方法注入,在Spring配置文件中,通过<property>设置注入的属性,<property>标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象,(ref中可引入其它bean名称)

    2)构造方法注入 :

          <constructor-arg name="name" value="李四" type="java.lang.String"></constructor-arg>

                 name属性:参数的名称  
                 value属性:参数的值  
                 ref属性:引用的bean对象 
                 index属性:说明参数位置  index="0"
                 type属性: 参数的类型   type="java.lang.String"

    3) p名称注入

    使用p命名空间

    为了简化XML文件配置,Spring从2.5开始引入一个新的p名称空间

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

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

    引入名称空间:xmlns:p="http://www.springframework.org/schema/p"

            <bean name="user2" class="com.bean.User" p:name="p注入" p:age="12" p:address-ref="addresss">
    

    4) SpEL 注入 spring Expression language string 表达式语言

    语法:#{表达式}

    <bean id="" value="#{表达式}">

    <SpEL表达式语言

      语法:#{}

    #{'神回复:哈哈'}使用字符串

    #{topicId3} 使用另一个bean

    #{topicId4.content.toUpperCase()} 使用指定名属性,并使用方法

    #{T(java.lang.Math).PI} 使用静态字段或方法

    依赖注入:

    应用:三层结构(控制层-业务层-数据层)

          控制层依赖业务层(在控制层类中注入业务层对象)

          业务层依赖数据层(在业务层类中注入数据层对象)

    注入:

          1.注入<constructor-arg>  成员变量赋值通过构造

          2.注入<property>  成员变量赋值通过set方法

    三.集合类型属性的注入

    1.新建CollectionBean.java

    package com.collection;
    
    import java.util.*;
    
    /**
     * Created by jiatp
     */
    public class CollectionBean {
        private Object[] arr;//数组注入
        private List list;//list注入
        private Map map;//map注入
        private Properties prop;//properties注入
        private Set<String> sets;//set注入
    
        public Object[] getArr() {
            return arr;
        }
    
        public void setArr(Object[] arr) {
            this.arr = arr;
        }
    
        public List getList() {
            return list;
        }
    
        public void setList(List list) {
            this.list = list;
        }
    
        public Map getMap() {
            return map;
        }
    
        public void setMap(Map map) {
            this.map = map;
        }
    
        public Properties getProp() {
            return prop;
        }
    
        public void setProp(Properties prop) {
            this.prop = prop;
        }
    
        @Override
        public String toString() {
            return "CollectionBean{" + "arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop + ", set=" + sets + '}';
        }
    }
    

    applicationContext.xml配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
        <bean name="user" class="com.icss.bean.User">
            <property name="name" value="李四"/>
        </bean>
            <!--1.数组注入-->
        <bean name="cb" class="com.collection.CollectionBean">
            <property name="arr">
                <array>
                    <value>tom</value>
                    <value>jack</value>
                    <ref bean="user"/>
                </array>
            </property>
            <!--2.list注入-->
            <property name="list">
                <list>
                    <value>list1</value>
                    <value>list2</value>
                </list>
            </property>
            <!--3.map注入-->
            <property name="map">
                <map>
                    <entry key="url" value="jdbc:mysql://crm"/>
                    <entry key="user" value-ref="user"/>
                </map>
            </property>
            <!--4.set注入-->
            <property name="sets">
                <set>
                    <value>zhansan</value>
                    <value>lisi</value>
                </set>
            </property>
            <!--5.properties注入-->
            <property name="prop">
                <props>
                    <prop key="driverclass" >com.jdbc.mysql.Driver</prop>
                    <prop key="url" >jdbc:mysql:///crm</prop>
                    <prop key="username" >root</prop>
                    <prop key="password" >123456</prop>
                </props>
            </property>
        </bean>
    </beans>
    

    使用多个xml配置文件

    方式一 可以在创建ApplicationContext对象时传入多个配置文件

      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");

    方式二 可以在配置文件中通过<import>引入其他配置文件

    import resource="classpath:bean2.xml"/>
    
  • 相关阅读:
    二 Capacity Scheduler 计算能力调度器
    一:yarn 介绍
    2.hbase原理(未完待续)
    1.安装hbase
    创建第一个vue项目
    初学vue(二)
    第一次面试
    面试题
    C#冒泡排序
    面试真题(.NET/Sqlserver/web前端)
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767531.html
Copyright © 2020-2023  润新知