zoukankan      html  css  js  c++  java
  • Spring(十):Spring配置Bean(三)Bean的作用域、使用外部属性文件

    Bean的作用域:

    支持四种配置,分别是singleton,prototype,request,session。

    singleton

    默认情况下在spring confinguration xml文件中的一个bean配置中,如果不指定scope属性,则这个scope默认值为singleton。

    如何把一个bean配置为scope='singleton':

    Person.java

    package com.dx.beans.scope;
    
    public class Person {
        private int id;
        private String name;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Person() {
            System.out.println("Person's Constructor...");
        }
    
        @Override
        public String toString() {
            return "Person [id=" + id + ", name=" + name + "]";
        }
    }
    View Code

    springcfg.xml

        <bean id="person" class="com.dx.beans.scope.Person" scope="singleton">
            <property name="id" value="1"></property>
            <property name="name" value="person demo"></property>
        </bean>

    配置为singleton的bean将会在初始化Spring时,初始化该bean的类。

    package com.dx.beans.scope;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Client {
        public static void main(String[] args) {
            ApplicationContext cxt = new ClassPathXmlApplicationContext("springcfg.xml");
        }
    }

    打印信息为:

    Person's Constructor...

    而且在以后调用该bean时,不会再初始化给bean的类。

    package com.dx.beans.scope;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Client {
        public static void main(String[] args) {
            ApplicationContext cxt = new ClassPathXmlApplicationContext("springcfg.xml");
            
            Person person = (Person) cxt.getBean("person");
            Person person1 = (Person) cxt.getBean("person");
    
            System.out.println(person);
            System.out.println(person1);
        }
    }

    打印信息为:

    Person's Constructor...
    Person [id=1, name=person demo]
    Person [id=1, name=person demo]

    prototype

     每次调用时,都会实例化一次bean的class。

    spring configuration 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:util="http://www.springframework.org/schema/util"
        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.3.xsd">
    
        <bean id="person" class="com.dx.beans.scope.Person" scope="prototype">
            <property name="id" value="1"></property>
            <property name="name" value="person demo"></property>
        </bean>
    </beans>

    此时,客户端调用:

    package com.dx.beans.scope;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Client {
        public static void main(String[] args) {
            ApplicationContext cxt = new ClassPathXmlApplicationContext("springcfg.xml");
            
            Person person = (Person) cxt.getBean("person");
            System.out.println(person);
            
            Person person1 = (Person) cxt.getBean("person");
            System.out.println(person1);
        }
    }

    打印信息为:

    Person's Constructor...
    Person [id=1, name=person demo]
    Person's Constructor...
    Person [id=1, name=person demo]

    web环境作用域 request,session

    request,session应用在web环境作用域。

    使用外部属性文件

    1) 在配置文件里配置Bean时,有时需要在Bean的配置里混入系统部署的细节信息(例如:文件路径、数据源配置信息等),而这些部署细节实际上需要和Bean配置相分离。

    2)Spring提供了一个PropertyPlaceholderConfigurer的BeanFactory后置处理器。这个处理器允许用户将Bean配置的部分内容外移到属性文件中,可以在Bean配置文件里使用形式为${var}的变量,PropertyPlaceholderConfigurer从属性文件里加载属性,并使用这些属性值来替换变量。

    3)Spring还允许在属性文件中使用${propertyName},以实现属性之间的相互引用。

    注册PropertyPlaceholderConfigurer

    spring2.0时:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
         <property name="location" value="classpath:jdbc.properties"></property >
    </bean>

    spring2.5之后:

    可通过<context:property-placeholder>元素简化

    --添加命名空间:<beans>中添加context Schema定义(xmlns:context="http://www.springframework.org/schema/context")
    --在配置文件下加入配置:<context:property-placeholder location="classpath:db.properties"/>

    需求:使用c3p0组件连接数据库,并把它注册到spring中。

    使用外部文件之前:

     pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.dx</groupId>
        <artifactId>springlearning</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo Maven Webapp</name>
        <url>http://maven.apache.org</url>
        <repositories>
            <repository>
                <id>sonatype-nexus-snapshots</id>
                <name>Sonatype Nexus Snapshots</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
        <properties>
            <org.springframework.version>4.3.8.RELEASE</org.springframework.version>
        </properties>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.2</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!-- Expression Language (depends on spring-core) Define this if you use 
                Spring Expression APIs (org.springframework.expression.*) -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!-- Bean Factory and JavaBeans utilities (depends on spring-core) Define 
                this if you use Spring Bean APIs (org.springframework.beans.*) -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!-- Application Context (depends on spring-core, spring-expression, spring-aop, 
                spring-beans) This is the central artifact for Spring's Dependency Injection 
                Container and is generally always defined -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <!-- JDBC Data Access Library (depends on spring-core, spring-beans, spring-context, 
                spring-tx) Define this if you use Spring's JdbcTemplate API (org.springframework.jdbc.*) -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${org.springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.36</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
            <dependency>
                <groupId>c3p0</groupId>
                <artifactId>c3p0</artifactId>
                <version>0.9.1.2</version>
            </dependency>
    
        </dependencies>
        <build>
            <finalName>demo</finalName>
        </build>
    </project>
    View Code

    bean-properties.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: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-4.3.xsd">
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="user" value="root"></property>
            <property name="password" value="root"></property>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/dlog32"></property>
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        </bean>
    </beans>

    Client.java调用:

    package com.dx.beans.properties;
    
    import javax.sql.DataSource;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Client {
        public static void main(String[] args) throws Exception {
            ApplicationContext cxt = new ClassPathXmlApplicationContext("beans-properties.xml");
            DataSource dataSource = (DataSource) cxt.getBean("dataSource");
            
            System.out.println(dataSource.getConnection());
        }
    }

    使用外部文件之后:

    添加外部文件c3p0-db.properties

    db.user=root
    db.password=root
    db.jdbcUrl=jdbc:mysql://localhost/dlog32
    db.driverClass=com.mysql.jdbc.Driver

    修改spring bean配置文件beans-properties.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: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-4.3.xsd">
        <!-- 导入外部文件 -->
        <context:property-placeholder location="classpath:c3p0-db.properties" />
        
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <!-- 使用外部文件的配置信息替代配置项中的值 -->
            <property name="user" value="${db.user}"></property>
            <property name="password" value="${db.password}"></property>
            <property name="jdbcUrl" value="${db.jdbcUrl}"></property>
            <property name="driverClass" value="${db.driverClass}"></property>
        </bean>
    </beans>
  • 相关阅读:
    关于在windows10中的vmware9.0里面安装的ubuntukylin15.04和windows共享目录的一些反思
    关于最近工程的一些心得
    关于springMVC中component-scan的问题以及springmvc.xml整理
    初学node.js有感三
    初学node.js有感二
    初学node.js有感一
    编译原理——算符优先分析文法(附源代码)
    数据结构与算法系列研究九——排序算法的一些探讨
    LeetCode: Same Tree
    LeetCode: Symmetric Tree
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/9060008.html
Copyright © 2011-2022 走看看