zoukankan      html  css  js  c++  java
  • Spring----内bean和集合属性注入和properties属性注入

    内部bean

     bean里的属性可以赋空值

    先初始化三个Car的bean

        <!-- 定义若干辆车 -->
        <bean id="car1" class="com.entity.Car">
            <property name="brand" value="宝马"/>
            <property name="color" value="白色"/>
        </bean>
        <bean id="car2" class="com.entity.Car">
            <property name="brand" value="奔驰"/>
            <property name="color" value="黑色"/>
        </bean>
        <bean id="car3" class="com.entity.Car">
            <property name="brand" value="路虎"/>
            <property name="color" value="卡其色"/>
        </bean>

    级联属性

    集合属性

    数组

    <array>标签中 不应该是<value>,而是<ref bean="xxx"/>

            <property name="cars">
                <!-- 注入数组类型的属性 -->
                <!-- <array>
                    <ref bean="car1"/>
                    <ref bean="car2"/>
                    <ref bean="car3"/>
                </array> -->
            </property>

    list类型

            <property name="cars">
                <!-- 注入List集合类型的属性 -->
                <list>
                    <ref bean="car1"/>
                    <ref bean="car2"/>
                    <ref bean="car3"/>
                </list>
            </property>

     set集合

    也不是value,而是<ref bean="XXX"/>

            <property name="cars">
                <!-- 注入Set集合类型的属性 -->
                <set>
                    <ref bean="car1"/>
                    <ref bean="car2"/>
                    <ref bean="car3"/>
                </set>
            </property>

     Map类型

            <property name="cars">
                <!-- map -->
                <map>
                    <entry key="c0001" value-ref="car1"/>
                    <entry key="c0002" value-ref="car2"/>
                    <entry key="c0003" value-ref="car3"/>
                </map>
            </property>

    对上面各例 的实现代码:

    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.oracle.dwp</groupId>
      <artifactId>Spring_innerbean</artifactId>
      <version>1.0.0</version>
      
      <dependencies>
          <!-- aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
    
        <!-- 上下文 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
    
        <!-- junit单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    
      </dependencies>
    </project>

    Students.java:

    package com.entity;
    
    import java.io.Serializable;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.Resource;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    
    //加注解注入,起一个别名s1
    //@Component("haha")
    public class Students implements Serializable {
        private String sid;// 学号
        private String name;// 姓名
        private String gender;// 性别
        private Date birthday;// 生日
        private String address;// 住址
    
    //    private Car[] cars;// 学生拥有很多辆车
    //    private List<Car> cars;//集合
    //    private Set<Car> cars;//set集合
        
        private Map<String,Car> cars;//c0001--->BMW   c0002--->BENZ
    
        public Students(String sid, String name, String gender, Date birthday,
                String address, Map<String,Car> cars) {
            super();
            this.sid = sid;
            this.name = name;
            this.gender = gender;
            this.birthday = birthday;
            this.address = address;
            this.cars = cars;
        }
    
        public Students(String sid, String name, String gender, Date birthday,
                String address) {
            super();
            this.sid = sid;
            this.name = name;
            this.gender = gender;
            this.birthday = birthday;
            this.address = address;
        }
    
        public Students(String sid, String name, String gender, String address) {
            this.sid = sid;
            this.name = name;
            this.gender = gender;
            this.address = address;
        }
    
        /*
         * //解决方法1: //在构造方法之后执行一些初始化的操作
         * 
         * @PostConstruct public void init(){ //在调用完构造函数之后,birthday还为null,然后使用这个直接赋值
         * try { this.setBirthday(new
         * SimpleDateFormat("yyyy-MM-dd").parse("2000-05-17")); } catch
         * (ParseException e) { // TODO Auto-generated catch block
         * e.printStackTrace(); } }
         */
    
        public Students() {
        }
    
        public String getSid() {
            return sid;
        }
    
        // @Value("s0006")
        public void setSid(String sid) {
            this.sid = sid;
        }
    
        public String getName() {
            return name;
        }
    
        // @Value("IU")
        public void setName(String name) {
            this.name = name;
        }
    
        public String getGender() {
            return gender;
        }
    
        // @Value("女")
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        // @Value("1998-07-15")
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        public String getAddress() {
            return address;
        }
    
        // @Value("韩国首尔")
        public void setAddress(String address) {
            this.address = address;
        }
    
        public Map<String,Car> getCars() {
            return cars;
        }
    
        public void setCars(Map<String,Car> cars) {
            this.cars = cars;
        }
    
        @Override
        public String toString() {
            return "Students [sid=" + sid + ", name=" + name + ", gender=" + gender
                    + ", birthday=" + birthday + ", address=" + address + ", cars="
                    + cars + "]";
        }
    }

    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:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:cache="http://www.springframework.org/schema/cache"
        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.0.xsd
                          http://www.springframework.org/schema/aop
                          http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                          http://www.springframework.org/schema/context
                          http://www.springframework.org/schema/context/spring-context-4.0.xsd
                          http://www.springframework.org/schema/tx 
                          http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
                          http://www.springframework.org/schema/cache 
                          http://www.springframework.org/schema/cache/spring-cache-4.0.xsd">
        
        <!-- 表示使用注解 -->
        <!-- <context:annotation-config/> -->
        <!-- 扫描带注解的包 -->
        <!-- <context:component-scan base-package="com.entity"/> -->
        
        
        <!-- 实现类型转换的bean -->
        <!-- id的名字必须是这个 -->
        <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
            <property name="propertyEditorRegistrars">
                <list>
                    <bean class="com.convert.MyCustomDateEditorRegister">
                        <property name="format" value="yyyy-MM-dd"></property>
                    </bean>
                </list>
            </property>
        </bean>
        
        
        <bean id="mydevice" class="com.entity.MoveDisk">
            
        </bean>
        
        <bean id="dateFormat" class="java.text.SimpleDateFormat">
            <constructor-arg value="yyyy-MM-dd"/>
        </bean>
        
        <!-- 定义若干辆车 -->
        <bean id="car1" class="com.entity.Car">
            <property name="brand" value="宝马"/>
            <property name="color" value="白色"/>
        </bean>
        <bean id="car2" class="com.entity.Car">
            <property name="brand" value="奔驰"/>
            <property name="color" value="黑色"/>
        </bean>
        <bean id="car3" class="com.entity.Car">
            <property name="brand" value="路虎"/>
            <property name="color" value="卡其色"/>
        </bean>
        
        <!-- 1. 使用property注入属性的值 -->
        <bean name="stu,s1,s2" class="com.entity.Students">
            <property name="sid" value="s001"/>
            <property name="name" value="茜茜"/>
            <property name="birthday">
                <!-- 工厂bean,,,的parse方法将字符串转换成Date类型 -->
                <bean factory-bean="dateFormat" factory-method="parse">
                    <constructor-arg value="1996-06-06"/>
                </bean>
            </property>
            <!-- 人为给属性赋值为null,,标签===如果不写的话,也会默认为null -->
            <property name="address">
                <!-- 向这个属性赋空值 -->
                <null></null>
            </property>
            <!-- 使用内部bean注入属性值 -->
            <!-- <property name="car">
                <bean id="car" class="com.entity.Car">
                    <property name="brand" value="BENZ"/>
                    <property name="color" value="红色"/>
                </bean>
            </property> -->
            <!-- <property name="car" ref="car"/> -->
            <!-- 级联属性:要求car必须初始化 -->
            <!-- <property name="car.brand" value="路虎"/> -->
            
            <property name="cars">
                <!-- 注入数组类型的属性 -->
                <!-- <array>
                    <ref bean="car1"/>
                    <ref bean="car2"/>
                    <ref bean="car3"/>
                </array> -->
                
                <!-- 注入List集合类型的属性 -->
                <!-- <list>
                    <ref bean="car1"/>
                    <ref bean="car2"/>
                    <ref bean="car3"/>
                </list> -->
                
                <!-- 注入Set集合类型的属性 -->
                <!-- <set>
                    <ref bean="car1"/>
                    <ref bean="car2"/>
                    <ref bean="car3"/>
                </set> -->
                
                <!-- map -->
                <map>
                    <entry key="c0001" value-ref="car1"/>
                    <entry key="c0002" value-ref="car2"/>
                    <entry key="c0003" value-ref="car3"/>
                </map>
            </property>
            
        </bean>
        
        <!-- 2. 使用构造方法注入:根据类型和名字匹配,根据次序(下标)匹配 --><!-- 会自动调用Students类的带参数的构造方法,完成实例化 -->
        <!-- 
        <bean name="stu2" class="com.entity.Students">
            <constructor-arg name="sid" type="java.lang.String" value="s004"/>
            <constructor-arg name="name" type="java.lang.String" value="金泰妍"/>
            <constructor-arg name="gender" type="java.lang.String" value="女"/>
            <constructor-arg name="birthday" type="java.util.Date">
                <bean factory-bean="dateFormat" factory-method="parse">
                    <constructor-arg value="1989-03-09"/>
                </bean>
            </constructor-arg>
            <constructor-arg name="address" type="java.lang.String" value="韩国首尔"/>
        </bean>
         -->
         <!-- 不用写name,依次按顺序 -->
         <!-- 或用下标index,从0开始 -->
        <bean name="stu2" class="com.entity.Students">
            <constructor-arg index="0" type="java.lang.String" value="s004"/>
            <constructor-arg index="1" type="java.lang.String" value="金泰妍"/>
            <constructor-arg type="java.lang.String" value="女"/>
            <constructor-arg type="java.util.Date">
                <bean factory-bean="dateFormat" factory-method="parse">
                    <constructor-arg value="1989-03-09"/>
                </bean>
            </constructor-arg>
            <constructor-arg type="java.lang.String" value="韩国釜山"/>
        </bean> 
         
    </beans>

    测试:

    package com.entity;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.AbstractXmlApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    
    public class StudentsTest {
        
        @Test
        public void fun1(){
            //获得上下文对象----类路径下
            //获取磁盘上的文件
            //ApplicationContext ctx=new FileSystemXmlApplicationContext("F:\haha\test.xml");
            ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
            //1.getBean(String id|name);要求id和name都不能重复。
            //Students s = (Students) ctx.getBean("stu2");
            
            //2.getBean(Class clazz);通过类型来加载bean,要求类型必须是唯一的***
            //Students s=ctx.getBean(Students.class);//注意:这里无需类型转换。
            
            //3.getBean(String id|name,Class clazz);
            Students s=ctx.getBean("stu", Students.class);
            
            //4.getBean(String id|name, Object ...) ==>getBean(String id|name, Object[] )
            //调用指定id的指定的构造方法来获得对象。
            
            
            System.out.println(s);    
            
            ((AbstractXmlApplicationContext)ctx).close();//类似流,用完关闭。
        }
    }

     注入properties配置文件中的数据

     

     1.不使用properties文件,在applicationContext.xml文件中。

    这里使用了c3p0,所以要在pom.xml文件中加入其依赖。

          <!-- c3p0 -->
          <dependency>
              <groupId>com.mchange</groupId>
              <artifactId>c3p0</artifactId>
              <version>0.9.5.2</version>
          </dependency>

    applicationContext.xml文件中的

        <!-- 自己写入的数据,注入到定义的MyDBUtils类中的DataSource对象中 -->
        <bean id="dbTools1" class="com.db.MyDBUtils">
            <property name="properties">
                <props>
                    <prop key="username">root</prop>
                    <prop key="password">root</prop>
                    <prop key="driver">com.mysql.jdbc.Driver</prop>
                    <prop key="url">jdbc:mysql:///oa</prop>
                </props> 
            </property>
        </bean>

    编写一个与之对应的Java类,完成prop标签向datasource对象的赋值,然后得到Connection对象,返回它。

    package com.db;
    
    import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class MyDBUtils {
        private Properties properties;
    
        private ComboPooledDataSource ds=new ComboPooledDataSource();//数据源 
        
        public ComboPooledDataSource getDs() {
            return ds;
        }
    
        public void setDs(ComboPooledDataSource ds) {
            this.ds = ds;
        }
    
        public Properties getProperties() {
            return properties;
        }
    
        public void setProperties(Properties properties) {
            this.properties = properties;
            try {
                ds.setDriverClass(this.properties.getProperty("driver"));
            } catch (PropertyVetoException e) {
                e.printStackTrace();
            }
            ds.setJdbcUrl(this.properties.getProperty("url"));
            ds.setUser(this.properties.getProperty("username"));
            ds.setPassword(this.properties.getProperty("password"));
        }
        
        public Connection getConnection() throws SQLException{
            return ds.getConnection();
        }
    }

    测试:

    package com.db;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class DBTest {
        
        @Test
        public void fun1() throws SQLException{
            ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
            MyDBUtils dbTools=(MyDBUtils) ctx.getBean("dbTools1");//已经被赋过值
            Connection conn=dbTools.getConnection();
            System.out.println(conn);
        }
    }

    2.使用dbconfig.properties文件

    dbconfig.properties:

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/oa?rewriteBatchedStatements=true
    username=root
    password=root

    applicationContext.xml:

    直接取配置文件中的值向自定义的MyDBUtils2类中的DataSource对象中的各值赋值

        <!-- 数据源配置文件 -->
        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath*:dbconfig.properties</value>
                </list>
            </property>
        </bean>
    
    
        <bean id="dbTools2" class="com.db.MyDBUtils2">
            <property name="ds.driverClass" value="${driver}"/>
            <property name="ds.jdbcUrl" value="${url}"/>
            <property name="ds.user" value="${username}"/>
            <property name="ds.password" value="${password}"/>
        </bean>

    MyDBUtils2.java:

    package com.db;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class MyDBUtils2 {
    
        private ComboPooledDataSource ds=new ComboPooledDataSource();//数据源 
        
        public ComboPooledDataSource getDs() {
            return ds;
        }
    
        public void setDs(ComboPooledDataSource ds) {
            this.ds = ds;
        }
        
        public Connection getConnection() throws SQLException{
            return ds.getConnection();
        }
    }

    测试:

    package com.db;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class DBTest {
        
        @Test
        public void fun1() throws SQLException{
            ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
            MyDBUtils2 dbTools=(MyDBUtils2) ctx.getBean("dbTools2");
            Connection conn=dbTools.getConnection();
            System.out.println(conn);
        }
    }
  • 相关阅读:
    shared_ptr weak_ptr boost 内存管理
    _vimrc win7 gvim
    qt 拖放
    数学小魔术 斐波那契数列
    qt4 程序 移植到 qt5
    (转)字符串匹配算法总结
    c++11
    BM 字符串匹配
    编译qt5 demo
    c++ 类库 学习资源
  • 原文地址:https://www.cnblogs.com/xjs1874704478/p/11181067.html
Copyright © 2011-2022 走看看