zoukankan      html  css  js  c++  java
  • Spring_配置Bean & 属性配置细节

    1.Spring容器

    在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用.
    Spring 提供了两种类型的 IOC 容器实现.
    BeanFactory: IOC 容器的基本实现.
       ①ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
       ②BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;

      ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
      无论使用何种方式, 配置文件时相同的.

    2.ApplicationContext

    ApplicationContext 的主要实现类:
       ClassPathXmlApplicationContext:从 类路径下加载配置文件
       FileSystemXmlApplicationContext: 从文件系统中加载配置文件
       ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:     

                                                                                         refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力
      ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。
      WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作

    3.从 IOC 容器中获取 Bean

       调用 ApplicationContext 的 getBean() 方法

       如:Helloword helloword = (Helloword) ctx.getBean("helloWorld2");

    4.依赖注入的方式

      Spring 支持 3 种依赖注入的方式
       属性注入(setter方法注入)

        <bean id="helloWorld2" class="com.aff.spring.beans.Helloword">
            <property name="name2"  value="Spring"></property>
        </bean>

       构造器注入

        <!-- 通过 构造方法 来配置 bean 属性 -->
        <bean id="car"  class="com.aff.spring.beans.Car">
                    <constructor-arg value="Audi" index="0"></constructor-arg>
                    <constructor-arg value="SHANGHAI" index="1"></constructor-arg>
                    <constructor-arg value="3000000"  type="double"></constructor-arg>
        </bean>    

       工厂方法注入(很少使用,不推荐)

    5.属性配置细节

    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:util="http://www.springframework.org/schema/util"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    
        <!--配置bean 
              class : bean 的全类名, 通过反射的方式再IOC 容器中创建bean 所以要求 Bean 中必须有无参数的构造器
              id: 标识容器中 bean. id 唯一
        -->
        <bean id="helloWorld2" class="com.aff.spring.beans.Helloword">
            <property name="name2"  value="Spring"></property>
        </bean>
        
        <!-- 通过 构造方法 来配置 bean 属性 -->
        <bean id="car"  class="com.aff.spring.beans.Car">
                    <constructor-arg value="Audi" index="0"></constructor-arg>
                    <constructor-arg value="SHANGHAI" index="1"></constructor-arg>
                    <constructor-arg value="3000000"  type="double"></constructor-arg>
        </bean>    
        
        <!-- 使用构造器注入属性值可以指定参数的位置和参数的类型,以区分重载的构造器 -->
        <bean id="car2" class="com.aff.spring.beans.Car">
                    <constructor-arg value="Baoma" type="java.lang.String"></constructor-arg>
                    <!-- 如果字面值包含特殊字符可以使用<![CDATA[]]> 包裹起来-->
                    <!--  属性值 也可以使用value 子节点 进行配置 -->
                    <constructor-arg type="java.lang.String">
                                <value><![CDATA[<SHANGHAI**>]]></value>
                    </constructor-arg>
                    <constructor-arg  type="int">
                                <value>234</value>
                    </constructor-arg>
        </bean>
        
        <bean id="person" class="com.aff.spring.beans.Person">
                    <property name="name" value="Tom"></property>
                    <property name="age" value="23"></property>
                    <!-- 可以使用 property 的ref 属性 建立 bean之间的引用关系 -->
                    <!-- <property name="car" ref="car2"></property> -->
                    <!-- 也可以内部bean, 不能被外部引用的  , 只能在内部使用-->
                    <property name="car">
                                <bean class="com.aff.spring.beans.Car">
                                        <constructor-arg value="Ford"></constructor-arg>
                                        <constructor-arg value="Changan"></constructor-arg>
                                        <constructor-arg value="30000" type="double"></constructor-arg>
                                </bean>
                    </property>
        </bean>
        
        <bean id="person2" class="com.aff.spring.beans.Person">
                                <constructor-arg  value="AAA"></constructor-arg>
                                <constructor-arg  value="26"></constructor-arg>
                            <!--     <constructor-arg  ref="car2"></constructor-arg> -->
                            <!-- 测试值 null  -->
                            <!-- <constructor-arg><null/></constructor-arg> -->
                            <constructor-arg ref="car"></constructor-arg>
                            <!--为级联属性赋值,注意:属性需要先初始化后才可以为级联属性赋值, 否则的话会有异常  -->
                            <property name="car.maxSpeed" value="260"></property>
        </bean>
        
        <!--测试如何配置集合属性  -->
        <bean id="person3" class="com.aff.spring.beans.collection.Person">
                            <property name="name" value="Colin"></property>
                            <property name="age" value="25"></property>
                            <property name="cars" >
                            <!--使用list  节点为List 类型的属性赋值  -->
                                    <list>
                                         <ref bean="car"/>
                                         <ref bean="car2"/>
                                         <bean class="com.aff.spring.beans.Car">
                                               <constructor-arg value="Ford"></constructor-arg>
                                               <constructor-arg value="Changan"></constructor-arg>
                                               <constructor-arg value="30000" type="double"></constructor-arg>
                                         </bean>
                                    </list>
                            </property>
        </bean>
        
        <!-- 配置 Map 属性值 -->
        
        <bean id="newPerson" class="com.aff.spring.beans.collection.NewPerson">
        <property name="name" value="Mike"></property>
        <property name="age" value="26"></property>
        <property name="cars" >
                            <map>
                                        <entry key="AA" value-ref="car"></entry>
                                        <entry key="BB" value-ref="car2"></entry>
                            </map>
        </property>
        </bean>
        
        <!--配置Properties 属性值  -->
        <bean id="dataSource" class="com.aff.spring.beans.collection.DataSource">
                            <property name="properties">
                            <!-- 使用props 和prop 子节点为 Properties 属性赋值 -->
                                  <props>
                                          <prop key="user">root</prop>
                                          <prop key="password">123456</prop>
                                          <prop key="jdbcUrl">jdbc:mysql:///test</prop>
                                  </props>
                            </property>
        </bean>
        
        <!-- 配置 单例的 集合 bean  以供 多个bean 进行引用  ,需要导入util 命名空间-->
        <util:list id="cars">
                    <ref bean="car" />
                    <ref bean="car2" />
        </util:list>
        
        <bean id="person4" class="com.aff.spring.beans.collection.Person">
                    <property name="name" value="Jack"></property>
                    <property name="age" value="15"></property>
                    <property name="cars"  ref="cars"></property>
        </bean>
        
        <!--通过 p,命名空间为bean 的属性赋值, 需要先导入 p 命名空间 , 相对于传统方式更加简洁 -->
        
        <bean id="person5"  class="com.aff.spring.beans.collection.Person" p:age="30" p:name="Lin" p:cars-ref="cars"> </bean>
        
    </beans>

    Main.java

    package com.aff.spring.beans.collection;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            Person person = (Person) ctx.getBean("person3");
    
            System.out.println(person);
            //Person [name=Colin, age=25, cars=[Car [brand=Audi, corp=SHANGHAI, price=3000000.0, maxSpeed=260], Car [brand=Baoma, corp=<SHANGHAI**>, price=0.0, maxSpeed=234]]]
            
            NewPerson newPerson = (NewPerson) ctx.getBean("newPerson");
            System.out.println(newPerson);
            //NewPerson [name=Mike, age=26, cars={AA=Car [brand=Audi, corp=SHANGHAI, price=3000000.0, maxSpeed=260], BB=Car [brand=Baoma, corp=<SHANGHAI**>, price=0.0, maxSpeed=234]}]
    
            
            DataSource dataSource= (DataSource) ctx.getBean("dataSource");
            System.out.println(dataSource);
            //DataSource [properties={driverClass=com.mysql.jdbc.Driver, user=root, password=123456, jdbcUrl=jdbc:mysql:///test}]
            System.out.println(dataSource.getProperties());
            //{driverClass=com.mysql.jdbc.Driver, user=root, password=123456, jdbcUrl=jdbc:mysql:///test}
            
            Person person4 = (Person) ctx.getBean("person4");
            System.out.println(person4);
            //Person [name=Jack, age=15, cars=[Car [brand=Audi, corp=SHANGHAI, price=3000000.0, maxSpeed=260], Car [brand=Baoma, corp=<SHANGHAI**>, price=0.0, maxSpeed=234]]]
        
            Person person5 = (Person) ctx.getBean("person5");
            System.out.println(person5);
            //Person [name=Lin, age=30, cars=[Car [brand=Audi, corp=SHANGHAI, price=3000000.0, maxSpeed=260], Car [brand=Baoma, corp=<SHANGHAI**>, price=0.0, maxSpeed=234]]]
    
        }
    }

    DataSource.java

    package com.aff.spring.beans.collection;
    
    import java.util.Properties;
    
    public class DataSource {
        
        private  Properties properties;
    
        public Properties getProperties() {
            return properties;
        }
    
        public void setProperties(Properties properties) {
            this.properties = properties;
        }
    
        @Override
        public String toString() {
            return "DataSource [properties=" + properties + "]";
        }
    
        public DataSource() {
            super();
        }
    
        public DataSource(Properties properties) {
            super();
            this.properties = properties;
        }
    
    }

    NewPerson

    package com.aff.spring.beans.collection;
    
    import java.util.Map;
    
    import com.aff.spring.beans.Car;
    
    public class NewPerson {
        private String name;
        private int age;
        private Map<String, Car> cars;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public Map<String, Car> getCars() {
            return cars;
        }
        public void setCars(Map<String, Car> cars) {
            this.cars = cars;
        }
        public NewPerson() {
            super();
            // TODO Auto-generated constructor stub
        }
        public NewPerson(String name, int age, Map<String, Car> cars) {
            super();
            this.name = name;
            this.age = age;
            this.cars = cars;
        }
        @Override
        public String toString() {
            return "NewPerson [name=" + name + ", age=" + age + ", cars=" + cars + "]";
        }
        
    
    }

    Person.java

    package com.aff.spring.beans.collection;
    
    import java.util.List;
    
    import com.aff.spring.beans.Car;
    
    public class Person {
    
        private  String name ;
        private int age;
        private  List<Car> cars;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public List<Car> getCars() {
            return cars;
        }
        public void setCars(List<Car> cars) {
            this.cars = cars;
        }
        public Person() {
            super();
            // TODO Auto-generated constructor stub
        }
        public Person(String name, int age, List<Car> cars) {
            super();
            this.name = name;
            this.age = age;
            this.cars = cars;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]";
        }
    }

    需要的架包

    commons-logging.jar

    spring-aop-4.0.0.RELEASE.jar

    spring-beans-4.0.0.RELEASE.jar

    spring-context-4.0.0.RELEASE.jar

    spring-core-4.0.0.RELEASE.jar

    spring-expression-4.0.0.RELEASE.jar

    目录

    All that work will definitely pay off
  • 相关阅读:
    PLC 控制系统资源
    .net core 控制台程序生成EXE
    EF Core 日志跟踪sql语句
    Oracle 设置自启动
    数据库批量插入数据
    字符串面试题系列之六:在字符串中删除特定的字符
    字符串面试题系列之五:删除字符串空格
    字符串面试题系列之四:字符串匹配二
    字符串面试题系列之三:左旋转字符串
    字符串面试题系列之二:连续最长数字串
  • 原文地址:https://www.cnblogs.com/afangfang/p/12956308.html
Copyright © 2011-2022 走看看